{
  "openapi": "3.1.0",
  "info": {
    "title": "SoftwareFool Customer API",
    "version": "1.25.0",
    "summary": "Submit software-tool jobs and retrieve their results.",
    "description": "API accounts must enroll an authenticator app in website account settings before creating or using bearer keys. Key creation requires recent second-factor verification; API requests use the bearer key alone. Otherwise valid existing keys return generic 401 responses until enrollment is complete. Per-file image validation errors identify the one-based input position; rejected uploads create no job or hold. The v1 customer API uses scoped bearer keys. API jobs share the same SoftwareFool wallet and job history as website jobs. PDF to JPG and PDF to PNG support page selection and bounded resolution, returning an image for one page or a ZIP for multiple pages. Document converters inspect source formats and return grouped conversion warnings before an explicitly acknowledged confirmation."
  },
  "servers": [
    {
      "url": "https://softwarefool.com"
    }
  ],
  "externalDocs": {
    "description": "SoftwareFool API documentation",
    "url": "https://softwarefool.com/developers/api/"
  },
  "tags": [
    {
      "name": "Flows",
      "description": "Build and run reviewed tool sequences."
    },
    {
      "name": "Wallet",
      "description": "Read customer credit totals."
    },
    {
      "name": "Tools",
      "description": "Submit feature-specific jobs."
    },
    {
      "name": "Jobs",
      "description": "Inspect and cancel owned jobs."
    },
    {
      "name": "Results",
      "description": "Retrieve and delete owned outputs."
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/api/v1/tools/document-to-doc/inspect/": {
      "post": {
        "operationId": "inspectDocumentToDoc",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to DOC",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOC. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-doc/quotes/": {
      "post": {
        "operationId": "quoteDocumentToDoc",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to DOC",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOC. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-doc/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToDocQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to DOC",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOC. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-doc/jobs/": {
      "post": {
        "operationId": "submitDocumentToDocJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to DOC",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOC. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-docx/inspect/": {
      "post": {
        "operationId": "inspectDocumentToDocx",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to DOCX",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOCX. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-docx/quotes/": {
      "post": {
        "operationId": "quoteDocumentToDocx",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to DOCX",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOCX. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-docx/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToDocxQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to DOCX",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOCX. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-docx/jobs/": {
      "post": {
        "operationId": "submitDocumentToDocxJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to DOCX",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to DOCX. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-html/inspect/": {
      "post": {
        "operationId": "inspectDocumentToHtml",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to HTML",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to HTML. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-html/quotes/": {
      "post": {
        "operationId": "quoteDocumentToHtml",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to HTML",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to HTML. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-html/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToHtmlQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to HTML",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to HTML. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-html/jobs/": {
      "post": {
        "operationId": "submitDocumentToHtmlJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to HTML",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to HTML. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-md/inspect/": {
      "post": {
        "operationId": "inspectDocumentToMd",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to Markdown",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to Markdown. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-md/quotes/": {
      "post": {
        "operationId": "quoteDocumentToMd",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to Markdown",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to Markdown. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-md/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToMdQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to Markdown",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to Markdown. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-md/jobs/": {
      "post": {
        "operationId": "submitDocumentToMdJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to Markdown",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to Markdown. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-odt/inspect/": {
      "post": {
        "operationId": "inspectDocumentToOdt",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to ODT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to ODT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-odt/quotes/": {
      "post": {
        "operationId": "quoteDocumentToOdt",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to ODT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to ODT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-odt/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToOdtQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to ODT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to ODT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-odt/jobs/": {
      "post": {
        "operationId": "submitDocumentToOdtJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to ODT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to ODT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-pdf/inspect/": {
      "post": {
        "operationId": "inspectDocumentToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to PDF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to PDF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-pdf/quotes/": {
      "post": {
        "operationId": "quoteDocumentToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to PDF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to PDF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-pdf/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToPdfQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to PDF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to PDF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-pdf/jobs/": {
      "post": {
        "operationId": "submitDocumentToPdfJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to PDF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to PDF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-rtf/inspect/": {
      "post": {
        "operationId": "inspectDocumentToRtf",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to RTF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to RTF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-rtf/quotes/": {
      "post": {
        "operationId": "quoteDocumentToRtf",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to RTF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to RTF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-rtf/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToRtfQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to RTF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to RTF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-rtf/jobs/": {
      "post": {
        "operationId": "submitDocumentToRtfJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to RTF",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to RTF. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-txt/inspect/": {
      "post": {
        "operationId": "inspectDocumentToTxt",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Document to TXT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to TXT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-txt/quotes/": {
      "post": {
        "operationId": "quoteDocumentToTxt",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Document to TXT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to TXT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-txt/quotes/confirm/": {
      "post": {
        "operationId": "confirmDocumentToTxtQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Document to TXT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to TXT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/document-to-txt/jobs/": {
      "post": {
        "operationId": "submitDocumentToTxtJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Document to TXT",
        "description": "Convert DOCX, DOC, ODT, RTF, UTF-8 TXT, Markdown or static self-contained HTML to TXT. 1 files, 50 MiB per file, 90 MiB combined; 512 MiB expanded package, 10000 entries, 16 MiB text/XML parts, 16000000 pixels per embedded image and 512 MiB output. No passwords, macros, embedded objects, active HTML or external image resources. TXT/Markdown use explicit interpretation; one source document produces one converted result; Markdown with assets returns a ZIP, HTML embeds images. Inspect first, review grouped warnings and acknowledge them. Already-target files are rejected before any hold. Review and quote expire after 15 minutes. Confirm identical bytes/order with the same Idempotency-Key; an accepted retry remains idempotent after expiry.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON DocumentOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_document, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-csv/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToCsv",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to CSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to CSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-csv/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToCsv",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to CSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to CSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-csv/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToCsvQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to CSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to CSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-csv/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToCsvJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to CSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to CSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-html/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToHtml",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to HTML",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to HTML. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-html/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToHtml",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to HTML",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to HTML. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-html/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToHtmlQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to HTML",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to HTML. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-html/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToHtmlJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to HTML",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to HTML. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-ods/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToOds",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to ODS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to ODS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-ods/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToOds",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to ODS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to ODS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-ods/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToOdsQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to ODS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to ODS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-ods/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToOdsJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to ODS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to ODS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-pdf/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to PDF",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-pdf/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to PDF",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-pdf/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToPdfQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to PDF",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-pdf/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToPdfJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to PDF",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-tsv/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToTsv",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to TSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to TSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-tsv/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToTsv",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to TSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to TSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-tsv/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToTsvQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to TSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to TSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-tsv/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToTsvJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to TSV",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to TSV. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xls/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToXls",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to XLS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xls/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToXls",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to XLS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xls/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToXlsQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to XLS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xls/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToXlsJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to XLS",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLS. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xlsx/inspect/": {
      "post": {
        "operationId": "inspectSpreadsheetToXlsx",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Spreadsheet to XLSX",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLSX. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xlsx/quotes/": {
      "post": {
        "operationId": "quoteSpreadsheetToXlsx",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Spreadsheet to XLSX",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLSX. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SpreadsheetQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpreadsheetQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xlsx/quotes/confirm/": {
      "post": {
        "operationId": "confirmSpreadsheetToXlsxQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Spreadsheet to XLSX",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLSX. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/spreadsheet-to-xlsx/jobs/": {
      "post": {
        "operationId": "submitSpreadsheetToXlsxJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Spreadsheet to XLSX",
        "description": "Export XLSX, XLS, XLSB, ODS or UTF-8 CSV/TSV cached cell data to XLSX. 1 inputs, 50 MiB/file and 90 MiB combined; 2000000 rectangular cells/workbook including blank gaps, 256 worksheets, 1048576 rows/16384 columns per sheet; 32,767 characters/cell. 512 MiB expanded package, 10000 entries, 16 MiB XML/text part, 512 MiB output. Stored formula results become values without recalculation; formatting/charts/workbook logic are removed. Omitting sheets exports all data sheets, including hidden sheets, in workbook order; select unique ascending one-based sheet positions to exclude unwanted sheets. Text exports include each selected sheet and escape formula-like text with an apostrophe. Encoding applies only to CSV/TSV and delimiter only to CSV. XLS rejects inputs over 65,536 rows or 256 columns/sheet before quoting (legacy_dimensions). Encrypted/macro-enabled workbooks, external connections and chart-only sheets are rejected. Inspect first; review ordered formats/warnings and submit acknowledge_risks=true before confirmation. Inspection reserves no credits. Quotes expire after 15 minutes; retry an uncertain confirmation with identical bytes/key/token. One workbook produces one result; multiple CSV/TSV sheets are bundled in one ZIP. XLS readers can round times to milliseconds; use XLSX/ODS for finer timestamps. PDF snapshots paginate columns at normal scale with repeated headings; very long cells fail instead of clipping. Failed/cancelled jobs release holds.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON SpreadsheetOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_spreadsheet, legacy_dimensions, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-odp/inspect/": {
      "post": {
        "operationId": "inspectPresentationToOdp",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Presentation to ODP",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to ODP. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-odp/quotes/": {
      "post": {
        "operationId": "quotePresentationToOdp",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Presentation to ODP",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to ODP. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-odp/quotes/confirm/": {
      "post": {
        "operationId": "confirmPresentationToOdpQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Presentation to ODP",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to ODP. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-odp/jobs/": {
      "post": {
        "operationId": "submitPresentationToOdpJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Presentation to ODP",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to ODP. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pdf/inspect/": {
      "post": {
        "operationId": "inspectPresentationToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Presentation to PDF",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pdf/quotes/": {
      "post": {
        "operationId": "quotePresentationToPdf",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Presentation to PDF",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pdf/quotes/confirm/": {
      "post": {
        "operationId": "confirmPresentationToPdfQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Presentation to PDF",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pdf/jobs/": {
      "post": {
        "operationId": "submitPresentationToPdfJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Presentation to PDF",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PDF. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-ppt/inspect/": {
      "post": {
        "operationId": "inspectPresentationToPpt",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Presentation to PPT",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPT. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results. Legacy PPT uses visible slide pictures at 144 DPI to retain source crop bounds and subtitle colors. Text and shapes are not individually editable or searchable; choose PPTX/ODP for editing. Canvases over 20 inches fit proportionally; dimensions below 1 inch after fitting are refused. Hidden-slide count changes are refused rather than silently omitting slides.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-ppt/quotes/": {
      "post": {
        "operationId": "quotePresentationToPpt",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Presentation to PPT",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPT. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results. Legacy PPT uses visible slide pictures at 144 DPI to retain source crop bounds and subtitle colors. Text and shapes are not individually editable or searchable; choose PPTX/ODP for editing. Canvases over 20 inches fit proportionally; dimensions below 1 inch after fitting are refused. Hidden-slide count changes are refused rather than silently omitting slides.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-ppt/quotes/confirm/": {
      "post": {
        "operationId": "confirmPresentationToPptQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Presentation to PPT",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPT. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results. Legacy PPT uses visible slide pictures at 144 DPI to retain source crop bounds and subtitle colors. Text and shapes are not individually editable or searchable; choose PPTX/ODP for editing. Canvases over 20 inches fit proportionally; dimensions below 1 inch after fitting are refused. Hidden-slide count changes are refused rather than silently omitting slides.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-ppt/jobs/": {
      "post": {
        "operationId": "submitPresentationToPptJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Presentation to PPT",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPT. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results. Legacy PPT uses visible slide pictures at 144 DPI to retain source crop bounds and subtitle colors. Text and shapes are not individually editable or searchable; choose PPTX/ODP for editing. Canvases over 20 inches fit proportionally; dimensions below 1 inch after fitting are refused. Hidden-slide count changes are refused rather than silently omitting slides.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pptx/inspect/": {
      "post": {
        "operationId": "inspectPresentationToPptx",
        "tags": [
          "Tools"
        ],
        "summary": "Inspect Presentation to PPTX",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPTX. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationReviewOptions; default {}."
                  }
                },
                "required": [
                  "files"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationReviewResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pptx/quotes/": {
      "post": {
        "operationId": "quotePresentationToPptx",
        "tags": [
          "Tools"
        ],
        "summary": "Quote Presentation to PPTX",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPTX. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresentationQuoteManifest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresentationQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pptx/quotes/confirm/": {
      "post": {
        "operationId": "confirmPresentationToPptxQuote",
        "tags": [
          "Tools"
        ],
        "summary": "Confirm Presentation to PPTX",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPTX. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_token",
                  "acknowledge_risks"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/presentation-to-pptx/jobs/": {
      "post": {
        "operationId": "submitPresentationToPptxJob",
        "tags": [
          "Tools"
        ],
        "summary": "Submit Presentation to PPTX",
        "description": "Convert PPTX, PPT/PPS/POT, ODP, PPSX, POTX or OTP to PPTX. 1 inputs, 50 MiB/file and 90 MiB combined; 1000 slides and 100000 shapes/structural elements per presentation; 512 MiB expanded package, 10000 entries, 16 MiB XML part, 16000000 pixels per embedded raster image, 512 MiB output. Fonts, layout, animations, transitions, notes and hidden-slide state can change. PDF is static and may omit hidden slides. Macros, protection, objects, audio/video and external resources are unsupported. Export Keynote/online slides to PPTX first. Legacy PPT/PPS/POT share binary format detection and are reported as ppt. Standard slideshow/template inputs become ordinary presentations. Inspect first; review ordered formats/warnings and explicitly acknowledge_risks=true. Same-format inputs block conversion before charging. Inspection reserves no credits. Reviews/quotes expire after 15 minutes; retry uncertain confirmation with identical bytes/key/token. One presentation produces one converted file. Failed/cancelled jobs release holds. Keep originals and verify results.",
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "Ordered files; each at most 52428800 bytes, combined at most 94371840 bytes."
                  },
                  "review_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON PresentationOptions; acknowledge_risks must be true."
                  }
                },
                "required": [
                  "files",
                  "review_token",
                  "parameters"
                ]
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_request, invalid_presentation, invalid_file_count, invalid_parameters, invalid_manifest, invalid_review, invalid_quote, already_target, risk_acknowledgement_required or invalid_expected_credits.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "description": "review_expired, review_mismatch, quote_expired, quote_mismatch, task_cost_changed, insufficient_credits, idempotency_conflict or job_limit_reached.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "201": {
            "description": "Customer-scoped result. Inspection/quotes reserve no credits.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "Customer-scoped job status URL.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/flows/tools/": {
      "get": {
        "operationId": "listFlowTools",
        "summary": "listFlowTools",
        "description": "Reviewed tool defaults, output types and server-owned limits. Converters must be last; Compare joins exactly two PDF lanes into one.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "slug": {
                            "type": "string",
                            "enum": [
                              "flatten-pdf",
                              "compress-pdf",
                              "repair-pdf",
                              "ocr-pdf",
                              "rotate-pdf",
                              "crop-pdf",
                              "page-numbers-pdf",
                              "compare-pdf",
                              "pdf-to-jpg",
                              "pdf-to-png",
                              "pdf-to-docx",
                              "pdf-to-xlsx",
                              "pdf-to-pptx"
                            ]
                          },
                          "name": {
                            "type": "string"
                          },
                          "parameters": {
                            "type": "object"
                          },
                          "output": {
                            "type": "string"
                          },
                          "max_input_bytes": {
                            "type": "integer",
                            "minimum": 1
                          }
                        },
                        "required": [
                          "slug",
                          "name",
                          "parameters",
                          "output",
                          "max_input_bytes"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "limits": {
                      "type": "object",
                      "properties": {
                        "max_steps": {
                          "const": 10
                        },
                        "max_jobs": {
                          "const": 20
                        },
                        "input_counts": {
                          "const": [
                            1,
                            2
                          ]
                        }
                      },
                      "required": [
                        "max_steps",
                        "max_jobs",
                        "input_counts"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "limits"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/flows/": {
      "get": {
        "operationId": "listFlows",
        "summary": "listFlows",
        "description": "",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            },
            "description": "Twenty accessible saved flows per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "maxItems": 20,
                      "items": {
                        "$ref": "#/components/schemas/Flow"
                      }
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "page": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "pages": {
                          "type": "integer",
                          "minimum": 1
                        },
                        "page_size": {
                          "const": 20
                        },
                        "total": {
                          "type": "integer",
                          "minimum": 0
                        }
                      },
                      "required": [
                        "page",
                        "pages",
                        "page_size",
                        "total"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      },
      "post": {
        "operationId": "saveFlow",
        "summary": "saveFlow",
        "description": "Save a private flow. At most 100 private saved flows per account; only reviewed tools and typed linear connections are accepted.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Flow"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Flow"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowSaveRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 131072
      }
    },
    "/api/v1/flows/{flow_id}/": {
      "get": {
        "operationId": "getFlow",
        "summary": "getFlow",
        "description": "",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Flow"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      },
      "post": {
        "operationId": "versionFlow",
        "summary": "versionFlow",
        "description": "Create an immutable version of your own saved flow. Accepted runs retain their earlier versions.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Flow"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowSaveRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 131072
      }
    },
    "/api/v1/flows/{flow_id}/quotes/": {
      "post": {
        "operationId": "quoteFlow",
        "summary": "quoteFlow",
        "description": "Quote ordered PDF sizes/hashes without uploading or reserving credits. Quotes expire after 15 minutes. Estimate may differ from actual intermediate sizes; maximum is the approved spending ceiling. Flatten \u2192 Compare allocates 1 credit to each Flatten and the remaining current Compare price to comparison, preserving the total. Each job retains a one-credit minimum.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "description": "One customer-wide request identity; reserve the flow: prefix for the server. Reuse for an uncertain submission."
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowQuote"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowQuoteRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 131072
      }
    },
    "/api/v1/flows/{flow_id}/runs/": {
      "post": {
        "operationId": "startFlow",
        "summary": "startFlow",
        "description": "Confirm the quoted maximum and partial-charge/file-retention risks. Queue only ready jobs. Successful jobs are charged even if a later step fails; failed/cancelled reservations release and unstarted jobs cost nothing. Holds are placed as jobs queue; insufficient credits pause later steps. Runs share the 20-outstanding/two-running customer limit and four global slots. Retry the same identity/quote/files after uncertain responses, including after quote expiry if already accepted. Results are accessed through each owned step job's existing results endpoints and require results:read.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "flow_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "description": "One customer-wide request identity; reserve the flow: prefix for the server. Reuse for an uncertain submission."
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowRun"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "created": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "created"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowRun"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "created": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "created"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_id": {
                    "type": "string",
                    "format": "uuid"
                  },
                  "confirmed_credits": {
                    "type": "integer",
                    "minimum": 1
                  },
                  "acknowledge_risks": {
                    "type": "string",
                    "const": "true"
                  }
                },
                "required": [
                  "files",
                  "quote_id",
                  "confirmed_credits",
                  "acknowledge_risks"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-max-body-bytes": 211812352
      }
    },
    "/api/v1/flows/runs/{run_id}/": {
      "get": {
        "operationId": "getFlowRun",
        "summary": "getFlowRun",
        "description": "",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "run_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowRun"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/flows/runs/{run_id}/cancel/": {
      "post": {
        "operationId": "cancelFlowRun",
        "summary": "cancelFlowRun",
        "description": "Cancel unstarted/queued work and request safe termination of running jobs. Completed jobs remain charged; running reservations release after termination.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:cancel",
        "parameters": [
          {
            "name": "run_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowRun"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/flows/runs/{run_id}/resume/": {
      "post": {
        "operationId": "resumeFlowRun",
        "summary": "resumeFlowRun",
        "description": "Explicitly resume a failed or paused owned run within its original budget and price snapshots. Requires available retained inputs; expired/deleted required files need a fresh upload and quote. Completed jobs never repeat; failed jobs receive fresh IDs and retain old accounting/history. Reusing a resume identity does not schedule another retry after a subsequent failure.",
        "tags": [
          "Flows"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "run_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "description": "One customer-wide request identity; reserve the flow: prefix for the server. Reuse for an uncertain submission."
          }
        ],
        "responses": {
          "200": {
            "description": "Owned flow data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/FlowRun"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowResumeRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 131072
      }
    },
    "/api/v1/uploads/{upload_id}/": {
      "delete": {
        "operationId": "deletePreparedUpload",
        "summary": "deletePreparedUpload",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "results:delete",
        "parameters": [
          {
            "name": "upload_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "format": "uuid"
                        },
                        "status": {
                          "const": "deleted"
                        }
                      },
                      "required": [
                        "id",
                        "status"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "description": "Revoke an owned prepared upload immediately and retry physical removal through maintenance. Existing accepted job copies retain their own lifecycle. Repeated deletion is idempotent."
      }
    },
    "/api/v1/uploads/": {
      "post": {
        "operationId": "prepareUploads",
        "summary": "prepareUploads",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [],
        "responses": {
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PreparedUpload"
                      }
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "description": "Unbilled synchronous Upload and Clean first-stage jobs. Send repeated files fields; contents determine format. Unsubmitted handles expire after 24 hours and are owned by the authenticated customer. Acceptance consumes them and removes staging copies after committed job input copies exist. Limits use the shared image upload policy. All ordinary tool uploads also pass this stage automatically; no separate preparation call is required for existing endpoints.",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                },
                "required": [
                  "files"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "x-max-file-bytes": 52428800,
        "x-max-total-bytes": 94371840,
        "x-max-body-bytes": 98516992
      }
    },
    "/api/v1/tools/image-converter/quotes/": {
      "post": {
        "operationId": "quoteImageBatch",
        "summary": "quoteImageBatch",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "description": "Reuse the same identity and quote after an uncertain response."
          }
        ],
        "responses": {
          "200": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ImageBatchQuote"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageBatchQuoteRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 259072,
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "description": "Also requires wallet:read. Quote exact prepared image bytes using existing destination tariffs, once per image. No hold until confirmation. One common output format; quote expires after 15 minutes. PDF destination produces a separate PDF per image. Shared outstanding limits apply."
      }
    },
    "/api/v1/tools/image-converter/jobs/": {
      "post": {
        "operationId": "submitImageBatch",
        "summary": "submitImageBatch",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "description": "Reuse the same identity and quote after an uncertain response."
          }
        ],
        "responses": {
          "200": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ImageBatch"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "created": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "created"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ImageBatch"
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "created": {
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "created"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "data",
                    "meta"
                  ],
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageBatchSubmitRequest"
              }
            }
          }
        },
        "x-max-body-bytes": 259072,
        "description": "Atomically confirm the quote and reserve each child job. Two jobs per customer and four server-wide may run at once. Failure releases that job hold; successful jobs remain charged. Identical replay returns the same batch; changed input or prices require a new quote."
      }
    },
    "/api/v1/tools/image-converter/batches/{batch_id}/": {
      "get": {
        "operationId": "getImageBatch",
        "summary": "getImageBatch",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "batch_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Owner-scoped data.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ImageBatch"
                    }
                  },
                  "required": [
                    "data"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/tools/image-converter/batches/{batch_id}/download/": {
      "get": {
        "operationId": "downloadImageBatch",
        "summary": "downloadImageBatch",
        "tags": [
          "Uploads and image batches"
        ],
        "x-required-scope": "results:read",
        "parameters": [
          {
            "name": "batch_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One converted file, or an ordered ZIP for multiple images. All outputs must remain available. Collection retries do not charge or reconvert files. Use ordinary job endpoints for partial results, cancellation and deletion.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/webp": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/avif": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/tiff": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/bmp": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/gif": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/x-icon": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/zip": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "description": "Customer-safe error. Upload checks can reject malformed, active-content or unsupported files; cleaning never certifies safety.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/tools/merge-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Use the same account-wide key for the quote and its confirmation. Retain the key and identical ordered files when retrying an uncertain confirmation.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteMergePdf",
        "summary": "Quote a Merge PDF task without uploading files",
        "description": "Requires both jobs:submit and wallet:read. Send an ordered manifest of local file sizes and SHA-256 hashes with empty parameters. Returns a 15-minute quote and current wallet snapshot; creates no job, uploads no file content, and reserves no credits. Affordability is checked again at confirmation. PDF validity and page limits are checked during processing after confirmation. The JSON body may not exceed 262,144 bytes. The independent 1024-file multipart parser safety ceiling is not an account quota. No fixed page-count limit applies. Merged output is limited to 128 MiB. Complexity and worker resource limits still apply; a failed job does not consume credits.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 262144,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MergePdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_manifest or invalid_request: correct the ordered manifest or idempotency key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "200": {
            "description": "The quote, affordability, and current wallet; no credits reserved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MergePdfQuoteResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "413": {
            "description": "request_too_large: the JSON manifest exceeds 262,144 bytes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/merge-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Use the same account-wide key for the quote and its confirmation. Retain the key and identical ordered files when retrying an uncertain confirmation.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmMergePdfQuote",
        "summary": "Confirm a quote and upload its ordered PDFs",
        "description": "Requires both jobs:submit and wallet:read. Send the quote token and unchanged files in the quoted order with the same Idempotency-Key. A valid confirmation creates a job and reserves its quoted credits. A changed task cost, expired unconfirmed quote, or mismatched files is rejected. Repeat an uncertain confirmation with the same token, key, and files to recover the original job without creating another charge. An already accepted replay remains valid after quote expiry or a price change. Successful completion spends the reservation; final failure or cancellation releases it.",
        "x-rate-limit-category": "submit",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "quote_token",
                  "files"
                ],
                "properties": {
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 524288
                  },
                  "files": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 1024,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    },
                    "description": "The unchanged PDFs in the quoted order. The independent 1024-file multipart parser safety ceiling is not an account quota. No fixed page-count limit applies. Merged output is limited to 128 MiB. Complexity and worker resource limits still apply; a failed job does not consume credits."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "description": "invalid_quote, invalid_request, or a file validation error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "405": {
            "description": "method_not_allowed: this endpoint accepts POST only.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "example": "POST"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "201": {
            "description": "A new job was accepted and credits were reserved; includes current wallet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "The accepted job endpoint.",
                "schema": {
                  "type": "string",
                  "format": "uri-reference"
                }
              }
            }
          },
          "200": {
            "description": "An idempotent retry returned the original job and current wallet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              },
              "Location": {
                "description": "The original job endpoint.",
                "schema": {
                  "type": "string",
                  "format": "uri-reference"
                }
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "409": {
            "description": "quote_mismatch, quote_expired, task_cost_changed, insufficient_credits, job_limit_reached, or idempotency_conflict. Review the error before retrying.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/split-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Use the same account-wide key for the quote and confirmation.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteSplitPdf",
        "summary": "Quote a Split PDF task without uploading the source file",
        "description": "Send one source PDF's byte size and SHA-256 hash with a pages or ranges selection. A quote reserves no credits and does not verify the PDF's structure or actual page count. Both jobs:submit and wallet:read scopes are required.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SplitPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "The quote and current wallet; no credits reserved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SplitPdfQuoteResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/split-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "Use the same account-wide key for the quote and confirmation.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmSplitPdfQuote",
        "summary": "Confirm a Split PDF quote and upload its source PDF",
        "description": "Submit the unchanged source file, quote token, and original Idempotency-Key. The token binds the selected mode and ranges. A new job reserves the quoted credits; final failure or cancellation releases them. Repeat an uncertain confirmation unchanged to recover the original job. Both jobs:submit and wallet:read scopes are required.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "quote_token",
                  "files"
                ],
                "properties": {
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  },
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "A new job was accepted and credits reserved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "200": {
            "description": "An idempotent retry returned the original job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/split-pdf/jobs/": {
      "post": {
        "operationId": "submitSplitPdfJob",
        "summary": "Submit one PDF to split directly",
        "description": "Upload one source PDF, choose one PDF per page or selected page ranges, and confirm the size-based cost. The result is one private ZIP. Ranges may leave gaps but must be ascending and nonoverlapping. The source page count is checked in the isolated worker.",
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "mode"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "pages",
                      "ranges"
                    ]
                  },
                  "ranges": {
                    "type": "string",
                    "maxLength": 16000,
                    "description": "Required for range mode; e.g. 1-3,5,8-10. Leave empty in pages mode."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "A new Split PDF job was accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "200": {
            "description": "An idempotent retry returned the original job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/tools/extract-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteExtractPdf",
        "summary": "Quote a Extract Pages task without uploading files",
        "description": "Keep the selected pages in their original order in one PDF. Gaps are allowed. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExtractPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExtractPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/extract-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmExtractPdfQuote",
        "summary": "Confirm a Extract Pages quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/extract-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitExtractPdfJob",
        "summary": "Submit a Extract Pages job directly",
        "description": "Keep the selected pages in their original order in one PDF. Gaps are allowed. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "ranges"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "ranges": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16000,
                    "description": "Inclusive ascending nonoverlapping ranges, for example 1-3,5."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/remove-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRemovePdf",
        "summary": "Quote a Remove Pages task without uploading files",
        "description": "Discard the selected pages and return one PDF of retained pages. At least one page must remain. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemovePdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RemovePdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/remove-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRemovePdfQuote",
        "summary": "Confirm a Remove Pages quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/remove-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRemovePdfJob",
        "summary": "Submit a Remove Pages job directly",
        "description": "Discard the selected pages and return one PDF of retained pages. At least one page must remain. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "ranges"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "ranges": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16000,
                    "description": "Inclusive ascending nonoverlapping ranges to discard, for example 2,4-6."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/organize-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteOrganizePdf",
        "summary": "Quote a Organize PDF task without uploading files",
        "description": "Reorder, omit, and rotate source PDF pages; return one PDF. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrganizePdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizePdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/organize-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmOrganizePdfQuote",
        "summary": "Confirm a Organize PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/organize-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitOrganizePdfJob",
        "summary": "Submit a Organize PDF job directly",
        "description": "Reorder, omit, and rotate source PDF pages; return one PDF. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "order": {
                    "type": "string",
                    "maxLength": 16000,
                    "description": "Optional source page order, for example 1-3,6,5,4. Omitted pages are removed; blank keeps all."
                  },
                  "rotations": {
                    "type": "string",
                    "maxLength": 16000,
                    "description": "Optional source-page rotations, for example 2:right,4:left,5:flip."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/scan-to-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteScanPdf",
        "summary": "Quote a Scan to PDF task without uploading files",
        "description": "Convert ordered JPEG, PNG, or WebP photos/scans into one PDF. The technical limit is 100 images and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 100 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScanPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScanPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/scan-to-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmScanPdfQuote",
        "summary": "Confirm a Scan to PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/scan-to-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitScanPdfJob",
        "summary": "Submit a Scan to PDF job directly",
        "description": "Convert ordered JPEG, PNG, or WebP photos/scans into one PDF. The technical limit is 100 images and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 100,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "Optional JSON object matching the quote parameters schema; omitted uses defaults."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteCompressPdf",
        "summary": "Quote a Compress PDF task without uploading files",
        "description": "Optimize one unsigned PDF. A job that cannot reduce its size releases its reserved credits. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompressPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompressPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmCompressPdfQuote",
        "summary": "Confirm a Compress PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitCompressPdfJob",
        "summary": "Submit a Compress PDF job directly",
        "description": "Optimize one unsigned PDF. A job that cannot reduce its size releases its reserved credits. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "mode"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "lossless",
                      "balanced"
                    ],
                    "description": "Lossless optimization or balanced image recompression."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/repair-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRepairPdf",
        "summary": "Quote a Repair PDF task without uploading files",
        "description": "Attempt best-effort structural repair of one damaged, unsigned PDF. Recovery is not guaranteed. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RepairPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RepairPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/repair-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRepairPdfQuote",
        "summary": "Confirm a Repair PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/repair-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRepairPdfJob",
        "summary": "Submit a Repair PDF job directly",
        "description": "Attempt best-effort structural repair of one damaged, unsigned PDF. Recovery is not guaranteed. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 4
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ocr-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteOcrPdf",
        "summary": "Quote a OCR PDF task without uploading files",
        "description": "Make scanned printed English, French, Spanish or German text in one unsigned PDF searchable using an installed language choice. Handwriting and other languages are not supported; proofread poor scans. This includes scans beside digital text. Embedded attachments are excluded from the result; the original upload is unchanged. Existing digital text is preserved; a result with no new searchable text releases its reserved credits. The technical limit is 50 source PDF pages and 10485760 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OcrPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OcrPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ocr-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmOcrPdfQuote",
        "summary": "Confirm a OCR PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 12582912,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/ocr-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitOcrPdfJob",
        "summary": "Submit a OCR PDF job directly",
        "description": "Make scanned printed English, French, Spanish or German text in one unsigned PDF searchable using an installed language choice. Handwriting and other languages are not supported; proofread poor scans. This includes scans beside digital text. Embedded attachments are excluded from the result; the original upload is unchanged. Existing digital text is preserved; a result with no new searchable text releases its reserved credits. The technical limit is 50 source PDF pages and 10485760 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 12582912,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 20
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "Optional JSON object matching the quote parameters schema; omitted uses defaults."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRotatePdf",
        "summary": "Quote a Rotate PDF task without uploading files",
        "description": "Rotate selected PDF pages clockwise without rasterizing. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RotatePdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotatePdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRotatePdfQuote",
        "summary": "Confirm a Rotate PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRotatePdfJob",
        "summary": "Submit a Rotate PDF job directly",
        "description": "Rotate selected PDF pages clockwise without rasterizing. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "degrees"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "ranges": {
                    "type": "string",
                    "description": "Optional pages, e.g. 1-3,5; blank means all."
                  },
                  "degrees": {
                    "type": "integer",
                    "enum": [
                      90,
                      180,
                      270
                    ]
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteCropPdf",
        "summary": "Quote a Crop PDF task without uploading files",
        "description": "Set four whole-percentage crop margins, or send mode=auto with optional padding (0\u201372 PDF points, default 6) to detect boundaries independently on selected pages. Manual margins are required unless mode=auto. Blank or uncertain-background pages stay unchanged. Cropping hides content; it does not erase it. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CropPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CropPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmCropPdfQuote",
        "summary": "Confirm a Crop PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitCropPdfJob",
        "summary": "Submit a Crop PDF job directly",
        "description": "Set four whole-percentage crop margins, or send mode=auto with optional padding (0\u201372 PDF points, default 6) to detect boundaries independently on selected pages. Manual margins are required unless mode=auto. Blank or uncertain-background pages stay unchanged. Cropping hides content; it does not erase it. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "ranges": {
                    "type": "string",
                    "description": "Optional pages; blank means all."
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "manual",
                      "auto"
                    ],
                    "default": "manual"
                  },
                  "padding": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 72,
                    "default": 6
                  },
                  "left": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 95
                  },
                  "right": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 95
                  },
                  "top": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 95
                  },
                  "bottom": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 95
                  }
                },
                "oneOf": [
                  {
                    "required": [
                      "left",
                      "right",
                      "top",
                      "bottom"
                    ],
                    "properties": {
                      "mode": {
                        "const": "manual"
                      }
                    }
                  },
                  {
                    "required": [
                      "mode"
                    ],
                    "properties": {
                      "mode": {
                        "const": "auto"
                      }
                    }
                  }
                ]
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page-numbers-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePageNumbersPdf",
        "summary": "Quote a Add Page Numbers task without uploading files",
        "description": "Print styled numbers or Page X of Y labels; preserve ordinary forms, comments and links. Unlock encrypted inputs first. Signatures, scripts, attachments and dynamic XFA forms are unsupported. Roman numbers must stay within 1\u20133999; letters and ordinals start at 1. Font minimum cannot exceed font size; labels must fit the visible page. Restart requires selected-page numbering. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PageNumbersPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageNumbersPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page-numbers-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPageNumbersPdfQuote",
        "summary": "Confirm a Add Page Numbers quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/page-numbers-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPageNumbersPdfJob",
        "summary": "Submit a Add Page Numbers job directly",
        "description": "Print styled numbers or Page X of Y labels; preserve ordinary forms, comments and links. Unlock encrypted inputs first. Signatures, scripts, attachments and dynamic XFA forms are unsupported. Roman numbers must stay within 1\u20133999; letters and ordinals start at 1. Font minimum cannot exceed font size; labels must fit the visible page. Restart requires selected-page numbering. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "start",
                  "position",
                  "style"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "ranges": {
                    "type": "string",
                    "description": "Optional pages; blank means all."
                  },
                  "start": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 999999
                  },
                  "position": {
                    "type": "string",
                    "enum": [
                      "top-left",
                      "top-center",
                      "top-right",
                      "bottom-left",
                      "bottom-center",
                      "bottom-right"
                    ]
                  },
                  "style": {
                    "type": "string",
                    "enum": [
                      "decimal",
                      "decimal-leading",
                      "roman",
                      "roman-lower",
                      "letters",
                      "letters-lower",
                      "ordinal"
                    ]
                  },
                  "format": {
                    "type": "string",
                    "enum": [
                      "number",
                      "page-number",
                      "x-of-y",
                      "page-x-of-y",
                      "dash",
                      "brackets",
                      "custom"
                    ],
                    "default": "number"
                  },
                  "font": {
                    "type": "string",
                    "enum": [
                      "helvetica",
                      "times",
                      "courier"
                    ],
                    "default": "helvetica"
                  },
                  "parity": {
                    "type": "string",
                    "enum": [
                      "all",
                      "odd",
                      "even"
                    ],
                    "default": "all"
                  },
                  "numbering": {
                    "type": "string",
                    "enum": [
                      "selected",
                      "document"
                    ],
                    "default": "selected"
                  },
                  "total": {
                    "type": "string",
                    "enum": [
                      "document",
                      "selected"
                    ],
                    "default": "document"
                  },
                  "font_size": {
                    "type": "integer",
                    "minimum": 4,
                    "maximum": 72,
                    "default": 10
                  },
                  "min_font_size": {
                    "type": "integer",
                    "minimum": 4,
                    "maximum": 72,
                    "default": 6
                  },
                  "margin_x": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 144,
                    "default": 24
                  },
                  "margin_y": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 144,
                    "default": 24
                  },
                  "auto_fit": {
                    "type": "boolean",
                    "default": true
                  },
                  "bold": {
                    "type": "boolean",
                    "default": false
                  },
                  "italic": {
                    "type": "boolean",
                    "default": false
                  },
                  "mirror": {
                    "type": "boolean",
                    "default": false
                  },
                  "restart": {
                    "type": "boolean",
                    "default": false
                  },
                  "skip_first": {
                    "type": "boolean",
                    "default": false
                  },
                  "underline": {
                    "type": "boolean",
                    "default": false
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$",
                    "default": "#000000"
                  },
                  "template": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 120,
                    "default": "Page {page} of {total}",
                    "description": "Printable ASCII; {page} is required in custom format. {total} uses total scope; {index}/{pages} use physical page/count. No format specs or conversions."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteWatermarkPdf",
        "summary": "Quote a Add Watermark task without uploading files",
        "description": "Stamp text or a PNG/JPEG/SVG image once or repeatedly onto selected PDF pages. Position applies only to single placement. For image mode, upload the PDF first and an image up to 5 MiB second. SVG must be self-contained vector artwork; no scripts, animations, embedded images or external resources. SVG is rasterized with transparency within the image pixel limit. The technical limit is 100 source PDF pages and 26214400 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 2 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WatermarkPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatermarkPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmWatermarkPdfQuote",
        "summary": "Confirm a Add Watermark quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 28311552,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitWatermarkPdfJob",
        "summary": "Submit a Add Watermark job directly",
        "description": "Stamp text or a PNG/JPEG/SVG image once or repeatedly onto selected PDF pages. Position applies only to single placement. For image mode, upload the PDF first and an image up to 5 MiB second. SVG must be self-contained vector artwork; no scripts, animations, embedded images or external resources. SVG is rasterized with transparency within the image pixel limit. The technical limit is 100 source PDF pages and 26214400 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 28311552,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "kind",
                  "position",
                  "opacity",
                  "rotation",
                  "layer"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "text",
                      "image"
                    ]
                  },
                  "text": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "position": {
                    "type": "string",
                    "enum": [
                      "center",
                      "top-left",
                      "top-right",
                      "bottom-left",
                      "bottom-right"
                    ]
                  },
                  "opacity": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100
                  },
                  "rotation": {
                    "type": "integer",
                    "minimum": -90,
                    "maximum": 90
                  },
                  "layer": {
                    "type": "string",
                    "enum": [
                      "over",
                      "under"
                    ]
                  },
                  "pages": {
                    "type": "string",
                    "description": "Optional pages such as 1-3,5; blank means all."
                  },
                  "repeat": {
                    "type": "boolean",
                    "default": false
                  },
                  "repeat_spacing": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 144,
                    "default": 36,
                    "description": "Gap between rotated tiles in PDF points; used only for repeat."
                  },
                  "repeat_scale": {
                    "type": "integer",
                    "minimum": 25,
                    "maximum": 200,
                    "default": 100,
                    "description": "Repeated watermark size as a percentage of the default tile size."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRedactPdf",
        "summary": "Quote a Redact PDF task without uploading files",
        "description": "Permanently remove selected visible regions by rasterizing every page. Output loses selectable text, links and forms. The technical limit is 20 source PDF pages and 10485760 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedactPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RedactPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRedactPdfQuote",
        "summary": "Confirm a Redact PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 12582912,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRedactPdfJob",
        "summary": "Submit a Redact PDF job directly",
        "description": "Permanently remove selected visible regions by rasterizing every page. Output loses selectable text, links and forms. The technical limit is 20 source PDF pages and 10485760 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 12582912,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 8
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "rectangles"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "rectangles": {
                    "type": "string",
                    "description": "One page,left%,top%,width%,height% area per line."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/unlock-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteUnlockPdf",
        "summary": "Quote a Unlock PDF task without uploading files",
        "description": "Remove an open password you supply. Password guessing is not performed. Signed PDFs are rejected. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnlockPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnlockPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/unlock-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmUnlockPdfQuote",
        "summary": "Confirm a Unlock PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token",
                  "pdf_password"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  },
                  "pdf_password": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 127,
                    "format": "password"
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/unlock-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitUnlockPdfJob",
        "summary": "Submit a Unlock PDF job directly",
        "description": "Remove an open password you supply. Password guessing is not performed. Signed PDFs are rejected. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "pdf_password"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "pdf_password": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 127,
                    "format": "password"
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/protect-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteProtectPdf",
        "summary": "Quote a Protect PDF task without uploading files",
        "description": "Encrypt an unsigned PDF with a supplied open password using AES-256. PDF permissions are not a substitute for access control. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProtectPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProtectPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/protect-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmProtectPdfQuote",
        "summary": "Confirm a Protect PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token",
                  "pdf_password"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  },
                  "pdf_password": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 127,
                    "format": "password"
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/protect-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitProtectPdfJob",
        "summary": "Submit a Protect PDF job directly",
        "description": "Encrypt an unsigned PDF with a supplied open password using AES-256. PDF permissions are not a substitute for access control. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "pdf_password"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "pdf_password": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 127,
                    "format": "password"
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/edit-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteEditPdf",
        "summary": "Quote a Edit PDF task without uploading files",
        "description": "Add text, rectangles, or highlights to a static unsigned PDF. Existing content remains underneath overlays. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EditPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/edit-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmEditPdfQuote",
        "summary": "Confirm a Edit PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/edit-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitEditPdfJob",
        "summary": "Submit a Edit PDF job directly",
        "description": "Add text, rectangles, or highlights to a static unsigned PDF. Existing content remains underneath overlays. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/forms-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteFormsPdf",
        "summary": "Quote a PDF Forms task without uploading files",
        "description": "Add fillable text and checkbox fields to a static unsigned PDF. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormsPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormsPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/forms-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmFormsPdfQuote",
        "summary": "Confirm a PDF Forms quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/forms-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitFormsPdfJob",
        "summary": "Submit a PDF Forms job directly",
        "description": "Add fillable text and checkbox fields to a static unsigned PDF. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 4
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sign-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteSignPdf",
        "summary": "Quote a Sign PDF task without uploading files",
        "description": "Add a visible typed personal signature. This is not a certificate-based digital signature or identity verification. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SignPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SignPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sign-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmSignPdfQuote",
        "summary": "Confirm a Sign PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/sign-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitSignPdfJob",
        "summary": "Submit a Sign PDF job directly",
        "description": "Add a visible typed personal signature. This is not a certificate-based digital signature or identity verification. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/flatten-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteFlattenPdf",
        "summary": "Quote a Flatten PDF task without uploading files",
        "description": "Convert supported visible form-field and annotation appearances into static page content while preserving existing text and vectors. Removes links and interactive controls; popup comment text is not included. Encrypted, signed, active-content, and dynamic XFA PDFs are unsupported. A missing or unsupported appearance fails without charging. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlattenPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FlattenPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/flatten-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmFlattenPdfQuote",
        "summary": "Confirm a Flatten PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/flatten-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitFlattenPdfJob",
        "summary": "Submit a Flatten PDF job directly",
        "description": "Convert supported visible form-field and annotation appearances into static page content while preserving existing text and vectors. Removes links and interactive controls; popup comment text is not included. Encrypted, signed, active-content, and dynamic XFA PDFs are unsupported. A missing or unsupported appearance fails without charging. The technical limit is 500 source PDF pages and 104857600 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 106954752,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-docx/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePdfToDocx",
        "summary": "Quote a PDF to DOCX task without uploading files",
        "description": "Default text mode exports selected PDF text and detected ruled tables to editable Word paragraphs and tables. Layout is approximate; graphics, font styling and comments are not reproduced. Source page breaks remain. Scans require OCR first. Fields and non-link annotations require flattening first in text mode. Optional image mode embeds rendered visible pages at 72/150/300 DPI; appearance is retained with narrow white margins, but text and graphics are not individually editable or searchable. One application/vnd.openxmlformats-officedocument.wordprocessingml.document result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PdfToDocxQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PdfToDocxQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-docx/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPdfToDocxQuote",
        "summary": "Confirm a PDF to DOCX quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-docx/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPdfToDocxJob",
        "summary": "Submit a PDF to DOCX job directly",
        "description": "Default text mode exports selected PDF text and detected ruled tables to editable Word paragraphs and tables. Layout is approximate; graphics, font styling and comments are not reproduced. Source page breaks remain. Scans require OCR first. Fields and non-link annotations require flattening first in text mode. Optional image mode embeds rendered visible pages at 72/150/300 DPI; appearance is retained with narrow white margins, but text and graphics are not individually editable or searchable. One application/vnd.openxmlformats-officedocument.wordprocessingml.document result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-xlsx/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePdfToXlsx",
        "summary": "Quote a PDF to XLSX task without uploading files",
        "description": "Extract tables using ruled-lines or aligned-text detection. Each detected table gets a worksheet named PageNNNN_TableNNN. Cells remain literal strings including numbers/dates; formulas, automatic hyperlinks, graphics and prose are not exported. Review the extracted cells. Scans require OCR first; fields and non-link annotations require flattening first. No detected tables fails without charging. One application/vnd.openxmlformats-officedocument.spreadsheetml.sheet result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PdfToXlsxQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PdfToXlsxQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-xlsx/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPdfToXlsxQuote",
        "summary": "Confirm a PDF to XLSX quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-xlsx/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPdfToXlsxJob",
        "summary": "Submit a PDF to XLSX job directly",
        "description": "Extract tables using ruled-lines or aligned-text detection. Each detected table gets a worksheet named PageNNNN_TableNNN. Cells remain literal strings including numbers/dates; formulas, automatic hyperlinks, graphics and prose are not exported. Review the extracted cells. Scans require OCR first; fields and non-link annotations require flattening first. No detected tables fails without charging. One application/vnd.openxmlformats-officedocument.spreadsheetml.sheet result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-pptx/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePdfToPptx",
        "summary": "Quote a PDF to PPTX task without uploading files",
        "description": "Choose a PNG image of each selected page at 72/150/300 DPI, or editable text boxes at approximate positions. Image-mode text/graphics are not individually editable. Text mode omits graphics and exact styling; scans need OCR and forms/non-link annotations need flattening first. Mixed sizes fit proportionally on white. Image mode renders scans and supported saved appearances without OCR. One application/vnd.openxmlformats-officedocument.presentationml.presentation result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PdfToPptxQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PdfToPptxQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-pptx/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPdfToPptxQuote",
        "summary": "Confirm a PDF to PPTX quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-pptx/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPdfToPptxJob",
        "summary": "Submit a PDF to PPTX job directly",
        "description": "Choose a PNG image of each selected page at 72/150/300 DPI, or editable text boxes at approximate positions. Image-mode text/graphics are not individually editable. Text mode omits graphics and exact styling; scans need OCR and forms/non-link annotations need flattening first. Mixed sizes fit proportionally on white. Image mode renders scans and supported saved appearances without OCR. One application/vnd.openxmlformats-officedocument.presentationml.presentation result is returned. The technical limit is 100 source PDF pages and 20971520 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 23068672,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 5
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-jpg/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePdfToJpg",
        "summary": "Quote a PDF to JPG task without uploading files",
        "description": "Export selected pages as JPG images at 72, 150 or 300 DPI on a white background. One selected page returns image/jpeg; multiple pages return a ZIP with page-NNNN.jpg members in source order. JPG quality is 90. Encrypted, signed and active PDFs are unsupported. The technical limit is 5000 source PDF pages and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PdfToJpgQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PdfToJpgQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-jpg/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPdfToJpgQuote",
        "summary": "Confirm a PDF to JPG quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 96468992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-jpg/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPdfToJpgJob",
        "summary": "Submit a PDF to JPG job directly",
        "description": "Export selected pages as JPG images at 72, 150 or 300 DPI on a white background. One selected page returns image/jpeg; multiple pages return a ZIP with page-NNNN.jpg members in source order. JPG quality is 90. Encrypted, signed and active PDFs are unsupported. The technical limit is 5000 source PDF pages and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 96468992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-png/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quotePdfToPng",
        "summary": "Quote a PDF to PNG task without uploading files",
        "description": "Export selected pages as lossless PNG images at 72, 150 or 300 DPI on a white background. One selected page returns image/png; multiple pages return a ZIP with page-NNNN.png members in source order. Encrypted, signed and active PDFs are unsupported. The technical limit is 5000 source PDF pages and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PdfToPngQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PdfToPngQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-png/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmPdfToPngQuote",
        "summary": "Confirm a PDF to PNG quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 96468992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/pdf-to-png/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitPdfToPngJob",
        "summary": "Submit a PDF to PNG job directly",
        "description": "Export selected pages as lossless PNG images at 72, 150 or 300 DPI on a white background. One selected page returns image/png; multiple pages return a ZIP with page-NNNN.png members in source order. Encrypted, signed and active PDFs are unsupported. The technical limit is 5000 source PDF pages and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 96468992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 3
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compare-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteComparePdf",
        "summary": "Quote a Compare PDF task without uploading files",
        "description": "Align pages by normalized text and visual fingerprints and receive comparison.pdf with a summary, changed-page details and red visual-change previews. Added, removed and moved pages are distinguished; unchanged details are omitted unless include_unchanged_pages is true. Tiny pixel noise is ignored. Ambiguous pages may remain unmatched. Rendering is bounded per page. Optional flatten preparation converts supported interactive appearances into static content in temporary copies before comparison and removes harmless local page-navigation open settings. Scripts, chained actions, and launch actions remain unsupported. Preparation is included at the same quoted cost and is off by default. The technical limit is 500 source PDF pages and 41943040 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 2 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 131072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ComparePdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ComparePdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compare-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmComparePdfQuote",
        "summary": "Confirm a Compare PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 44040192,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 262144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compare-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitComparePdfJob",
        "summary": "Submit a Compare PDF job directly",
        "description": "Align pages by normalized text and visual fingerprints and receive comparison.pdf with a summary, changed-page details and red visual-change previews. Added, removed and moved pages are distinguished; unchanged details are omitted unless include_unchanged_pages is true. Tiny pixel noise is ignored. Ambiguous pages may remain unmatched. Rendering is bounded per page. Optional flatten preparation converts supported interactive appearances into static content in temporary copies before comparison and removes harmless local page-navigation open settings. Scripts, chained actions, and launch actions remain unsupported. Preparation is included at the same quoted cost and is off by default. The technical limit is 500 source PDF pages and 41943040 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 44040192,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 6
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "contentMediaType": "application/json",
                    "description": "JSON object matching the quote parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-pdf/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToPdf",
        "summary": "Quote a Image to PDF task without uploading files",
        "description": "Convert ordered images to PDF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToPdfQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToPdfQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-pdf/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToPdfQuote",
        "summary": "Confirm a Image to PDF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-pdf/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToPdfJob",
        "summary": "Submit a Image to PDF job directly",
        "description": "Convert ordered images to PDF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-jpg/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToJpg",
        "summary": "Quote a Image to JPG task without uploading files",
        "description": "Convert ordered images to JPG. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToJpgQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToJpgQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-jpg/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToJpgQuote",
        "summary": "Confirm a Image to JPG quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-jpg/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToJpgJob",
        "summary": "Submit a Image to JPG job directly",
        "description": "Convert ordered images to JPG. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-png/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToPng",
        "summary": "Quote a Image to PNG task without uploading files",
        "description": "Convert ordered images to PNG. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToPngQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToPngQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-png/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToPngQuote",
        "summary": "Confirm a Image to PNG quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-png/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToPngJob",
        "summary": "Submit a Image to PNG job directly",
        "description": "Convert ordered images to PNG. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-webp/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToWebp",
        "summary": "Quote a Image to WEBP task without uploading files",
        "description": "Convert ordered images to WEBP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 40000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToWebpQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToWebpQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-webp/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToWebpQuote",
        "summary": "Confirm a Image to WEBP quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-webp/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToWebpJob",
        "summary": "Submit a Image to WEBP job directly",
        "description": "Convert ordered images to WEBP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 40000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-avif/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToAvif",
        "summary": "Quote a Image to AVIF task without uploading files",
        "description": "Convert ordered images to AVIF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 25000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToAvifQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToAvifQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-avif/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToAvifQuote",
        "summary": "Confirm a Image to AVIF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-avif/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToAvifJob",
        "summary": "Submit a Image to AVIF job directly",
        "description": "Convert ordered images to AVIF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 25000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-tiff/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToTiff",
        "summary": "Quote a Image to TIFF task without uploading files",
        "description": "Convert ordered images to TIFF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToTiffQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToTiffQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-tiff/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToTiffQuote",
        "summary": "Confirm a Image to TIFF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-tiff/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToTiffJob",
        "summary": "Submit a Image to TIFF job directly",
        "description": "Convert ordered images to TIFF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-bmp/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToBmp",
        "summary": "Quote a Image to BMP task without uploading files",
        "description": "Convert ordered images to BMP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToBmpQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToBmpQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-bmp/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToBmpQuote",
        "summary": "Confirm a Image to BMP quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-bmp/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToBmpJob",
        "summary": "Submit a Image to BMP job directly",
        "description": "Convert ordered images to BMP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-gif/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToGif",
        "summary": "Quote a Image to GIF task without uploading files",
        "description": "Convert ordered images to GIF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToGifQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToGifQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-gif/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToGifQuote",
        "summary": "Confirm a Image to GIF quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-gif/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToGifJob",
        "summary": "Submit a Image to GIF job directly",
        "description": "Convert ordered images to GIF. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-ico/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageToIco",
        "summary": "Quote a Image to ICO task without uploading files",
        "description": "Convert ordered images to ICO. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageToIcoQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageToIcoQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-ico/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageToIcoQuote",
        "summary": "Confirm a Image to ICO quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-to-ico/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageToIcoJob",
        "summary": "Submit a Image to ICO job directly",
        "description": "Convert ordered images to ICO. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 64000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteCompressImage",
        "summary": "Quote a Compress Image task without uploading files",
        "description": "Compression accepts at most 16000000 pixels/image. Compress ordered images with quality, lossless and format choices. Default is lossy WebP quality 80. Choose PNG or preserve supported JPEG/PNG/WebP/AVIF input format; other preserved inputs become PNG. Dimensions and transparency are preserved where the output supports alpha; source metadata is removed and orientation applied. Already compressed inputs can produce larger outputs. Animated/multipage files use the first/primary image. One input returns one encoded image, several return an ordered ZIP. Convert ordered images to WEBP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 16000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 259072,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompressImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompressImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmCompressImageQuote",
        "summary": "Confirm a Compress Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 518144
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/compress-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitCompressImageJob",
        "summary": "Submit a Compress Image job directly",
        "description": "Compression accepts at most 16000000 pixels/image. Compress ordered images with quality, lossless and format choices. Default is lossy WebP quality 80. Choose PNG or preserve supported JPEG/PNG/WebP/AVIF input format; other preserved inputs become PNG. Dimensions and transparency are preserved where the output supports alpha; source metadata is removed and orientation applied. Already compressed inputs can produce larger outputs. Animated/multipage files use the first/primary image. One input returns one encoded image, several return an ordered ZIP. Convert ordered images to WEBP. Supported inputs: JPG/JPEG, PNG, WebP, AVIF, GIF, TIFF, BMP, ICO, HEIC/HEIF, JPEG 2000, PSD, PPM/PGM/PBM, TGA, PCX, and self-contained vector SVG. At most 16000000 decoded pixels/image, 1000000000 pixels/batch and 512 MiB output; SVG at most 1 MiB. Animated/multipage inputs use the first/primary image; PSD uses its merged preview. SVG is rasterized at intrinsic dimensions and rejects scripts, external resources, and embedded raster elements. Source metadata is removed; orientation is applied; high-bit-depth pixels become 8-bit. JPG/WebP/AVIF are lossy; GIF is still 256-color. JPG/BMP/GIF/PDF replace transparency with white. ICO fits into 256x256 without enlarging; PDF combines one page per image at 96 pixels/inch; other batches return ordered ZIPs. Pricing uses total input bytes and current published tariff; failures release holds. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/resize-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteResizeImage",
        "summary": "Quote a Resize Image task without uploading files",
        "description": "Resize ordered images with aspect-ratio and enlargement controls. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResizeImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResizeImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/resize-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmResizeImageQuote",
        "summary": "Confirm a Resize Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/resize-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitResizeImageJob",
        "summary": "Submit a Resize Image job directly",
        "description": "Resize ordered images with aspect-ratio and enlargement controls. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteCropImage",
        "summary": "Quote a Crop Image task without uploading files",
        "description": "Crop each image with a visual selection or exact proportions. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CropImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CropImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmCropImageQuote",
        "summary": "Confirm a Crop Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/crop-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitCropImageJob",
        "summary": "Submit a Crop Image job directly",
        "description": "Crop each image with a visual selection or exact proportions. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRotateImage",
        "summary": "Quote a Rotate & Flip Image task without uploading files",
        "description": "Rotate, straighten or flip images individually or as a batch. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RotateImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RotateImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRotateImageQuote",
        "summary": "Confirm a Rotate & Flip Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/rotate-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRotateImageJob",
        "summary": "Submit a Rotate & Flip Image job directly",
        "description": "Rotate, straighten or flip images individually or as a batch. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteWatermarkImage",
        "summary": "Quote a Watermark Image task without uploading files",
        "description": "Add a text or image watermark with position, size and opacity controls. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WatermarkImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WatermarkImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmWatermarkImageQuote",
        "summary": "Confirm a Watermark Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/watermark-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitWatermarkImageJob",
        "summary": "Submit a Watermark Image job directly",
        "description": "Add a text or image watermark with position, size and opacity controls. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/adjust-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteAdjustImage",
        "summary": "Quote a Adjust Image task without uploading files",
        "description": "Adjust image brightness, contrast, saturation and sharpness. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdjustImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdjustImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/adjust-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmAdjustImageQuote",
        "summary": "Confirm a Adjust Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/adjust-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitAdjustImageJob",
        "summary": "Submit a Adjust Image job directly",
        "description": "Adjust image brightness, contrast, saturation and sharpness. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-image/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteRedactImage",
        "summary": "Quote a Redact Image task without uploading files",
        "description": "Permanently replace selected image regions with solid opaque pixels. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedactImageQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RedactImageQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-image/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmRedactImageQuote",
        "summary": "Confirm a Redact Image quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/redact-image/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitRedactImageJob",
        "summary": "Submit a Redact Image job directly",
        "description": "Permanently replace selected image regions with solid opaque pixels. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-editor/quotes/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "quoteImageEditor",
        "summary": "Quote a Image Editor task without uploading files",
        "description": "Edit images one by one with rotation, crop, resize, watermark, adjustments and solid redaction, then process one quoted batch. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Send ordered file sizes and SHA-256 hashes with parameters. Input may contain up to 1000 files. The 15-minute quote reserves no credits; input contents are checked after confirmation.",
        "x-rate-limit-category": "write",
        "x-max-body-bytes": 8192000,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageEditorQuoteRequest"
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "200": {
            "description": "Quote and wallet snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImageEditorQuoteResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-editor/quotes/confirm/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "x-required-scopes": [
          "jobs:submit",
          "wallet:read"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          }
        ],
        "operationId": "confirmImageEditorQuote",
        "summary": "Confirm a Image Editor quote and upload its files",
        "description": "Send the unchanged files in quoted order, the quote_token, and the original Idempotency-Key. A new accepted job reserves credits; a final failure or cancellation releases them. An identical retry returns the original job.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "quote_token"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "quote_token": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 16385024
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job and wallet after reservation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteConfirmationResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/image-editor/jobs/": {
      "post": {
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "operationId": "submitImageEditorJob",
        "summary": "Submit a Image Editor job directly",
        "description": "Edit images one by one with rotation, crop, resize, watermark, adjustments and solid redaction, then process one quoted batch. JPG, PNG, WebP, AVIF, GIF and BMP inputs; first animation frame only. Up to 16000000 pixels and 16383 per side at each step, 256000000 combined peak pixels. Quote manifests require orientation-corrected width and height, revalidated against actual files before any hold. Prepare edits without spending, review a fixed quote, then explicitly confirm. Unchanged images are omitted from the job. PNG is lossless; JPG/WebP lossy; JPG fills transparency white. Redaction replaces RGBA pixels with opaque fills and requires PNG. Source metadata is removed. A single edited image returns an image; multiple edited images return an ordered ZIP. Optional logo is the last file with logo_index equal to items length. Failed/cancelled jobs release holds. Browser previews are approximate; inspect outputs. The technical limit is 1000 images and 94371840 input bytes per task. Confirm the current credit charge with X-Expected-Credits. The server validates structure in its isolated worker.",
        "x-rate-limit-category": "submit",
        "x-max-body-bytes": 98516992,
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 1
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files",
                  "parameters"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 1000,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "parameters": {
                    "type": "string",
                    "description": "JSON-encoded ordered edit plan; see this tool\u2019s Parameters schema."
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "201": {
            "description": "New accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          },
          "200": {
            "description": "Idempotent retry of accepted job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/wallet/": {
      "get": {
        "operationId": "getWallet",
        "summary": "Read wallet totals",
        "description": "Returns the authenticated customer's total, reserved, available, and spent credits.",
        "tags": [
          "Wallet"
        ],
        "x-required-scope": "wallet:read",
        "responses": {
          "200": {
            "description": "Wallet totals.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/tools/merge-pdf/jobs/": {
      "post": {
        "operationId": "submitMergePdfJob",
        "summary": "Submit a Merge PDF job directly (compatible existing flow)",
        "description": "Uploads PDF files in merge order and reserves the accepted credit charge. Reusing the same idempotency key with the same request returns the original job. This existing direct route remains supported; the quote/confirm workflow lets new clients inspect cost and affordability before uploading.",
        "tags": [
          "Tools"
        ],
        "x-required-scope": "jobs:submit",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "description": "A unique key for this logical job. Retain it when retrying an uncertain submission.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160,
              "example": "merge-2026-09-04-001"
            }
          },
          {
            "name": "X-Expected-Credits",
            "in": "header",
            "required": true,
            "description": "The whole-credit task cost being confirmed. A stale value is rejected before a reservation is created.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "example": 2
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "files"
                ],
                "properties": {
                  "files": {
                    "type": "array",
                    "description": "PDF files in the exact order they should appear in the result. The independent 1024-file multipart parser safety ceiling is not an account quota. No fixed page-count limit applies. Merged output is limited to 128 MiB. Complexity and worker resource limits still apply; a failed job does not consume credits.",
                    "minItems": 2,
                    "maxItems": 1024,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "files": {
                  "style": "form",
                  "explode": true
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "A new job was accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "200": {
            "description": "An idempotent retry returned the original job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobSubmissionResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/RequestTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/jobs/": {
      "get": {
        "operationId": "listJobs",
        "summary": "List jobs",
        "description": "Lists website and API jobs owned by the authenticated customer, newest first.",
        "tags": [
          "Jobs"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "A positive one-based page number.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of customer jobs.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobListResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/api/v1/jobs/{job_id}/": {
      "get": {
        "operationId": "getJob",
        "summary": "Read a job",
        "tags": [
          "Jobs"
        ],
        "x-required-scope": "jobs:read",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "description": "The customer-owned job UUID.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The customer-owned job.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/jobs/{job_id}/cancel/": {
      "post": {
        "operationId": "cancelJob",
        "summary": "Request job cancellation",
        "description": "Cancels queued work immediately or asks a running worker to stop. Repeating the request is safe.",
        "tags": [
          "Jobs"
        ],
        "x-required-scope": "jobs:cancel",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "description": "The customer-owned job UUID.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current job state and whether this request changed it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobMutationResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/jobs/{job_id}/results/": {
      "get": {
        "operationId": "listJobResults",
        "summary": "List job results",
        "tags": [
          "Results"
        ],
        "x-required-scope": "results:read",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "description": "The customer-owned job UUID.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The job's output records, including unavailable or expired states.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultListResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/jobs/{job_id}/results/{artifact_id}/download/": {
      "get": {
        "operationId": "downloadJobResult",
        "summary": "Download a result",
        "description": "Returns the private result file while it is available. Follow the content type and attachment filename in the response. Results remain retryable until expires_at or explicit deletion. Original uploads are removed after the first result download starts. Interrupted downloads can be retried while the result is available. Intermediate results required by an active or paused flow return 409 result_in_use; their download and delete links are null.",
        "tags": [
          "Results"
        ],
        "x-required-scope": "results:read",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "description": "The customer-owned job UUID.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "artifact_id",
            "in": "path",
            "required": true,
            "description": "The result UUID returned by the result-list endpoint.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The result file.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/api/v1/jobs/{job_id}/results/{artifact_id}/": {
      "delete": {
        "operationId": "deleteJobResult",
        "summary": "Delete a result",
        "description": "Permanently marks an owned result for deletion. Repeating the request is safe; a deleted result cannot be downloaded again. Intermediate results required by active or paused flows return 409 result_in_use.",
        "tags": [
          "Results"
        ],
        "x-required-scope": "results:delete",
        "parameters": [
          {
            "name": "job_id",
            "in": "path",
            "required": true,
            "description": "The customer-owned job UUID.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "artifact_id",
            "in": "path",
            "required": true,
            "description": "The result UUID returned by the result-list endpoint.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The deletion state and whether this request changed it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResultDeletionResponse"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            }
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "SoftwareFool API key",
        "description": "Create a scoped key from the signed-in API access page. The complete key is displayed once."
      }
    },
    "headers": {
      "RateLimitLimit": {
        "description": "The request limit for this account and category.",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      },
      "RateLimitRemaining": {
        "description": "Requests left in the current fixed window.",
        "schema": {
          "type": "integer",
          "minimum": 0
        }
      },
      "RateLimitReset": {
        "description": "Unix timestamp when the current window resets.",
        "schema": {
          "type": "integer",
          "minimum": 0
        }
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "The bearer key is missing or invalid, or its account is ineligible (including missing authenticator enrollment). Authentication failures remain generic.",
        "headers": {
          "WWW-Authenticate": {
            "description": "Bearer authentication challenge.",
            "schema": {
              "type": "string",
              "example": "Bearer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The key lacks the required scope, or a protected new-work request requires current website legal decisions (legal_acceptance_required). Review Terms and acknowledge Privacy at /legal/accept/ on the website; API clients must not accept documents automatically. Existing-work read/download/delete/cancel routes remain accessible. Draft edits do not trigger acceptance; new published versions do.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "NotFound": {
        "description": "The owned resource does not exist or is unavailable.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "InvalidRequest": {
        "description": "The request or page selection is invalid.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "Conflict": {
        "description": "The request conflicts with current credits, job state, limits, or earlier idempotent work.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "RequestTooLarge": {
        "description": "The upload exceeds the permitted request size.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "UnsupportedMediaType": {
        "description": "Use application/json for a quote and multipart/form-data for a confirmation or direct submission.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "RateLimited": {
        "description": "A shared source-address ceiling of 600 API/browser API requests per UTC minute also applies before authentication. More than 20 unmatched 404 requests per UTC minute can pause access. Successive scanning bursts after an earlier pause ends incur 600, 3600, 86400 seconds respectively, with strike history resetting after 86400 seconds without a new burst. Requests during an active pause do not extend it. The account-wide request limit or temporary processing cooldown was reached. Submit limits are shared across API keys and website confirmations/submissions. Repeated unsuccessful processing may temporarily pause submissions; honor Retry-After. Failed jobs release their credit holds. Cancelled jobs also release their holds.",
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait before retrying.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      },
      "Unavailable": {
        "description": "The service, tool, private storage, traffic protection or aggregate capacity is temporarily unavailable. Admission capacity_unavailable refusals create no new job or hold. An interrupted response may follow acceptance: check job status or retry unchanged work with the same idempotency key after Retry-After when present.",
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait before retrying a capacity refusal.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            }
          }
        }
      }
    },
    "schemas": {
      "MergePdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 2,
            "maxItems": 1024,
            "description": "Local files in merge order; at most 100 MiB combined. The independent 1024-file multipart parser safety ceiling is not an account quota. No fixed page-count limit applies. Merged output is limited to 128 MiB. Complexity and worker resource limits still apply; a failed job does not consume credits.",
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            }
          },
          "parameters": {
            "type": "object",
            "maxProperties": 0,
            "additionalProperties": false
          }
        }
      },
      "MergePdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          },
          "tool": {
            "type": "string",
            "const": "merge-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 2,
            "maximum": 1024
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 2,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          }
        }
      },
      "MergePdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MergePdfQuote"
          }
        }
      },
      "QuoteConfirmationResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Job"
          },
          "meta": {
            "type": "object",
            "required": [
              "created",
              "wallet"
            ],
            "additionalProperties": false,
            "properties": {
              "created": {
                "type": "boolean"
              },
              "wallet": {
                "$ref": "#/components/schemas/Wallet"
              }
            }
          }
        }
      },
      "SplitPdfParameters": {
        "type": "object",
        "required": [
          "mode",
          "ranges"
        ],
        "additionalProperties": false,
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "pages",
              "ranges"
            ]
          },
          "ranges": {
            "type": "array",
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                }
              ],
              "minItems": 2,
              "maxItems": 2
            }
          }
        },
        "description": "Use mode pages with an empty ranges array for one PDF per page. Use mode ranges with nonempty, ascending, nonoverlapping inclusive [first,last] pairs; gaps are allowed. The source page count is checked during processing."
      },
      "SplitPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            }
          },
          "parameters": {
            "$ref": "#/components/schemas/SplitPdfParameters"
          }
        }
      },
      "SplitPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "split-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "const": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/SplitPdfParameters"
          }
        }
      },
      "SplitPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SplitPdfQuote"
          }
        }
      },
      "ExtractPdfParameters": {
        "type": "object",
        "required": [
          "ranges"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                }
              ],
              "minItems": 2,
              "maxItems": 2
            }
          }
        },
        "description": "Inclusive, ascending, nonoverlapping [first,last] pairs. Gaps are allowed. Source bounds are checked during processing."
      },
      "ExtractPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ExtractPdfParameters"
          }
        }
      },
      "ExtractPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "extract-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ExtractPdfParameters"
          }
        }
      },
      "ExtractPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ExtractPdfQuote"
          }
        }
      },
      "RemovePdfParameters": {
        "type": "object",
        "required": [
          "ranges"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "minItems": 1,
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                }
              ],
              "minItems": 2,
              "maxItems": 2
            }
          }
        },
        "description": "Inclusive, ascending, nonoverlapping [first,last] pairs. Gaps are allowed. Source bounds are checked during processing."
      },
      "RemovePdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/RemovePdfParameters"
          }
        }
      },
      "RemovePdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "remove-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RemovePdfParameters"
          }
        }
      },
      "RemovePdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RemovePdfQuote"
          }
        }
      },
      "OrganizePdfParameters": {
        "type": "object",
        "required": [
          "order",
          "rotations"
        ],
        "additionalProperties": false,
        "properties": {
          "order": {
            "type": "array",
            "maxItems": 500,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500
            },
            "description": "Empty means keep every page in original order."
          },
          "rotations": {
            "type": "array",
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "enum": [
                    90,
                    180,
                    270
                  ]
                }
              ],
              "minItems": 2,
              "maxItems": 2
            }
          }
        }
      },
      "OrganizePdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/OrganizePdfParameters"
          }
        }
      },
      "OrganizePdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "organize-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/OrganizePdfParameters"
          }
        }
      },
      "OrganizePdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/OrganizePdfQuote"
          }
        }
      },
      "ScanPdfParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "photo",
              "lossless"
            ],
            "description": "Default photo embeds JPEG quality 88 and may resize to the server render bound. Lossless embeds oriented, white-flattened PNG at decoded dimensions; larger files are possible."
          }
        }
      },
      "ScanPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined. Each still image may contain at most 12000000 decoded pixels."
          },
          "parameters": {
            "$ref": "#/components/schemas/ScanPdfParameters"
          }
        }
      },
      "ScanPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "scan-to-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ScanPdfParameters"
          }
        }
      },
      "ScanPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ScanPdfQuote"
          }
        }
      },
      "CompressPdfParameters": {
        "type": "object",
        "required": [
          "mode"
        ],
        "additionalProperties": false,
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "lossless",
              "balanced"
            ]
          }
        }
      },
      "CompressPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/CompressPdfParameters"
          }
        }
      },
      "CompressPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "compress-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/CompressPdfParameters"
          }
        }
      },
      "CompressPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CompressPdfQuote"
          }
        }
      },
      "RepairPdfParameters": {
        "type": "object",
        "maxProperties": 0,
        "additionalProperties": false
      },
      "RepairPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/RepairPdfParameters"
          }
        }
      },
      "RepairPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "repair-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RepairPdfParameters"
          }
        }
      },
      "RepairPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RepairPdfQuote"
          }
        }
      },
      "OcrPdfParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "language": {
            "type": "string",
            "enum": [
              "eng",
              "fra",
              "spa",
              "deu",
              "eng+fra",
              "eng+spa",
              "eng+deu"
            ],
            "description": "Default eng. Printed English, French, Spanish or German, optionally English plus one other installed language. Handwriting and other languages are unsupported; proofread poor scans."
          }
        }
      },
      "OcrPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10485760
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 10485760 bytes combined. Embedded images above 16 million pixels are rejected; OCR working images are downsampled to 4 million pixels."
          },
          "parameters": {
            "$ref": "#/components/schemas/OcrPdfParameters"
          }
        }
      },
      "OcrPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "ocr-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10485760
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/OcrPdfParameters"
          }
        }
      },
      "OcrPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/OcrPdfQuote"
          }
        }
      },
      "RotatePdfParameters": {
        "type": "object",
        "required": [
          "ranges",
          "degrees"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                }
              ],
              "minItems": 2,
              "maxItems": 2
            },
            "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
          },
          "degrees": {
            "type": "integer",
            "enum": [
              90,
              180,
              270
            ]
          }
        }
      },
      "RotatePdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/RotatePdfParameters"
          }
        }
      },
      "RotatePdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "rotate-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RotatePdfParameters"
          }
        }
      },
      "RotatePdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RotatePdfQuote"
          }
        }
      },
      "CropPdfParameters": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "ranges",
              "left",
              "right",
              "top",
              "bottom"
            ],
            "additionalProperties": false,
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 500,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 500
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 500
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "left": {
                "type": "integer",
                "minimum": 0,
                "maximum": 95
              },
              "right": {
                "type": "integer",
                "minimum": 0,
                "maximum": 95
              },
              "top": {
                "type": "integer",
                "minimum": 0,
                "maximum": 95
              },
              "bottom": {
                "type": "integer",
                "minimum": 0,
                "maximum": 95
              }
            },
            "description": "Percent margins. At least one is nonzero; opposing sides sum to less than 100."
          },
          {
            "type": "object",
            "required": [
              "ranges",
              "mode"
            ],
            "additionalProperties": false,
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 500,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 500
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 500
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "mode": {
                "type": "string",
                "const": "auto"
              },
              "padding": {
                "type": "integer",
                "minimum": 0,
                "maximum": 72,
                "default": 6
              }
            },
            "description": "Detect margins separately on each selected page. Padding is in PDF points. Blank or uncertain-background pages stay unchanged. Hidden content remains in the PDF."
          }
        ]
      },
      "CropPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/CropPdfParameters"
          }
        }
      },
      "CropPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "crop-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/CropPdfParameters"
          }
        }
      },
      "CropPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CropPdfQuote"
          }
        }
      },
      "PageNumbersPdfParameters": {
        "type": "object",
        "required": [
          "ranges",
          "start",
          "position",
          "style"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "maxItems": 500,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                }
              ],
              "minItems": 2,
              "maxItems": 2
            },
            "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
          },
          "start": {
            "type": "integer",
            "minimum": 0,
            "maximum": 999999
          },
          "position": {
            "type": "string",
            "enum": [
              "top-left",
              "top-center",
              "top-right",
              "bottom-left",
              "bottom-center",
              "bottom-right"
            ]
          },
          "style": {
            "type": "string",
            "enum": [
              "decimal",
              "decimal-leading",
              "roman",
              "roman-lower",
              "letters",
              "letters-lower",
              "ordinal"
            ]
          },
          "format": {
            "type": "string",
            "enum": [
              "number",
              "page-number",
              "x-of-y",
              "page-x-of-y",
              "dash",
              "brackets",
              "custom"
            ],
            "default": "number"
          },
          "font": {
            "type": "string",
            "enum": [
              "helvetica",
              "times",
              "courier"
            ],
            "default": "helvetica"
          },
          "parity": {
            "type": "string",
            "enum": [
              "all",
              "odd",
              "even"
            ],
            "default": "all"
          },
          "numbering": {
            "type": "string",
            "enum": [
              "selected",
              "document"
            ],
            "default": "selected"
          },
          "total": {
            "type": "string",
            "enum": [
              "document",
              "selected"
            ],
            "default": "document"
          },
          "font_size": {
            "type": "integer",
            "minimum": 4,
            "maximum": 72,
            "default": 10
          },
          "min_font_size": {
            "type": "integer",
            "minimum": 4,
            "maximum": 72,
            "default": 6
          },
          "margin_x": {
            "type": "integer",
            "minimum": 0,
            "maximum": 144,
            "default": 24
          },
          "margin_y": {
            "type": "integer",
            "minimum": 0,
            "maximum": 144,
            "default": 24
          },
          "auto_fit": {
            "type": "boolean",
            "default": true
          },
          "bold": {
            "type": "boolean",
            "default": false
          },
          "italic": {
            "type": "boolean",
            "default": false
          },
          "mirror": {
            "type": "boolean",
            "default": false
          },
          "restart": {
            "type": "boolean",
            "default": false
          },
          "skip_first": {
            "type": "boolean",
            "default": false
          },
          "underline": {
            "type": "boolean",
            "default": false
          },
          "color": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "default": "#000000"
          },
          "template": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "default": "Page {page} of {total}",
            "description": "Printable ASCII; {page} is required in custom format. {total} uses total scope; {index}/{pages} use physical page/count. No format specs or conversions."
          }
        }
      },
      "PageNumbersPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PageNumbersPdfParameters"
          }
        }
      },
      "PageNumbersPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "page-numbers-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PageNumbersPdfParameters"
          }
        }
      },
      "PageNumbersPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PageNumbersPdfQuote"
          }
        }
      },
      "WatermarkPdfParameters": {
        "type": "object",
        "required": [
          "kind",
          "text",
          "position",
          "opacity",
          "rotation",
          "layer",
          "pages"
        ],
        "additionalProperties": false,
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "text",
              "image"
            ]
          },
          "text": {
            "type": "string",
            "maxLength": 200
          },
          "position": {
            "type": "string",
            "enum": [
              "center",
              "top-left",
              "top-right",
              "bottom-left",
              "bottom-right"
            ]
          },
          "opacity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "rotation": {
            "type": "integer",
            "minimum": -90,
            "maximum": 90
          },
          "layer": {
            "type": "string",
            "enum": [
              "over",
              "under"
            ]
          },
          "pages": {
            "type": "array",
            "maxItems": 100,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          "repeat": {
            "type": "boolean",
            "default": false
          },
          "repeat_spacing": {
            "type": "integer",
            "minimum": 0,
            "maximum": 144,
            "default": 36,
            "description": "Gap between rotated tiles in PDF points; used only for repeat."
          },
          "repeat_scale": {
            "type": "integer",
            "minimum": 25,
            "maximum": 200,
            "default": 100,
            "description": "Repeated watermark size as a percentage of the default tile size."
          }
        }
      },
      "WatermarkPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 2,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 26214400 bytes combined. A second PNG/JPEG/SVG image, when used, is limited to 5242880 bytes."
          },
          "parameters": {
            "$ref": "#/components/schemas/WatermarkPdfParameters"
          }
        }
      },
      "WatermarkPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "watermark-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 26214400
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/WatermarkPdfParameters"
          }
        }
      },
      "WatermarkPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WatermarkPdfQuote"
          }
        }
      },
      "RedactPdfParameters": {
        "type": "object",
        "required": [
          "rectangles"
        ],
        "additionalProperties": false,
        "properties": {
          "rectangles": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20
                },
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000
                },
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000
                },
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000
                },
                {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1000
                }
              ],
              "minItems": 5,
              "maxItems": 5
            }
          }
        },
        "description": "Each [page,left,top,width,height] uses thousandths of the visible page."
      },
      "RedactPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10485760
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 10485760 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/RedactPdfParameters"
          }
        }
      },
      "RedactPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "redact-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10485760
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RedactPdfParameters"
          }
        }
      },
      "RedactPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RedactPdfQuote"
          }
        }
      },
      "UnlockPdfParameters": {
        "type": "object",
        "maxProperties": 0,
        "additionalProperties": false
      },
      "UnlockPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/UnlockPdfParameters"
          }
        }
      },
      "UnlockPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "unlock-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/UnlockPdfParameters"
          }
        }
      },
      "UnlockPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/UnlockPdfQuote"
          }
        }
      },
      "ProtectPdfParameters": {
        "type": "object",
        "maxProperties": 0,
        "additionalProperties": false
      },
      "ProtectPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ProtectPdfParameters"
          }
        }
      },
      "ProtectPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "protect-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ProtectPdfParameters"
          }
        }
      },
      "ProtectPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ProtectPdfQuote"
          }
        }
      },
      "EditPdfParameters": {
        "type": "object",
        "required": [
          "operations"
        ],
        "additionalProperties": false,
        "properties": {
          "operations": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "type",
                "page",
                "x",
                "y",
                "width",
                "height",
                "color",
                "text",
                "font_size"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "text",
                    "rectangle",
                    "highlight"
                  ]
                },
                "page": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                "x": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "y": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "width": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "height": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "color": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "text": {
                  "type": "string",
                  "maxLength": 500
                },
                "font_size": {
                  "type": "integer",
                  "minimum": 6,
                  "maximum": 72
                }
              }
            }
          }
        },
        "description": "Coordinates are normalized page fractions, from 0 to 1."
      },
      "EditPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/EditPdfParameters"
          }
        }
      },
      "EditPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "edit-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/EditPdfParameters"
          }
        }
      },
      "EditPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EditPdfQuote"
          }
        }
      },
      "FormsPdfParameters": {
        "type": "object",
        "required": [
          "fields"
        ],
        "additionalProperties": false,
        "properties": {
          "fields": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "type",
                "name",
                "page",
                "x",
                "y",
                "width",
                "height",
                "label"
              ],
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "text",
                    "checkbox"
                  ]
                },
                "name": {
                  "type": "string",
                  "pattern": "^[A-Za-z][A-Za-z0-9_]{0,63}$"
                },
                "page": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 500
                },
                "x": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "y": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "width": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "height": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "label": {
                  "type": "string",
                  "maxLength": 100
                }
              }
            }
          }
        },
        "description": "Coordinates are normalized page fractions, from 0 to 1."
      },
      "FormsPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/FormsPdfParameters"
          }
        }
      },
      "FormsPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "forms-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/FormsPdfParameters"
          }
        }
      },
      "FormsPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FormsPdfQuote"
          }
        }
      },
      "SignPdfParameters": {
        "type": "object",
        "required": [
          "name",
          "page",
          "placement",
          "date"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "page": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500
          },
          "placement": {
            "type": "string",
            "enum": [
              "bottom_left",
              "bottom_right",
              "top_left",
              "top_right"
            ]
          },
          "date": {
            "type": "boolean"
          }
        }
      },
      "SignPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/SignPdfParameters"
          }
        }
      },
      "SignPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "sign-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/SignPdfParameters"
          }
        }
      },
      "SignPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SignPdfQuote"
          }
        }
      },
      "FlattenPdfParameters": {
        "type": "object",
        "maxProperties": 0,
        "additionalProperties": false
      },
      "FlattenPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 104857600 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/FlattenPdfParameters"
          }
        }
      },
      "FlattenPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "flatten-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/FlattenPdfParameters"
          }
        }
      },
      "FlattenPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FlattenPdfQuote"
          }
        }
      },
      "PdfToDocxParameters": {
        "oneOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "ranges"
            ],
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 100,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "mode": {
                "const": "text"
              }
            }
          },
          {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "ranges",
              "mode",
              "dpi"
            ],
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 100,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "mode": {
                "const": "image"
              },
              "dpi": {
                "type": "integer",
                "enum": [
                  72,
                  150,
                  300
                ]
              }
            }
          }
        ],
        "description": "Default editable text/ruled tables omit graphics and exact styling. Image mode renders visible pages into DOCX; text/graphics are not individually editable. Mixed pages fit the first page geometry with narrow white margins. Scans need no OCR in image mode. At most 16000000 pixels/page, 160000000 pixels/job and 50 MiB output; resolution is not silently reduced."
      },
      "PdfToDocxQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 20971520 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToDocxParameters"
          }
        }
      },
      "PdfToDocxQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "pdf-to-docx"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20971520
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToDocxParameters"
          }
        }
      },
      "PdfToDocxQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PdfToDocxQuote"
          }
        }
      },
      "PdfToXlsxParameters": {
        "type": "object",
        "required": [
          "ranges",
          "table_mode"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 100
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 100
                }
              ],
              "minItems": 2,
              "maxItems": 2
            },
            "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
          },
          "table_mode": {
            "type": "string",
            "enum": [
              "lines",
              "text"
            ],
            "description": "lines: ruled tables; text: borderless aligned-text tables. Review extracted cells."
          }
        },
        "description": "At most 50 MiB output. Text extraction: 50000 characters/page, 1000000 characters/job, 2000 graphic objects/page, 100 tables/job, 20000 cells/job; at most 32767 characters/cell. PPTX: 16000000 pixels/page, 160000000 pixels/job, no silent downscaling. Source page count, selected bounds and content limits are checked inside the worker. Failures release holds. Source metadata and external links are not copied."
      },
      "PdfToXlsxQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 20971520 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToXlsxParameters"
          }
        }
      },
      "PdfToXlsxQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "pdf-to-xlsx"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20971520
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToXlsxParameters"
          }
        }
      },
      "PdfToXlsxQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PdfToXlsxQuote"
          }
        }
      },
      "PdfToPptxParameters": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "ranges",
              "mode",
              "dpi"
            ],
            "additionalProperties": false,
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 100,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "mode": {
                "const": "image"
              },
              "dpi": {
                "type": "integer",
                "enum": [
                  72,
                  150,
                  300
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "ranges",
              "mode"
            ],
            "additionalProperties": false,
            "properties": {
              "ranges": {
                "type": "array",
                "maxItems": 100,
                "items": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 100
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
              },
              "mode": {
                "const": "text"
              }
            }
          }
        ],
        "description": "Image mode: 16000000 pixels/page and 160000000 pixels/job; no silent downscaling. Editable text mode: 50000 characters/page, 1000000 characters/job, 2000 graphic objects/page. Text boxes use approximate positions and omit graphics and exact styling. Scans need OCR first for text mode. Both modes allow at most 50 MiB output; failures release holds."
      },
      "PdfToPptxQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 20971520 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToPptxParameters"
          }
        }
      },
      "PdfToPptxQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "pdf-to-pptx"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20971520
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToPptxParameters"
          }
        }
      },
      "PdfToPptxQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PdfToPptxQuote"
          }
        }
      },
      "PdfToJpgParameters": {
        "type": "object",
        "required": [
          "ranges",
          "dpi"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "maxItems": 5000,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 5000
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 5000
                }
              ],
              "minItems": 2,
              "maxItems": 2
            },
            "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
          },
          "dpi": {
            "type": "integer",
            "enum": [
              72,
              150,
              300
            ]
          }
        },
        "description": "Render at most 16000000 pixels per page and 4000000000 pixels per job; output at most 100 MiB. No automatic downscaling. Source page count and range bounds are checked in the isolated worker; failures release held credits."
      },
      "PdfToJpgQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 94371840
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToJpgParameters"
          }
        }
      },
      "PdfToJpgQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "pdf-to-jpg"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToJpgParameters"
          }
        }
      },
      "PdfToJpgQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PdfToJpgQuote"
          }
        }
      },
      "PdfToPngParameters": {
        "type": "object",
        "required": [
          "ranges",
          "dpi"
        ],
        "additionalProperties": false,
        "properties": {
          "ranges": {
            "type": "array",
            "maxItems": 5000,
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 5000
                },
                {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 5000
                }
              ],
              "minItems": 2,
              "maxItems": 2
            },
            "description": "Ascending nonoverlapping inclusive page ranges. Empty means all pages."
          },
          "dpi": {
            "type": "integer",
            "enum": [
              72,
              150,
              300
            ]
          }
        },
        "description": "Render at most 16000000 pixels per page and 4000000000 pixels per job; output at most 100 MiB. No automatic downscaling. Source page count and range bounds are checked in the isolated worker; failures release held credits."
      },
      "PdfToPngQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 94371840
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToPngParameters"
          }
        }
      },
      "PdfToPngQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "pdf-to-png"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/PdfToPngParameters"
          }
        }
      },
      "PdfToPngQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PdfToPngQuote"
          }
        }
      },
      "ComparePdfParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "flatten": {
            "type": "boolean",
            "default": false,
            "description": "Opt in to flattening both PDFs before comparison. False is omitted from canonical quote parameters. Links and interactive controls are removed; only supported visible annotation appearances are retained."
          },
          "include_unchanged_pages": {
            "type": "boolean",
            "default": false,
            "description": "Include unchanged page details in the report. By default, summary-first reports contain only changed pages. False is omitted from canonical quote parameters."
          }
        }
      },
      "ComparePdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 2,
            "maxItems": 2,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 20971520
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 41943040 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ComparePdfParameters"
          }
        }
      },
      "ComparePdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 262144
          },
          "tool": {
            "type": "string",
            "const": "compare-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 41943040
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ComparePdfParameters"
          }
        }
      },
      "ComparePdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ComparePdfQuote"
          }
        }
      },
      "ImageToPdfParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "ImageToPdfQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToPdfParameters"
          }
        }
      },
      "ImageToPdfQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-pdf"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToPdfParameters"
          }
        }
      },
      "ImageToPdfQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToPdfQuote"
          }
        }
      },
      "ImageToJpgParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "background": {
            "type": "string",
            "enum": [
              "white",
              "black"
            ]
          }
        }
      },
      "ImageToJpgQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToJpgParameters"
          }
        }
      },
      "ImageToJpgQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-jpg"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToJpgParameters"
          }
        }
      },
      "ImageToJpgQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToJpgQuote"
          }
        }
      },
      "ImageToPngParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "ImageToPngQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToPngParameters"
          }
        }
      },
      "ImageToPngQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-png"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToPngParameters"
          }
        }
      },
      "ImageToPngQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToPngQuote"
          }
        }
      },
      "ImageToWebpParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "lossless": {
            "type": "boolean"
          }
        }
      },
      "ImageToWebpQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToWebpParameters"
          }
        }
      },
      "ImageToWebpQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-webp"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToWebpParameters"
          }
        }
      },
      "ImageToWebpQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToWebpQuote"
          }
        }
      },
      "ImageToAvifParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "ImageToAvifQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToAvifParameters"
          }
        }
      },
      "ImageToAvifQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-avif"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToAvifParameters"
          }
        }
      },
      "ImageToAvifQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToAvifQuote"
          }
        }
      },
      "ImageToTiffParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "ImageToTiffQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToTiffParameters"
          }
        }
      },
      "ImageToTiffQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-tiff"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToTiffParameters"
          }
        }
      },
      "ImageToTiffQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToTiffQuote"
          }
        }
      },
      "ImageToBmpParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "ImageToBmpQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToBmpParameters"
          }
        }
      },
      "ImageToBmpQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-bmp"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToBmpParameters"
          }
        }
      },
      "ImageToBmpQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToBmpQuote"
          }
        }
      },
      "ImageToGifParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "colors": {
            "type": "integer",
            "enum": [
              16,
              32,
              64,
              128,
              256
            ]
          },
          "dither": {
            "type": "string",
            "enum": [
              "none",
              "floyd-steinberg"
            ]
          }
        }
      },
      "ImageToGifQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToGifParameters"
          }
        }
      },
      "ImageToGifQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-gif"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToGifParameters"
          }
        }
      },
      "ImageToGifQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToGifQuote"
          }
        }
      },
      "ImageToIcoParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "ImageToIcoQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToIcoParameters"
          }
        }
      },
      "ImageToIcoQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "image-to-ico"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageToIcoParameters"
          }
        }
      },
      "ImageToIcoQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageToIcoQuote"
          }
        }
      },
      "CompressImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "lossless": {
            "type": "boolean"
          },
          "format": {
            "type": "string",
            "enum": [
              "webp",
              "png",
              "preserve"
            ]
          }
        }
      },
      "CompressImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined."
          },
          "parameters": {
            "$ref": "#/components/schemas/CompressImageParameters"
          }
        }
      },
      "CompressImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 518144
          },
          "tool": {
            "type": "string",
            "const": "compress-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/CompressImageParameters"
          }
        }
      },
      "CompressImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CompressImageQuote"
          }
        }
      },
      "ResizeImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "width",
                          "height"
                        ],
                        "properties": {
                          "op": {
                            "const": "resize"
                          },
                          "width": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16383
                          },
                          "height": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16383
                          },
                          "fit": {
                            "enum": [
                              "contain",
                              "stretch"
                            ]
                          },
                          "allow_upscale": {
                            "type": "boolean"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "ResizeImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/ResizeImageParameters"
          }
        }
      },
      "ResizeImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "resize-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ResizeImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "ResizeImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ResizeImageQuote"
          }
        }
      },
      "CropImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "rect"
                        ],
                        "properties": {
                          "op": {
                            "const": "crop"
                          },
                          "rect": {
                            "type": "array",
                            "items": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 10000
                            },
                            "minItems": 4,
                            "maxItems": 4,
                            "description": "left,top,right,bottom in 0\u201310000 relative to the current image; right/bottom exclusive."
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "CropImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/CropImageParameters"
          }
        }
      },
      "CropImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "crop-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/CropImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "CropImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/CropImageQuote"
          }
        }
      },
      "RotateImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "rotate"
                          },
                          "angle": {
                            "type": "integer",
                            "minimum": -180,
                            "maximum": 270
                          },
                          "flip_x": {
                            "type": "boolean"
                          },
                          "flip_y": {
                            "type": "boolean"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "RotateImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/RotateImageParameters"
          }
        }
      },
      "RotateImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "rotate-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RotateImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "RotateImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RotateImageQuote"
          }
        }
      },
      "WatermarkImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "watermark"
                          },
                          "mode": {
                            "enum": [
                              "text",
                              "logo"
                            ]
                          },
                          "text": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "position": {
                            "enum": [
                              "top-left",
                              "top-center",
                              "top-right",
                              "center-left",
                              "center",
                              "center-right",
                              "bottom-left",
                              "bottom-center",
                              "bottom-right"
                            ]
                          },
                          "size": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                          },
                          "opacity": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100
                          },
                          "color": {
                            "type": "string",
                            "pattern": "^#[0-9a-fA-F]{6}$"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "WatermarkImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/WatermarkImageParameters"
          }
        }
      },
      "WatermarkImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "watermark-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/WatermarkImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "WatermarkImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WatermarkImageQuote"
          }
        }
      },
      "AdjustImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "adjust"
                          },
                          "brightness": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "contrast": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "saturation": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "sharpness": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 300
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "AdjustImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/AdjustImageParameters"
          }
        }
      },
      "AdjustImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "adjust-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/AdjustImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "AdjustImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AdjustImageQuote"
          }
        }
      },
      "RedactImageParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "rects"
                        ],
                        "properties": {
                          "op": {
                            "const": "redact"
                          },
                          "rects": {
                            "type": "array",
                            "items": {
                              "type": "array",
                              "items": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 10000
                              },
                              "minItems": 4,
                              "maxItems": 4,
                              "description": "left,top,right,bottom in 0\u201310000 relative to the current image; right/bottom exclusive."
                            },
                            "minItems": 1,
                            "maxItems": 32
                          },
                          "color": {
                            "type": "string",
                            "pattern": "^#[0-9a-fA-F]{6}$"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "RedactImageQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/RedactImageParameters"
          }
        }
      },
      "RedactImageQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "redact-image"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/RedactImageParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "RedactImageQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RedactImageQuote"
          }
        }
      },
      "ImageEditorParameters": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "operations"
              ],
              "properties": {
                "operations": {
                  "type": "array",
                  "minItems": 1,
                  "maxItems": 8,
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "rotate"
                          },
                          "angle": {
                            "type": "integer",
                            "minimum": -180,
                            "maximum": 270
                          },
                          "flip_x": {
                            "type": "boolean"
                          },
                          "flip_y": {
                            "type": "boolean"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "rect"
                        ],
                        "properties": {
                          "op": {
                            "const": "crop"
                          },
                          "rect": {
                            "type": "array",
                            "items": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 10000
                            },
                            "minItems": 4,
                            "maxItems": 4,
                            "description": "left,top,right,bottom in 0\u201310000 relative to the current image; right/bottom exclusive."
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "width",
                          "height"
                        ],
                        "properties": {
                          "op": {
                            "const": "resize"
                          },
                          "width": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16383
                          },
                          "height": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 16383
                          },
                          "fit": {
                            "enum": [
                              "contain",
                              "stretch"
                            ]
                          },
                          "allow_upscale": {
                            "type": "boolean"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "watermark"
                          },
                          "mode": {
                            "enum": [
                              "text",
                              "logo"
                            ]
                          },
                          "text": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "position": {
                            "enum": [
                              "top-left",
                              "top-center",
                              "top-right",
                              "center-left",
                              "center",
                              "center-right",
                              "bottom-left",
                              "bottom-center",
                              "bottom-right"
                            ]
                          },
                          "size": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                          },
                          "opacity": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100
                          },
                          "color": {
                            "type": "string",
                            "pattern": "^#[0-9a-fA-F]{6}$"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op"
                        ],
                        "properties": {
                          "op": {
                            "const": "adjust"
                          },
                          "brightness": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "contrast": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "saturation": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 200
                          },
                          "sharpness": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 300
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "required": [
                          "op",
                          "rects"
                        ],
                        "properties": {
                          "op": {
                            "const": "redact"
                          },
                          "rects": {
                            "type": "array",
                            "items": {
                              "type": "array",
                              "items": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 10000
                              },
                              "minItems": 4,
                              "maxItems": 4,
                              "description": "left,top,right,bottom in 0\u201310000 relative to the current image; right/bottom exclusive."
                            },
                            "minItems": 1,
                            "maxItems": 32
                          },
                          "color": {
                            "type": "string",
                            "pattern": "^#[0-9a-fA-F]{6}$"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          },
          "format": {
            "enum": [
              "png",
              "jpg",
              "webp"
            ],
            "default": "png"
          },
          "quality": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "logo_index": {
            "type": "integer",
            "minimum": 1,
            "maximum": 999
          }
        },
        "description": "Ordered changed-image plans. Coordinates refer to the orientation-corrected image after preceding operations. Optional logo is the last multipart file; logo_index equals items length. Quote dimensions must be orientation-corrected. PNG is lossless; JPG/WebP are lossy, JPG flattens alpha to white. Originals stay unchanged; untouched editor images need not be uploaded."
      },
      "ImageEditorQuoteRequest": {
        "type": "object",
        "required": [
          "files",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "required": [
                "bytes",
                "sha256",
                "width",
                "height"
              ],
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                },
                "width": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 16383
                }
              }
            },
            "description": "Ordered files, at most 94371840 bytes combined. Dimensions are after EXIF orientation; bytes/hash cover the original file. All values are checked at confirmation."
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageEditorParameters"
          }
        }
      },
      "ImageEditorQuote": {
        "type": "object",
        "required": [
          "token",
          "tool",
          "cost_credits",
          "can_afford",
          "expires_at",
          "file_count",
          "total_bytes",
          "wallet",
          "parameters"
        ],
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16385024
          },
          "tool": {
            "type": "string",
            "const": "image-editor"
          },
          "cost_credits": {
            "type": "integer",
            "minimum": 1
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "file_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "wallet": {
            "$ref": "#/components/schemas/Wallet"
          },
          "parameters": {
            "$ref": "#/components/schemas/ImageEditorParameters"
          },
          "separate_jobs_credits": {
            "type": "integer",
            "minimum": 1,
            "description": "Retail sum for the same per-image plans as separate jobs for this same tool and current price, including the logo each time."
          },
          "batch_savings_credits": {
            "type": "integer",
            "minimum": 0,
            "description": "Nonnegative savings against those separate jobs. It can be zero; compare exact totals."
          }
        }
      },
      "ImageEditorQuoteResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ImageEditorQuote"
          }
        }
      },
      "DocumentOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text_mode": {
            "type": "string",
            "enum": [
              "auto",
              "txt",
              "md"
            ],
            "default": "auto"
          },
          "acknowledge_risks": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "acknowledge_risks"
        ]
      },
      "DocumentReviewOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text_mode": {
            "type": "string",
            "enum": [
              "auto",
              "txt",
              "md"
            ],
            "default": "auto"
          },
          "acknowledge_risks": {
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "DocumentReview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          },
          "tool": {
            "type": "string",
            "enum": [
              "document-to-doc",
              "document-to-docx",
              "document-to-html",
              "document-to-md",
              "document-to-odt",
              "document-to-pdf",
              "document-to-rtf",
              "document-to-txt"
            ]
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text_mode": {
                "type": "string",
                "enum": [
                  "auto",
                  "txt",
                  "md"
                ],
                "default": "auto"
              },
              "acknowledge_risks": {
                "type": "boolean",
                "default": false
              }
            },
            "required": []
          },
          "file_count": {
            "type": "integer",
            "minimum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "blocked": {
            "type": "boolean"
          },
          "groups": {
            "type": "array",
            "maxItems": 7,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "docx",
                    "doc",
                    "odt",
                    "rtf",
                    "txt",
                    "md",
                    "html"
                  ]
                },
                "source_label": {
                  "type": "string"
                },
                "output": {
                  "type": "string",
                  "enum": [
                    "pdf",
                    "docx",
                    "doc",
                    "odt",
                    "rtf",
                    "txt",
                    "md",
                    "html"
                  ]
                },
                "output_label": {
                  "type": "string"
                },
                "expected_losses": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "possible_changes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "already_target": {
                  "type": "boolean"
                },
                "file_count": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "source",
                "source_label",
                "output",
                "output_label",
                "expected_losses",
                "possible_changes",
                "already_target",
                "file_count"
              ]
            }
          },
          "files": {
            "type": "array",
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "position": {
                  "type": "integer",
                  "minimum": 1
                },
                "format": {
                  "type": "string",
                  "enum": [
                    "docx",
                    "doc",
                    "odt",
                    "rtf",
                    "txt",
                    "md",
                    "html"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "text_interpretation": {
                  "type": "boolean"
                }
              },
              "required": [
                "position",
                "format",
                "label",
                "text_interpretation"
              ]
            }
          }
        },
        "required": [
          "token",
          "tool",
          "expires_at",
          "parameters",
          "file_count",
          "total_bytes",
          "blocked",
          "groups",
          "files"
        ]
      },
      "DocumentReviewResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DocumentReview"
          }
        },
        "required": [
          "data"
        ]
      },
      "DocumentQuoteManifest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              },
              "required": [
                "bytes",
                "sha256"
              ]
            }
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text_mode": {
                "type": "string",
                "enum": [
                  "auto",
                  "txt",
                  "md"
                ],
                "default": "auto"
              },
              "acknowledge_risks": {
                "type": "boolean",
                "const": true
              }
            },
            "required": [
              "acknowledge_risks"
            ]
          },
          "review_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          }
        },
        "required": [
          "files",
          "parameters",
          "review_token"
        ]
      },
      "DocumentQuoteResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "token": {
                "type": "string",
                "minLength": 1,
                "maxLength": 524288
              },
              "tool": {
                "type": "string",
                "enum": [
                  "document-to-doc",
                  "document-to-docx",
                  "document-to-html",
                  "document-to-md",
                  "document-to-odt",
                  "document-to-pdf",
                  "document-to-rtf",
                  "document-to-txt"
                ]
              },
              "cost_credits": {
                "type": "integer",
                "minimum": 1
              },
              "can_afford": {
                "type": "boolean"
              },
              "expires_at": {
                "type": "string",
                "format": "date-time"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "text_mode": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "txt",
                      "md"
                    ],
                    "default": "auto"
                  },
                  "acknowledge_risks": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "acknowledge_risks"
                ]
              },
              "file_count": {
                "type": "integer",
                "minimum": 1
              },
              "total_bytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 94371840
              },
              "wallet": {
                "$ref": "#/components/schemas/Wallet"
              },
              "review": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "groups": {
                    "type": "array",
                    "maxItems": 7,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "source": {
                          "type": "string",
                          "enum": [
                            "docx",
                            "doc",
                            "odt",
                            "rtf",
                            "txt",
                            "md",
                            "html"
                          ]
                        },
                        "source_label": {
                          "type": "string"
                        },
                        "output": {
                          "type": "string",
                          "enum": [
                            "pdf",
                            "docx",
                            "doc",
                            "odt",
                            "rtf",
                            "txt",
                            "md",
                            "html"
                          ]
                        },
                        "output_label": {
                          "type": "string"
                        },
                        "expected_losses": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "possible_changes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "already_target": {
                          "type": "boolean"
                        },
                        "file_count": {
                          "type": "integer",
                          "minimum": 1
                        }
                      },
                      "required": [
                        "source",
                        "source_label",
                        "output",
                        "output_label",
                        "expected_losses",
                        "possible_changes",
                        "already_target",
                        "file_count"
                      ]
                    }
                  }
                },
                "required": [
                  "groups"
                ]
              }
            },
            "required": [
              "token",
              "tool",
              "cost_credits",
              "can_afford",
              "expires_at",
              "parameters",
              "file_count",
              "total_bytes",
              "wallet",
              "review"
            ]
          }
        },
        "required": [
          "data"
        ]
      },
      "SpreadsheetOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text_mode": {
            "type": "string",
            "enum": [
              "auto",
              "csv",
              "tsv"
            ],
            "default": "auto"
          },
          "acknowledge_risks": {
            "type": "boolean",
            "const": true
          },
          "sheets": {
            "type": "array",
            "minItems": 1,
            "maxItems": 256,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 256
            },
            "description": "Unique ascending one-based data-sheet positions, including hidden sheets in workbook order. Omit to export all sheets. Positions must exist."
          },
          "encoding": {
            "type": "string",
            "enum": [
              "utf-8",
              "utf-8-sig"
            ],
            "description": "CSV/TSV outputs only; UTF-8 or UTF-8 with BOM. Default UTF-8."
          },
          "delimiter": {
            "type": "string",
            "enum": [
              ",",
              ";"
            ],
            "description": "CSV output only; default comma. TSV always uses tabs."
          }
        },
        "required": [
          "acknowledge_risks"
        ]
      },
      "SpreadsheetReviewOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "text_mode": {
            "type": "string",
            "enum": [
              "auto",
              "csv",
              "tsv"
            ],
            "default": "auto"
          },
          "acknowledge_risks": {
            "type": "boolean",
            "default": false
          },
          "sheets": {
            "type": "array",
            "minItems": 1,
            "maxItems": 256,
            "uniqueItems": true,
            "items": {
              "type": "integer",
              "minimum": 1,
              "maximum": 256
            },
            "description": "Unique ascending one-based data-sheet positions, including hidden sheets in workbook order. Omit to export all sheets. Positions must exist."
          },
          "encoding": {
            "type": "string",
            "enum": [
              "utf-8",
              "utf-8-sig"
            ],
            "description": "CSV/TSV outputs only; UTF-8 or UTF-8 with BOM. Default UTF-8."
          },
          "delimiter": {
            "type": "string",
            "enum": [
              ",",
              ";"
            ],
            "description": "CSV output only; default comma. TSV always uses tabs."
          }
        },
        "required": []
      },
      "SpreadsheetReview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          },
          "tool": {
            "type": "string",
            "enum": [
              "spreadsheet-to-csv",
              "spreadsheet-to-html",
              "spreadsheet-to-ods",
              "spreadsheet-to-pdf",
              "spreadsheet-to-tsv",
              "spreadsheet-to-xls",
              "spreadsheet-to-xlsx"
            ]
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text_mode": {
                "type": "string",
                "enum": [
                  "auto",
                  "csv",
                  "tsv"
                ],
                "default": "auto"
              },
              "acknowledge_risks": {
                "type": "boolean",
                "default": false
              },
              "sheets": {
                "type": "array",
                "minItems": 1,
                "maxItems": 256,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 256
                },
                "description": "Unique ascending one-based data-sheet positions, including hidden sheets in workbook order. Omit to export all sheets. Positions must exist."
              },
              "encoding": {
                "type": "string",
                "enum": [
                  "utf-8",
                  "utf-8-sig"
                ],
                "description": "CSV/TSV outputs only; UTF-8 or UTF-8 with BOM. Default UTF-8."
              },
              "delimiter": {
                "type": "string",
                "enum": [
                  ",",
                  ";"
                ],
                "description": "CSV output only; default comma. TSV always uses tabs."
              }
            },
            "required": []
          },
          "file_count": {
            "type": "integer",
            "minimum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "blocked": {
            "type": "boolean"
          },
          "groups": {
            "type": "array",
            "maxItems": 6,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "xlsx",
                    "xls",
                    "xlsb",
                    "ods",
                    "csv",
                    "tsv"
                  ]
                },
                "source_label": {
                  "type": "string"
                },
                "output": {
                  "type": "string",
                  "enum": [
                    "xlsx",
                    "xls",
                    "ods",
                    "csv",
                    "tsv",
                    "pdf",
                    "html"
                  ]
                },
                "output_label": {
                  "type": "string"
                },
                "expected_losses": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "possible_changes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "already_target": {
                  "type": "boolean"
                },
                "file_count": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "source",
                "source_label",
                "output",
                "output_label",
                "expected_losses",
                "possible_changes",
                "already_target",
                "file_count"
              ]
            }
          },
          "files": {
            "type": "array",
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "position": {
                  "type": "integer",
                  "minimum": 1
                },
                "format": {
                  "type": "string",
                  "enum": [
                    "xlsx",
                    "xls",
                    "xlsb",
                    "ods",
                    "csv",
                    "tsv"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "text_interpretation": {
                  "type": "boolean"
                },
                "sheets": {
                  "type": "array",
                  "maxItems": 256,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "position": {
                        "type": "integer",
                        "minimum": 1
                      },
                      "label": {
                        "type": "string",
                        "maxLength": 24
                      },
                      "rows": {
                        "type": "integer",
                        "minimum": 1
                      },
                      "columns": {
                        "type": "integer",
                        "minimum": 1
                      }
                    },
                    "required": [
                      "position",
                      "label",
                      "rows",
                      "columns"
                    ]
                  }
                },
                "preview": {
                  "type": "array",
                  "maxItems": 3,
                  "items": {
                    "type": "array",
                    "maxItems": 4,
                    "items": {
                      "type": "string",
                      "maxLength": 64
                    }
                  },
                  "description": "First sheet, at most three rows/four columns; values truncated to 64 characters. Transient literal preview; not a complete data export."
                }
              },
              "required": [
                "position",
                "format",
                "label",
                "text_interpretation",
                "sheets",
                "preview"
              ]
            }
          }
        },
        "required": [
          "token",
          "tool",
          "expires_at",
          "parameters",
          "file_count",
          "total_bytes",
          "blocked",
          "groups",
          "files"
        ]
      },
      "SpreadsheetReviewResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SpreadsheetReview"
          }
        },
        "required": [
          "data"
        ]
      },
      "SpreadsheetQuoteManifest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              },
              "required": [
                "bytes",
                "sha256"
              ]
            }
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "text_mode": {
                "type": "string",
                "enum": [
                  "auto",
                  "csv",
                  "tsv"
                ],
                "default": "auto"
              },
              "acknowledge_risks": {
                "type": "boolean",
                "const": true
              },
              "sheets": {
                "type": "array",
                "minItems": 1,
                "maxItems": 256,
                "uniqueItems": true,
                "items": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 256
                },
                "description": "Unique ascending one-based data-sheet positions, including hidden sheets in workbook order. Omit to export all sheets. Positions must exist."
              },
              "encoding": {
                "type": "string",
                "enum": [
                  "utf-8",
                  "utf-8-sig"
                ],
                "description": "CSV/TSV outputs only; UTF-8 or UTF-8 with BOM. Default UTF-8."
              },
              "delimiter": {
                "type": "string",
                "enum": [
                  ",",
                  ";"
                ],
                "description": "CSV output only; default comma. TSV always uses tabs."
              }
            },
            "required": [
              "acknowledge_risks"
            ]
          },
          "review_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          }
        },
        "required": [
          "files",
          "parameters",
          "review_token"
        ]
      },
      "SpreadsheetQuoteResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "token": {
                "type": "string",
                "minLength": 1,
                "maxLength": 524288
              },
              "tool": {
                "type": "string",
                "enum": [
                  "spreadsheet-to-csv",
                  "spreadsheet-to-html",
                  "spreadsheet-to-ods",
                  "spreadsheet-to-pdf",
                  "spreadsheet-to-tsv",
                  "spreadsheet-to-xls",
                  "spreadsheet-to-xlsx"
                ]
              },
              "cost_credits": {
                "type": "integer",
                "minimum": 1
              },
              "can_afford": {
                "type": "boolean"
              },
              "expires_at": {
                "type": "string",
                "format": "date-time"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "text_mode": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "csv",
                      "tsv"
                    ],
                    "default": "auto"
                  },
                  "acknowledge_risks": {
                    "type": "boolean",
                    "const": true
                  },
                  "sheets": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 256,
                    "uniqueItems": true,
                    "items": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 256
                    },
                    "description": "Unique ascending one-based data-sheet positions, including hidden sheets in workbook order. Omit to export all sheets. Positions must exist."
                  },
                  "encoding": {
                    "type": "string",
                    "enum": [
                      "utf-8",
                      "utf-8-sig"
                    ],
                    "description": "CSV/TSV outputs only; UTF-8 or UTF-8 with BOM. Default UTF-8."
                  },
                  "delimiter": {
                    "type": "string",
                    "enum": [
                      ",",
                      ";"
                    ],
                    "description": "CSV output only; default comma. TSV always uses tabs."
                  }
                },
                "required": [
                  "acknowledge_risks"
                ]
              },
              "file_count": {
                "type": "integer",
                "minimum": 1
              },
              "total_bytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 94371840
              },
              "wallet": {
                "$ref": "#/components/schemas/Wallet"
              },
              "review": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "groups": {
                    "type": "array",
                    "maxItems": 6,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "source": {
                          "type": "string",
                          "enum": [
                            "xlsx",
                            "xls",
                            "xlsb",
                            "ods",
                            "csv",
                            "tsv"
                          ]
                        },
                        "source_label": {
                          "type": "string"
                        },
                        "output": {
                          "type": "string",
                          "enum": [
                            "xlsx",
                            "xls",
                            "ods",
                            "csv",
                            "tsv",
                            "pdf",
                            "html"
                          ]
                        },
                        "output_label": {
                          "type": "string"
                        },
                        "expected_losses": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "possible_changes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "already_target": {
                          "type": "boolean"
                        },
                        "file_count": {
                          "type": "integer",
                          "minimum": 1
                        }
                      },
                      "required": [
                        "source",
                        "source_label",
                        "output",
                        "output_label",
                        "expected_losses",
                        "possible_changes",
                        "already_target",
                        "file_count"
                      ]
                    }
                  }
                },
                "required": [
                  "groups"
                ]
              }
            },
            "required": [
              "token",
              "tool",
              "cost_credits",
              "can_afford",
              "expires_at",
              "parameters",
              "file_count",
              "total_bytes",
              "wallet",
              "review"
            ]
          }
        },
        "required": [
          "data"
        ]
      },
      "PresentationOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "acknowledge_risks": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "acknowledge_risks"
        ]
      },
      "PresentationReviewOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "acknowledge_risks": {
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "PresentationReview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          },
          "tool": {
            "type": "string",
            "enum": [
              "presentation-to-odp",
              "presentation-to-pdf",
              "presentation-to-ppt",
              "presentation-to-pptx"
            ]
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "acknowledge_risks": {
                "type": "boolean",
                "default": false
              }
            },
            "required": []
          },
          "file_count": {
            "type": "integer",
            "minimum": 1
          },
          "total_bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 94371840
          },
          "blocked": {
            "type": "boolean"
          },
          "groups": {
            "type": "array",
            "maxItems": 6,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "source": {
                  "type": "string",
                  "enum": [
                    "pptx",
                    "ppt",
                    "odp",
                    "ppsx",
                    "potx",
                    "otp"
                  ]
                },
                "source_label": {
                  "type": "string"
                },
                "output": {
                  "type": "string",
                  "enum": [
                    "pptx",
                    "ppt",
                    "odp",
                    "pdf"
                  ]
                },
                "output_label": {
                  "type": "string"
                },
                "expected_losses": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "possible_changes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "already_target": {
                  "type": "boolean"
                },
                "file_count": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "source",
                "source_label",
                "output",
                "output_label",
                "expected_losses",
                "possible_changes",
                "already_target",
                "file_count"
              ]
            }
          },
          "files": {
            "type": "array",
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "position": {
                  "type": "integer",
                  "minimum": 1
                },
                "format": {
                  "type": "string",
                  "enum": [
                    "pptx",
                    "ppt",
                    "odp",
                    "ppsx",
                    "potx",
                    "otp"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "text_interpretation": {
                  "type": "boolean"
                }
              },
              "required": [
                "position",
                "format",
                "label",
                "text_interpretation"
              ]
            }
          }
        },
        "required": [
          "token",
          "tool",
          "expires_at",
          "parameters",
          "file_count",
          "total_bytes",
          "blocked",
          "groups",
          "files"
        ]
      },
      "PresentationReviewResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PresentationReview"
          }
        },
        "required": [
          "data"
        ]
      },
      "PresentationQuoteManifest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 52428800
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              },
              "required": [
                "bytes",
                "sha256"
              ]
            }
          },
          "parameters": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "acknowledge_risks": {
                "type": "boolean",
                "const": true
              }
            },
            "required": [
              "acknowledge_risks"
            ]
          },
          "review_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 524288
          }
        },
        "required": [
          "files",
          "parameters",
          "review_token"
        ]
      },
      "PresentationQuoteResponse": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "token": {
                "type": "string",
                "minLength": 1,
                "maxLength": 524288
              },
              "tool": {
                "type": "string",
                "enum": [
                  "presentation-to-odp",
                  "presentation-to-pdf",
                  "presentation-to-ppt",
                  "presentation-to-pptx"
                ]
              },
              "cost_credits": {
                "type": "integer",
                "minimum": 1
              },
              "can_afford": {
                "type": "boolean"
              },
              "expires_at": {
                "type": "string",
                "format": "date-time"
              },
              "parameters": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "acknowledge_risks": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "acknowledge_risks"
                ]
              },
              "file_count": {
                "type": "integer",
                "minimum": 1
              },
              "total_bytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 94371840
              },
              "wallet": {
                "$ref": "#/components/schemas/Wallet"
              },
              "review": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "groups": {
                    "type": "array",
                    "maxItems": 6,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "properties": {
                        "source": {
                          "type": "string",
                          "enum": [
                            "pptx",
                            "ppt",
                            "odp",
                            "ppsx",
                            "potx",
                            "otp"
                          ]
                        },
                        "source_label": {
                          "type": "string"
                        },
                        "output": {
                          "type": "string",
                          "enum": [
                            "pptx",
                            "ppt",
                            "odp",
                            "pdf"
                          ]
                        },
                        "output_label": {
                          "type": "string"
                        },
                        "expected_losses": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "possible_changes": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "already_target": {
                          "type": "boolean"
                        },
                        "file_count": {
                          "type": "integer",
                          "minimum": 1
                        }
                      },
                      "required": [
                        "source",
                        "source_label",
                        "output",
                        "output_label",
                        "expected_losses",
                        "possible_changes",
                        "already_target",
                        "file_count"
                      ]
                    }
                  }
                },
                "required": [
                  "groups"
                ]
              }
            },
            "required": [
              "token",
              "tool",
              "cost_credits",
              "can_afford",
              "expires_at",
              "parameters",
              "file_count",
              "total_bytes",
              "wallet",
              "review"
            ]
          }
        },
        "required": [
          "data"
        ]
      },
      "FlowDefinition": {
        "type": "object",
        "properties": {
          "input_count": {
            "type": "integer",
            "enum": [
              1,
              2
            ]
          },
          "steps": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "items": {
              "type": "object",
              "properties": {
                "tool": {
                  "type": "string",
                  "enum": [
                    "flatten-pdf",
                    "compress-pdf",
                    "repair-pdf",
                    "ocr-pdf",
                    "rotate-pdf",
                    "crop-pdf",
                    "page-numbers-pdf",
                    "compare-pdf",
                    "pdf-to-jpg",
                    "pdf-to-png",
                    "pdf-to-docx",
                    "pdf-to-xlsx",
                    "pdf-to-pptx"
                  ]
                },
                "parameters": {
                  "type": "object",
                  "description": "Tool-specific options returned by the flow tools endpoint; existing tool parameter validation applies. Compare flatten must be absent or false."
                }
              },
              "required": [
                "tool",
                "parameters"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "input_count",
          "steps"
        ],
        "additionalProperties": false
      },
      "Flow": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 120
          },
          "published": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "minimum": 1
          },
          "definition": {
            "type": "object",
            "properties": {
              "input_count": {
                "type": "integer",
                "enum": [
                  1,
                  2
                ]
              },
              "steps": {
                "type": "array",
                "minItems": 1,
                "maxItems": 10,
                "items": {
                  "type": "object",
                  "properties": {
                    "tool": {
                      "type": "string",
                      "enum": [
                        "flatten-pdf",
                        "compress-pdf",
                        "repair-pdf",
                        "ocr-pdf",
                        "rotate-pdf",
                        "crop-pdf",
                        "page-numbers-pdf",
                        "compare-pdf",
                        "pdf-to-jpg",
                        "pdf-to-png",
                        "pdf-to-docx",
                        "pdf-to-xlsx",
                        "pdf-to-pptx"
                      ]
                    },
                    "parameters": {
                      "type": "object",
                      "description": "Tool-specific options returned by the flow tools endpoint; existing tool parameter validation applies. Compare flatten must be absent or false."
                    }
                  },
                  "required": [
                    "tool",
                    "parameters"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "input_count",
              "steps"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "name",
          "published",
          "version",
          "definition"
        ],
        "additionalProperties": false
      },
      "FlowQuote": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "flow_id": {
            "type": "string",
            "format": "uuid"
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "estimated_credits": {
            "type": "integer",
            "minimum": 0
          },
          "maximum_credits": {
            "type": "integer",
            "minimum": 0
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer",
                  "minimum": 0
                },
                "lane": {
                  "type": "integer",
                  "minimum": 0
                },
                "tool": {
                  "type": "string",
                  "enum": [
                    "flatten-pdf",
                    "compress-pdf",
                    "repair-pdf",
                    "ocr-pdf",
                    "rotate-pdf",
                    "crop-pdf",
                    "page-numbers-pdf",
                    "compare-pdf",
                    "pdf-to-jpg",
                    "pdf-to-png",
                    "pdf-to-docx",
                    "pdf-to-xlsx",
                    "pdf-to-pptx"
                  ]
                },
                "estimated_credits": {
                  "type": "integer",
                  "minimum": 0
                },
                "maximum_credits": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "required": [
                "step",
                "lane",
                "tool",
                "estimated_credits",
                "maximum_credits"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "flow_id",
          "version",
          "estimated_credits",
          "maximum_credits",
          "expires_at",
          "steps"
        ],
        "additionalProperties": false
      },
      "FlowRun": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "flow_id": {
            "type": "string",
            "format": "uuid"
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "paused",
              "succeeded",
              "failed",
              "cancelled"
            ]
          },
          "status_label": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "maximum_credits": {
            "type": "integer",
            "minimum": 0
          },
          "charged_credits": {
            "type": "integer",
            "minimum": 0
          },
          "reserved_credits": {
            "type": "integer",
            "minimum": 0
          },
          "submitted_via": {
            "type": "string",
            "enum": [
              "web",
              "api"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "completed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "steps": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "integer",
                  "minimum": 0
                },
                "lane": {
                  "type": "integer",
                  "minimum": 0
                },
                "tool": {
                  "type": "string",
                  "enum": [
                    "flatten-pdf",
                    "compress-pdf",
                    "repair-pdf",
                    "ocr-pdf",
                    "rotate-pdf",
                    "crop-pdf",
                    "page-numbers-pdf",
                    "compare-pdf",
                    "pdf-to-jpg",
                    "pdf-to-png",
                    "pdf-to-docx",
                    "pdf-to-xlsx",
                    "pdf-to-pptx"
                  ]
                },
                "name": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "waiting",
                    "queued",
                    "running",
                    "succeeded",
                    "failed",
                    "cancelled"
                  ]
                },
                "status_label": {
                  "type": "string"
                },
                "job": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Job"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "step",
                "lane",
                "tool",
                "name",
                "status",
                "status_label",
                "job"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "flow_id",
          "version",
          "name",
          "status",
          "status_label",
          "message",
          "maximum_credits",
          "charged_credits",
          "reserved_credits",
          "submitted_via",
          "created_at",
          "completed_at",
          "steps"
        ],
        "additionalProperties": false
      },
      "FlowSaveRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "definition": {
            "type": "object",
            "properties": {
              "input_count": {
                "type": "integer",
                "enum": [
                  1,
                  2
                ]
              },
              "steps": {
                "type": "array",
                "minItems": 1,
                "maxItems": 10,
                "items": {
                  "type": "object",
                  "properties": {
                    "tool": {
                      "type": "string",
                      "enum": [
                        "flatten-pdf",
                        "compress-pdf",
                        "repair-pdf",
                        "ocr-pdf",
                        "rotate-pdf",
                        "crop-pdf",
                        "page-numbers-pdf",
                        "compare-pdf",
                        "pdf-to-jpg",
                        "pdf-to-png",
                        "pdf-to-docx",
                        "pdf-to-xlsx",
                        "pdf-to-pptx"
                      ]
                    },
                    "parameters": {
                      "type": "object",
                      "description": "Tool-specific options returned by the flow tools endpoint; existing tool parameter validation applies. Compare flatten must be absent or false."
                    }
                  },
                  "required": [
                    "tool",
                    "parameters"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "input_count",
              "steps"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "name",
          "definition"
        ],
        "additionalProperties": false
      },
      "FlowQuoteRequest": {
        "type": "object",
        "properties": {
          "files": {
            "type": "array",
            "minItems": 1,
            "maxItems": 2,
            "items": {
              "type": "object",
              "properties": {
                "bytes": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 104857600
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[0-9a-f]{64}$"
                }
              },
              "required": [
                "bytes",
                "sha256"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "files"
        ],
        "additionalProperties": false
      },
      "FlowResumeRequest": {
        "type": "object",
        "properties": {
          "confirmed_credits": {
            "type": "integer",
            "minimum": 1
          },
          "acknowledge_risks": {
            "const": true
          }
        },
        "required": [
          "confirmed_credits",
          "acknowledge_risks"
        ],
        "additionalProperties": false
      },
      "PreparedUpload": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "const": "ready"
          },
          "source_bytes": {
            "type": "integer",
            "minimum": 0
          },
          "file": {
            "type": "object",
            "properties": {
              "format": {
                "type": "string"
              },
              "content_type": {
                "type": "string"
              },
              "width": {
                "type": "integer",
                "minimum": 0
              },
              "height": {
                "type": "integer",
                "minimum": 0
              },
              "pages": {
                "type": "integer",
                "minimum": 0
              },
              "encrypted": {
                "type": "boolean"
              },
              "slides": {
                "type": "integer",
                "minimum": 0
              },
              "sheets": {
                "type": "integer",
                "minimum": 0
              },
              "bytes": {
                "type": "integer",
                "minimum": 0
              },
              "cleaning": {
                "enum": [
                  "validated_only",
                  "rebuilt_without_metadata"
                ]
              },
              "limitations": {
                "type": "string"
              },
              "safety_guaranteed": {
                "const": false
              }
            },
            "required": [
              "format",
              "content_type",
              "bytes",
              "cleaning",
              "limitations",
              "safety_guaranteed"
            ],
            "additionalProperties": false
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "id",
          "status",
          "source_bytes",
          "file",
          "expires_at"
        ],
        "additionalProperties": false
      },
      "VerifiedFileInfo": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string"
          },
          "content_type": {
            "type": "string"
          },
          "width": {
            "type": "integer",
            "minimum": 0
          },
          "height": {
            "type": "integer",
            "minimum": 0
          },
          "pages": {
            "type": "integer",
            "minimum": 0
          },
          "encrypted": {
            "type": "boolean"
          },
          "slides": {
            "type": "integer",
            "minimum": 0
          },
          "sheets": {
            "type": "integer",
            "minimum": 0
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "cleaning": {
            "enum": [
              "validated_only",
              "rebuilt_without_metadata"
            ]
          },
          "limitations": {
            "type": "string"
          },
          "safety_guaranteed": {
            "const": false
          }
        },
        "required": [
          "format",
          "content_type",
          "bytes",
          "cleaning",
          "limitations",
          "safety_guaranteed"
        ],
        "additionalProperties": false
      },
      "ImageBatch": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "enum": [
              "processing",
              "succeeded",
              "partial"
            ]
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "integer",
                  "minimum": 0
                },
                "source_format": {
                  "type": "string"
                },
                "job_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "status": {
                  "enum": [
                    "queued",
                    "running",
                    "succeeded",
                    "failed",
                    "cancelled"
                  ]
                },
                "credits": {
                  "type": "integer",
                  "minimum": 0
                },
                "job_url": {
                  "type": "string"
                }
              },
              "required": [
                "position",
                "source_format",
                "job_id",
                "status",
                "credits",
                "job_url"
              ],
              "additionalProperties": false
            }
          },
          "download_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "total_credits": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "id",
          "status",
          "items",
          "download_url",
          "total_credits"
        ],
        "additionalProperties": false
      },
      "ImageBatchQuoteRequest": {
        "type": "object",
        "properties": {
          "upload_ids": {
            "type": "array",
            "minItems": 1,
            "maxItems": 20,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "output_format": {
            "enum": [
              "pdf",
              "jpg",
              "png",
              "webp",
              "avif",
              "tiff",
              "bmp",
              "gif",
              "ico"
            ]
          },
          "parameters": {
            "type": "object",
            "description": "Existing destination-tool options. Omit or use {} for defaults."
          }
        },
        "required": [
          "upload_ids",
          "output_format"
        ],
        "additionalProperties": false
      },
      "ImageBatchSubmitRequest": {
        "type": "object",
        "properties": {
          "quote_token": {
            "type": "string"
          }
        },
        "required": [
          "quote_token"
        ],
        "additionalProperties": false
      },
      "ImageBatchQuote": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "integer",
                  "minimum": 0
                },
                "upload_id": {
                  "type": "string",
                  "format": "uuid"
                },
                "source_format": {
                  "type": "string"
                },
                "output_format": {
                  "enum": [
                    "pdf",
                    "jpg",
                    "png",
                    "webp",
                    "avif",
                    "tiff",
                    "bmp",
                    "gif",
                    "ico"
                  ]
                },
                "bytes": {
                  "type": "integer",
                  "minimum": 0
                },
                "credits": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "position",
                "upload_id",
                "source_format",
                "output_format",
                "bytes",
                "credits"
              ],
              "additionalProperties": false
            }
          },
          "total_credits": {
            "type": "integer",
            "minimum": 0
          },
          "can_afford": {
            "type": "boolean"
          },
          "expires_in_seconds": {
            "const": 900
          },
          "notice": {
            "type": "string"
          }
        },
        "required": [
          "token",
          "rows",
          "total_credits",
          "can_afford",
          "expires_in_seconds",
          "notice"
        ],
        "additionalProperties": false
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "error"
        ],
        "additionalProperties": false,
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false,
            "properties": {
              "code": {
                "type": "string",
                "example": "invalid_api_key",
                "description": "upload_rejected means the shared Upload and Clean stage could not verify a multipart file. No downstream job is accepted for that request."
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "Wallet": {
        "type": "object",
        "required": [
          "balance_credits",
          "reserved_credits",
          "available_credits",
          "spent_credits"
        ],
        "additionalProperties": false,
        "properties": {
          "balance_credits": {
            "type": "integer"
          },
          "reserved_credits": {
            "type": "integer",
            "minimum": 0
          },
          "available_credits": {
            "type": "integer"
          },
          "spent_credits": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "WalletResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Wallet"
          }
        }
      },
      "ToolSummary": {
        "type": "object",
        "required": [
          "slug",
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "slug": {
            "type": "string",
            "example": "merge-pdf"
          },
          "name": {
            "type": "string",
            "example": "Merge PDF"
          }
        }
      },
      "JobLinks": {
        "type": "object",
        "required": [
          "self",
          "results",
          "cancel"
        ],
        "additionalProperties": false,
        "properties": {
          "self": {
            "type": "string",
            "format": "uri-reference"
          },
          "results": {
            "type": "string",
            "format": "uri-reference"
          },
          "cancel": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        }
      },
      "Job": {
        "type": "object",
        "required": [
          "id",
          "tool",
          "status",
          "status_label",
          "failure",
          "accepted_credits",
          "credit_state",
          "submitted_via",
          "submitted_at",
          "started_at",
          "completed_at",
          "cancellation_requested",
          "links"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "tool": {
            "$ref": "#/components/schemas/ToolSummary"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued",
              "running",
              "succeeded",
              "failed",
              "cancelled"
            ]
          },
          "status_label": {
            "type": "string"
          },
          "failure": {
            "type": [
              "object",
              "null"
            ],
            "required": [
              "message",
              "next_step"
            ],
            "additionalProperties": false,
            "properties": {
              "message": {
                "type": "string"
              },
              "next_step": {
                "type": "string"
              }
            },
            "description": "Curated customer-safe reason and recovery suggestion for failed jobs; null for other statuses. Unknown failures receive a generic explanation. Never contains internal codes or exception details."
          },
          "accepted_credits": {
            "type": "integer",
            "minimum": 1
          },
          "credit_state": {
            "type": "string",
            "enum": [
              "reserved",
              "used",
              "released"
            ]
          },
          "submitted_via": {
            "type": "string",
            "enum": [
              "api",
              "web"
            ]
          },
          "submitted_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "completed_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "cancellation_requested": {
            "type": "boolean"
          },
          "links": {
            "$ref": "#/components/schemas/JobLinks"
          }
        }
      },
      "JobResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Job"
          }
        }
      },
      "JobSubmissionResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Job"
          },
          "meta": {
            "type": "object",
            "required": [
              "created"
            ],
            "additionalProperties": false,
            "properties": {
              "created": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "JobMutationResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Job"
          },
          "meta": {
            "type": "object",
            "required": [
              "changed"
            ],
            "additionalProperties": false,
            "properties": {
              "changed": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "JobListResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Job"
            }
          },
          "meta": {
            "type": "object",
            "required": [
              "page",
              "page_size",
              "pages",
              "total"
            ],
            "additionalProperties": false,
            "properties": {
              "page": {
                "type": "integer",
                "minimum": 1
              },
              "page_size": {
                "type": "integer",
                "minimum": 1
              },
              "pages": {
                "type": "integer",
                "minimum": 1
              },
              "total": {
                "type": "integer",
                "minimum": 0
              }
            }
          }
        }
      },
      "ResultLinks": {
        "type": "object",
        "required": [
          "download",
          "delete"
        ],
        "additionalProperties": false,
        "properties": {
          "download": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "delete": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        }
      },
      "Result": {
        "type": "object",
        "required": [
          "id",
          "filename",
          "content_type",
          "bytes",
          "status",
          "created_at",
          "expires_at",
          "links"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "filename": {
            "type": "string",
            "example": "merged.pdf"
          },
          "content_type": {
            "type": "string",
            "example": "application/pdf"
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "status": {
            "type": "string",
            "enum": [
              "available",
              "unavailable",
              "expired",
              "deleted"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "links": {
            "$ref": "#/components/schemas/ResultLinks"
          }
        }
      },
      "ResultListResponse": {
        "type": "object",
        "required": [
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Result"
            }
          }
        }
      },
      "ResultDeletionResponse": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "id",
              "status"
            ],
            "additionalProperties": false,
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "status": {
                "type": "string",
                "const": "deleted"
              }
            }
          },
          "meta": {
            "type": "object",
            "required": [
              "changed"
            ],
            "additionalProperties": false,
            "properties": {
              "changed": {
                "type": "boolean"
              }
            }
          }
        }
      }
    }
  }
}