@giveitsmaller/contracts 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/accepted-options/accepted-options.json +263 -1
  2. package/accepted-options/image-output-routes.json +69 -17
  3. package/asyncapi/events.yaml +8 -4
  4. package/availability/availability.json +507 -51
  5. package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
  6. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  7. package/dist/openapi/models/AccountLimits.d.ts +1 -1
  8. package/dist/openapi/models/AccountLimits.js +1 -1
  9. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  10. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  11. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  12. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  13. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  14. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  15. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  17. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  18. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  19. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  20. package/dist/openapi/models/AuthErrorType.js +1 -1
  21. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  22. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  23. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  24. package/dist/openapi/models/AvailabilityValue.js +1 -1
  25. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  26. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  27. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  28. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  29. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  30. package/dist/openapi/models/CallbackEventType.js +1 -1
  31. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  32. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  33. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  34. package/dist/openapi/models/CompositionPlan.js +1 -1
  35. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  36. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  37. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  38. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  39. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  40. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  41. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  42. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  43. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  44. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  45. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  46. package/dist/openapi/models/ConnectionSource.js +1 -1
  47. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  48. package/dist/openapi/models/ContactRequest.js +1 -1
  49. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  50. package/dist/openapi/models/ContactSubject.js +1 -1
  51. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  52. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  53. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  54. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  55. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  56. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  57. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  58. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  59. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  60. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  61. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  62. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  63. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  64. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  65. package/dist/openapi/models/CreditTransaction.d.ts +1 -1
  66. package/dist/openapi/models/CreditTransaction.js +1 -1
  67. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  68. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  69. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  70. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  71. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  72. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  73. package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
  74. package/dist/openapi/models/CreditsUsageResponse.js +1 -1
  75. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  76. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  77. package/dist/openapi/models/Delivery.d.ts +1 -1
  78. package/dist/openapi/models/Delivery.js +1 -1
  79. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  80. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  81. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  82. package/dist/openapi/models/DeliveryPlan.js +1 -1
  83. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  84. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  85. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  86. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  87. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  88. package/dist/openapi/models/DeliverySelection.js +1 -1
  89. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  90. package/dist/openapi/models/DownloadBundle.js +1 -1
  91. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  92. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  93. package/dist/openapi/models/EndpointProjection.d.ts +1 -1
  94. package/dist/openapi/models/EndpointProjection.js +1 -1
  95. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  96. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  97. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  98. package/dist/openapi/models/EstimateQuality.js +1 -1
  99. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  100. package/dist/openapi/models/EstimateRange.js +1 -1
  101. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  102. package/dist/openapi/models/ExternalDestination.js +1 -1
  103. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  104. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  105. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  106. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  107. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  108. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  109. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  110. package/dist/openapi/models/ExternalImportToken.js +1 -1
  111. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  112. package/dist/openapi/models/ExternalSource.js +1 -1
  113. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  114. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  115. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  116. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  117. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  118. package/dist/openapi/models/FeatureViolation.js +1 -1
  119. package/dist/openapi/models/ForgotPasswordRequest.d.ts +1 -1
  120. package/dist/openapi/models/ForgotPasswordRequest.js +1 -1
  121. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  122. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  123. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  124. package/dist/openapi/models/JobDefinition.js +1 -1
  125. package/dist/openapi/models/JobDownload.d.ts +1 -1
  126. package/dist/openapi/models/JobDownload.js +1 -1
  127. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  128. package/dist/openapi/models/JobInputV2.js +1 -1
  129. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  130. package/dist/openapi/models/JobMediaClass.js +1 -1
  131. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  132. package/dist/openapi/models/JobOutputSource.js +1 -1
  133. package/dist/openapi/models/JobResponse.d.ts +1 -1
  134. package/dist/openapi/models/JobResponse.js +1 -1
  135. package/dist/openapi/models/JobStatus.d.ts +1 -1
  136. package/dist/openapi/models/JobStatus.js +1 -1
  137. package/dist/openapi/models/JobType.d.ts +1 -1
  138. package/dist/openapi/models/JobType.js +1 -1
  139. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  140. package/dist/openapi/models/LivenessResponse.js +1 -1
  141. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  142. package/dist/openapi/models/LoginUser200Response.js +1 -1
  143. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  144. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  145. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  146. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  147. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  148. package/dist/openapi/models/LoginUserRequest.js +1 -1
  149. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  150. package/dist/openapi/models/MetadataResponse.js +1 -1
  151. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  152. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  153. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  154. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  155. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  156. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  157. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  158. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  159. package/dist/openapi/models/MimeGroupSchema.d.ts +1 -1
  160. package/dist/openapi/models/MimeGroupSchema.js +1 -1
  161. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  162. package/dist/openapi/models/MultiInputSource.js +1 -1
  163. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  164. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  165. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  166. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  167. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  168. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  169. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  170. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  171. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  172. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  173. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  174. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  175. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  176. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  177. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  178. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  179. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  180. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  181. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  182. package/dist/openapi/models/MultipartPartListing.js +1 -1
  183. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  184. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  185. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  186. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  187. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  188. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  189. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  190. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  191. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  192. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  193. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  194. package/dist/openapi/models/OperationDefinition.js +1 -1
  195. package/dist/openapi/models/OperationDownload.d.ts +1 -1
  196. package/dist/openapi/models/OperationDownload.js +1 -1
  197. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  198. package/dist/openapi/models/OperationInputModel.js +1 -1
  199. package/dist/openapi/models/OperationResponse.d.ts +1 -1
  200. package/dist/openapi/models/OperationResponse.js +1 -1
  201. package/dist/openapi/models/OperationResult.d.ts +24 -1
  202. package/dist/openapi/models/OperationResult.js +3 -1
  203. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  204. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  205. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  206. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  207. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  208. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  209. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  210. package/dist/openapi/models/OperationStatus.js +1 -1
  211. package/dist/openapi/models/OperationType.d.ts +1 -1
  212. package/dist/openapi/models/OperationType.js +1 -1
  213. package/dist/openapi/models/OperationsSchemaResponse.d.ts +1 -1
  214. package/dist/openapi/models/OperationsSchemaResponse.js +1 -1
  215. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
  216. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
  217. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  218. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  219. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  220. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  221. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  222. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  223. package/dist/openapi/models/OptionSchema.d.ts +1 -1
  224. package/dist/openapi/models/OptionSchema.js +1 -1
  225. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  226. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  227. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
  228. package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
  229. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  230. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  231. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  232. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  233. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  234. package/dist/openapi/models/ProcessingClass.js +1 -1
  235. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  236. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  237. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  238. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  239. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  240. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  241. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  242. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  243. package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
  244. package/dist/openapi/models/ProcessingClassHint.js +1 -1
  245. package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
  246. package/dist/openapi/models/ProcessingClassReason.js +1 -1
  247. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  248. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  249. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  250. package/dist/openapi/models/ProcessingPlan.js +1 -1
  251. package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
  252. package/dist/openapi/models/ProcessingPlanJob.js +1 -1
  253. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  254. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  255. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  256. package/dist/openapi/models/ReadinessResponse.js +1 -1
  257. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  258. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  259. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  260. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  261. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  262. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  263. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  264. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  265. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  266. package/dist/openapi/models/RetryResponse.js +1 -1
  267. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  268. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  269. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  270. package/dist/openapi/models/SseCompletionBase.js +1 -1
  271. package/dist/openapi/models/SseEventType.d.ts +1 -1
  272. package/dist/openapi/models/SseEventType.js +1 -1
  273. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  274. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  275. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  276. package/dist/openapi/models/SseJobFailedData.js +1 -1
  277. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  278. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  279. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  280. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  281. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  282. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  283. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
  284. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  285. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  286. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  287. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  288. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  289. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  290. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  291. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  292. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  293. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +24 -1
  294. package/dist/openapi/models/SseSingleOutputCompletion.js +3 -1
  295. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  296. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  297. package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
  298. package/dist/openapi/models/TierRestrictionKind.js +1 -1
  299. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  300. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  301. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  302. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  303. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  304. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  305. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  306. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  307. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  308. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  309. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  310. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  311. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  312. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  313. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  314. package/dist/openapi/models/UploadFile403Response.js +1 -1
  315. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  316. package/dist/openapi/models/UploadFile422Response.js +1 -1
  317. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  318. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  319. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  320. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  321. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  322. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  323. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  324. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  325. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  326. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  327. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  328. package/dist/openapi/models/UploadResponse.js +1 -1
  329. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  330. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  331. package/dist/openapi/models/UploadSource.d.ts +1 -1
  332. package/dist/openapi/models/UploadSource.js +1 -1
  333. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  334. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  335. package/dist/openapi/models/UploadThresholds.d.ts +1 -1
  336. package/dist/openapi/models/UploadThresholds.js +1 -1
  337. package/dist/openapi/models/UserTier.d.ts +1 -1
  338. package/dist/openapi/models/UserTier.js +1 -1
  339. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  340. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  341. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  342. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  343. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  344. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  345. package/dist/openapi/models/WarningType.d.ts +1 -1
  346. package/dist/openapi/models/WarningType.js +1 -1
  347. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  348. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  349. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  350. package/dist/openapi/models/WebhookPayload.js +1 -1
  351. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  352. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  353. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  354. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  355. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  356. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  357. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  358. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  359. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  360. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  361. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  362. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  363. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  364. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  365. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  366. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  367. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  368. package/dist/openapi/models/WorkflowEdge.js +1 -1
  369. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  370. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  371. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  372. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  373. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  374. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  375. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  376. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  377. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  378. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  379. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  380. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  381. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  382. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  383. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  384. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  385. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  386. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  387. package/dist/openapi/models/WorkflowSource.d.ts +1 -1
  388. package/dist/openapi/models/WorkflowSource.js +1 -1
  389. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  390. package/dist/openapi/models/WorkflowStatus.js +1 -1
  391. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  392. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  393. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  394. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  395. package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
  396. package/dist/openapi/models/WorkflowSummary.js +1 -1
  397. package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
  398. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  399. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  400. package/dist/openapi/models/WorkflowWarning.js +1 -1
  401. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  402. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  403. package/dist/openapi/runtime.d.ts +1 -1
  404. package/dist/openapi/runtime.js +1 -1
  405. package/dist/operations/compress.d.ts +60 -14
  406. package/dist/operations/compress.js +43 -4
  407. package/dist/operations/compress.metadata.js +111 -8
  408. package/dist/operations/convert.d.ts +54 -0
  409. package/dist/operations/convert.js +42 -0
  410. package/dist/operations/convert.metadata.js +65 -0
  411. package/openapi/api.yaml +23 -1
  412. package/operation-capabilities/operation-capabilities.json +19 -2
  413. package/operations/schemas/compress.yaml +384 -93
  414. package/operations/schemas/convert.yaml +190 -2
  415. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "capabilities_version": 121,
2
+ "capabilities_version": 130,
3
3
  "endpoints": {
4
4
  "DELETE /api/auth/api-keys/{apiKeyId}": {
5
5
  "auth": "required",
@@ -1125,7 +1125,7 @@
1125
1125
  "logic": "or",
1126
1126
  "width": "set"
1127
1127
  },
1128
- "description": "Resize mode. max = fit within bounds (preserves aspect ratio, no crop), crop/scale = exact dimensions. Applies only when width or height is set, on whichever Output route runs.",
1128
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set, on whichever Output route runs.",
1129
1129
  "honored_on": [
1130
1130
  "same_format",
1131
1131
  "format_change"
@@ -1147,25 +1147,56 @@
1147
1147
  "min": 1,
1148
1148
  "type": "integer"
1149
1149
  },
1150
+ "keep_metadata": {
1151
+ "availability": "planned",
1152
+ "depends_on": {
1153
+ "metadata": "strip"
1154
+ },
1155
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1156
+ "honored_on": [
1157
+ "same_format"
1158
+ ],
1159
+ "items": {
1160
+ "type": "string"
1161
+ },
1162
+ "type": "array",
1163
+ "uniqueItems": true
1164
+ },
1150
1165
  "metadata": {
1151
- "default": "all",
1152
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1166
+ "default": "strip",
1167
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1153
1168
  "honored_on": [
1154
1169
  "same_format"
1155
1170
  ],
1171
+ "per_value_availability": {
1172
+ "all": {
1173
+ "availability": "deprecated"
1174
+ }
1175
+ },
1156
1176
  "type": "enum",
1157
1177
  "values": [
1158
- "all",
1159
- "keep"
1178
+ "strip",
1179
+ "keep",
1180
+ "all"
1160
1181
  ]
1161
1182
  },
1162
1183
  "output_format": {
1163
1184
  "default": "original",
1164
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1185
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1186
+ "per_value_availability": {
1187
+ "auto": {
1188
+ "availability": "planned"
1189
+ },
1190
+ "smallest": {
1191
+ "availability": "planned"
1192
+ }
1193
+ },
1165
1194
  "type": "enum",
1166
1195
  "values": [
1167
1196
  "original",
1168
- "webp"
1197
+ "webp",
1198
+ "auto",
1199
+ "smallest"
1169
1200
  ]
1170
1201
  },
1171
1202
  "quality": {
@@ -1179,7 +1210,7 @@
1179
1210
  "type": "integer"
1180
1211
  },
1181
1212
  "width": {
1182
- "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven image resize engine (Lanczos, shared with thumbnail-images) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1213
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven convert resize engine (Lanczos; the API routes Output resize through the convert worker, BOTH routes \u2014 the compress optimiser has no resize) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1183
1214
  "honored_on": [
1184
1215
  "same_format",
1185
1216
  "format_change"
@@ -1207,6 +1238,18 @@
1207
1238
  "min": 1,
1208
1239
  "type": "integer"
1209
1240
  },
1241
+ "encoding_mode": {
1242
+ "default": "quality",
1243
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort + original-wins). AVIF encodes are slow, so the loop caps iterations (a 6-iteration cap, ~18s worst case). Optimiser (same_format) route.",
1244
+ "honored_on": [
1245
+ "same_format"
1246
+ ],
1247
+ "type": "enum",
1248
+ "values": [
1249
+ "quality",
1250
+ "target_size"
1251
+ ]
1252
+ },
1210
1253
  "fit": {
1211
1254
  "default": "max",
1212
1255
  "depends_on": {
@@ -1214,7 +1257,7 @@
1214
1257
  "logic": "or",
1215
1258
  "width": "set"
1216
1259
  },
1217
- "description": "Resize mode. max = fit within bounds (preserves aspect ratio, no crop), crop/scale = exact dimensions. Applies only when width or height is set, on whichever Output route runs.",
1260
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set, on whichever Output route runs.",
1218
1261
  "honored_on": [
1219
1262
  "same_format",
1220
1263
  "format_change"
@@ -1237,28 +1280,47 @@
1237
1280
  "type": "integer"
1238
1281
  },
1239
1282
  "metadata": {
1240
- "default": "all",
1241
- "description": "Metadata handling. `all` = strip all EXIF/IPTC/XMP (the only supported value). `keep` is NOT offered for AVIF \u2014 ravif re-encodes from pixels and cannot preserve metadata (the worker rejects `keep` as invalid_options).",
1283
+ "default": "strip",
1284
+ "description": "Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default, the only supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to `strip`; the API lowers it at the worker boundary). `keep` is NOT offered for AVIF \u2014 ravif re-encodes from pixels and cannot preserve metadata (the worker rejects `keep` as invalid_options).",
1242
1285
  "honored_on": [
1243
1286
  "same_format"
1244
1287
  ],
1288
+ "per_value_availability": {
1289
+ "all": {
1290
+ "availability": "deprecated"
1291
+ }
1292
+ },
1245
1293
  "type": "enum",
1246
1294
  "values": [
1295
+ "strip",
1247
1296
  "all"
1248
1297
  ]
1249
1298
  },
1250
1299
  "output_format": {
1251
1300
  "default": "original",
1252
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1301
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1302
+ "per_value_availability": {
1303
+ "auto": {
1304
+ "availability": "planned"
1305
+ },
1306
+ "smallest": {
1307
+ "availability": "planned"
1308
+ }
1309
+ },
1253
1310
  "type": "enum",
1254
1311
  "values": [
1255
1312
  "original",
1256
- "webp"
1313
+ "webp",
1314
+ "auto",
1315
+ "smallest"
1257
1316
  ]
1258
1317
  },
1259
1318
  "quality": {
1260
1319
  "default": 80,
1261
- "description": "Compression quality (1 = smallest file, 100 = best quality).",
1320
+ "depends_on": {
1321
+ "encoding_mode": "quality"
1322
+ },
1323
+ "description": "Compression quality (1 = smallest file, 100 = best quality). Active in `quality` mode (default); in `target_size` mode the encode-measure loop owns quality, so this option is inactive.",
1262
1324
  "honored_on": [
1263
1325
  "same_format"
1264
1326
  ],
@@ -1266,8 +1328,19 @@
1266
1328
  "min": 1,
1267
1329
  "type": "integer"
1268
1330
  },
1331
+ "target_size_bytes": {
1332
+ "depends_on": {
1333
+ "encoding_mode": "target_size"
1334
+ },
1335
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1336
+ "honored_on": [
1337
+ "same_format"
1338
+ ],
1339
+ "min": 1024,
1340
+ "type": "integer"
1341
+ },
1269
1342
  "width": {
1270
- "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven image resize engine (Lanczos, shared with thumbnail-images) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1343
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven convert resize engine (Lanczos; the API routes Output resize through the convert worker, BOTH routes \u2014 the compress optimiser has no resize) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1271
1344
  "honored_on": [
1272
1345
  "same_format",
1273
1346
  "format_change"
@@ -1284,6 +1357,30 @@
1284
1357
  "image/jpeg"
1285
1358
  ],
1286
1359
  "options": {
1360
+ "chroma_subsampling": {
1361
+ "description": "JPEG chroma subsampling \u2014 the colour-resolution/size trade-off. `420` (4:2:0) = smallest, chroma at quarter resolution (default-ish for web photos); `422` (4:2:2) = half-horizontal; `444` (4:4:4) = full chroma (largest, best for sharp colour edges / text). JPEG ONLY (declared on image_jpeg only \u2014 ravif hardcodes 4:4:4, libwebp lossy locks 4:2:0). String values (the worker strict-matches strings). STABLE \u2014 worker-proven on staging (lambdas PR #264, deployed git-f2bef85: output JPEG SOF luma sampling bytes verified 0x22/0x21/0x11 for 420/422/444). INCOMPATIBLE with `lossless` (any chroma value): lossless JPEG is a DCT-coefficient copy and cannot resample chroma \u2014 see the chroma_subsampling.lossless_conflict constraint.",
1362
+ "honored_on": [
1363
+ "same_format"
1364
+ ],
1365
+ "type": "enum",
1366
+ "values": [
1367
+ "420",
1368
+ "422",
1369
+ "444"
1370
+ ]
1371
+ },
1372
+ "encoding_mode": {
1373
+ "default": "quality",
1374
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort below floor + original-wins, all proven). Optimiser (same_format) route.",
1375
+ "honored_on": [
1376
+ "same_format"
1377
+ ],
1378
+ "type": "enum",
1379
+ "values": [
1380
+ "quality",
1381
+ "target_size"
1382
+ ]
1383
+ },
1287
1384
  "fit": {
1288
1385
  "default": "max",
1289
1386
  "depends_on": {
@@ -1291,7 +1388,7 @@
1291
1388
  "logic": "or",
1292
1389
  "width": "set"
1293
1390
  },
1294
- "description": "Resize mode. max = fit within bounds (preserves aspect ratio, no crop), crop/scale = exact dimensions. Applies only when width or height is set, on whichever Output route runs.",
1391
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set, on whichever Output route runs.",
1295
1392
  "honored_on": [
1296
1393
  "same_format",
1297
1394
  "format_change"
@@ -1313,33 +1410,67 @@
1313
1410
  "min": 1,
1314
1411
  "type": "integer"
1315
1412
  },
1413
+ "keep_metadata": {
1414
+ "availability": "planned",
1415
+ "depends_on": {
1416
+ "metadata": "strip"
1417
+ },
1418
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1419
+ "honored_on": [
1420
+ "same_format"
1421
+ ],
1422
+ "items": {
1423
+ "type": "string"
1424
+ },
1425
+ "type": "array",
1426
+ "uniqueItems": true
1427
+ },
1316
1428
  "lossless": {
1317
1429
  "default": false,
1318
- "description": "Lossless JPEG re-optimisation (optimiser path): optimises the Huffman tables WITHOUT re-encoding pixels \u2014 bit-preserving on the pixel data, no quality loss (it cannot recover detail a lossy JPEG already lost). STABLE \u2014 the compress-image worker honours the `lossless` bool (un-parked 2026-06-23). Optimiser (same_format) route only.",
1430
+ "depends_on": {
1431
+ "encoding_mode": "quality"
1432
+ },
1433
+ "description": "Lossless JPEG re-optimisation (optimiser path): optimises the Huffman tables WITHOUT re-encoding pixels \u2014 bit-preserving on the pixel data, no quality loss (it cannot recover detail a lossy JPEG already lost). STABLE \u2014 the compress-image worker honours the `lossless` bool (un-parked 2026-06-23). Only in `quality` mode \u2014 incompatible with `target_size` (the byte-budget loop is inherently lossy). Optimiser (same_format) route only.",
1319
1434
  "honored_on": [
1320
1435
  "same_format"
1321
1436
  ],
1322
1437
  "type": "boolean"
1323
1438
  },
1324
1439
  "metadata": {
1325
- "default": "all",
1326
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1440
+ "default": "strip",
1441
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1327
1442
  "honored_on": [
1328
1443
  "same_format"
1329
1444
  ],
1445
+ "per_value_availability": {
1446
+ "all": {
1447
+ "availability": "deprecated"
1448
+ }
1449
+ },
1330
1450
  "type": "enum",
1331
1451
  "values": [
1332
- "all",
1333
- "keep"
1452
+ "strip",
1453
+ "keep",
1454
+ "all"
1334
1455
  ]
1335
1456
  },
1336
1457
  "output_format": {
1337
1458
  "default": "original",
1338
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1459
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1460
+ "per_value_availability": {
1461
+ "auto": {
1462
+ "availability": "planned"
1463
+ },
1464
+ "smallest": {
1465
+ "availability": "planned"
1466
+ }
1467
+ },
1339
1468
  "type": "enum",
1340
1469
  "values": [
1341
1470
  "original",
1342
- "webp"
1471
+ "webp",
1472
+ "auto",
1473
+ "smallest"
1343
1474
  ]
1344
1475
  },
1345
1476
  "progressive": {
@@ -1352,7 +1483,10 @@
1352
1483
  },
1353
1484
  "quality": {
1354
1485
  "default": 80,
1355
- "description": "Compression quality (1 = smallest file, 100 = best quality).",
1486
+ "depends_on": {
1487
+ "encoding_mode": "quality"
1488
+ },
1489
+ "description": "Compression quality (1 = smallest file, 100 = best quality). Active in `quality` mode (default); in `target_size` mode the encode-measure loop owns quality, so this option is inactive.",
1356
1490
  "honored_on": [
1357
1491
  "same_format"
1358
1492
  ],
@@ -1360,8 +1494,19 @@
1360
1494
  "min": 1,
1361
1495
  "type": "integer"
1362
1496
  },
1497
+ "target_size_bytes": {
1498
+ "depends_on": {
1499
+ "encoding_mode": "target_size"
1500
+ },
1501
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1502
+ "honored_on": [
1503
+ "same_format"
1504
+ ],
1505
+ "min": 1024,
1506
+ "type": "integer"
1507
+ },
1363
1508
  "width": {
1364
- "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven image resize engine (Lanczos, shared with thumbnail-images) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1509
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven convert resize engine (Lanczos; the API routes Output resize through the convert worker, BOTH routes \u2014 the compress optimiser has no resize) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1365
1510
  "honored_on": [
1366
1511
  "same_format",
1367
1512
  "format_change"
@@ -1385,7 +1530,7 @@
1385
1530
  "logic": "or",
1386
1531
  "width": "set"
1387
1532
  },
1388
- "description": "Resize mode. max = fit within bounds (preserves aspect ratio, no crop), crop/scale = exact dimensions. Applies only when width or height is set, on whichever Output route runs.",
1533
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set, on whichever Output route runs.",
1389
1534
  "honored_on": [
1390
1535
  "same_format",
1391
1536
  "format_change"
@@ -1407,6 +1552,21 @@
1407
1552
  "min": 1,
1408
1553
  "type": "integer"
1409
1554
  },
1555
+ "keep_metadata": {
1556
+ "availability": "planned",
1557
+ "depends_on": {
1558
+ "metadata": "strip"
1559
+ },
1560
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1561
+ "honored_on": [
1562
+ "same_format"
1563
+ ],
1564
+ "items": {
1565
+ "type": "string"
1566
+ },
1567
+ "type": "array",
1568
+ "uniqueItems": true
1569
+ },
1410
1570
  "lossy": {
1411
1571
  "availability": "planned",
1412
1572
  "default": false,
@@ -1417,15 +1577,21 @@
1417
1577
  "type": "boolean"
1418
1578
  },
1419
1579
  "metadata": {
1420
- "default": "all",
1421
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1580
+ "default": "strip",
1581
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1422
1582
  "honored_on": [
1423
1583
  "same_format"
1424
1584
  ],
1585
+ "per_value_availability": {
1586
+ "all": {
1587
+ "availability": "deprecated"
1588
+ }
1589
+ },
1425
1590
  "type": "enum",
1426
1591
  "values": [
1427
- "all",
1428
- "keep"
1592
+ "strip",
1593
+ "keep",
1594
+ "all"
1429
1595
  ]
1430
1596
  },
1431
1597
  "optimization_level": {
@@ -1440,11 +1606,21 @@
1440
1606
  },
1441
1607
  "output_format": {
1442
1608
  "default": "original",
1443
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1609
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1610
+ "per_value_availability": {
1611
+ "auto": {
1612
+ "availability": "planned"
1613
+ },
1614
+ "smallest": {
1615
+ "availability": "planned"
1616
+ }
1617
+ },
1444
1618
  "type": "enum",
1445
1619
  "values": [
1446
1620
  "original",
1447
- "webp"
1621
+ "webp",
1622
+ "auto",
1623
+ "smallest"
1448
1624
  ]
1449
1625
  },
1450
1626
  "quality": {
@@ -1458,7 +1634,7 @@
1458
1634
  "type": "integer"
1459
1635
  },
1460
1636
  "width": {
1461
- "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven image resize engine (Lanczos, shared with thumbnail-images) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1637
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven convert resize engine (Lanczos; the API routes Output resize through the convert worker, BOTH routes \u2014 the compress optimiser has no resize) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1462
1638
  "honored_on": [
1463
1639
  "same_format",
1464
1640
  "format_change"
@@ -1475,23 +1651,39 @@
1475
1651
  ],
1476
1652
  "options": {
1477
1653
  "metadata": {
1478
- "default": "all",
1479
- "description": "Metadata handling. `all` = strip all metadata (the only supported value). `keep` is NOT offered for SVG \u2014 SVGO optimises the markup and cannot preserve a metadata block (the worker rejects `keep` as invalid_options).",
1654
+ "default": "strip",
1655
+ "description": "Metadata handling. `strip` = remove all metadata (default, the only supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to `strip`; the API lowers it at the worker boundary). `keep` is NOT offered for SVG \u2014 SVGO optimises the markup and cannot preserve a metadata block (the worker rejects `keep` as invalid_options).",
1480
1656
  "honored_on": [
1481
1657
  "same_format"
1482
1658
  ],
1659
+ "per_value_availability": {
1660
+ "all": {
1661
+ "availability": "deprecated"
1662
+ }
1663
+ },
1483
1664
  "type": "enum",
1484
1665
  "values": [
1666
+ "strip",
1485
1667
  "all"
1486
1668
  ]
1487
1669
  },
1488
1670
  "output_format": {
1489
1671
  "default": "original",
1490
- "description": "Output format. original = keep input format (default); webp = recompress to WebP. Other format changes are the convert operation's job. See FORMAT.md.",
1672
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP. Concrete format changes are the convert operation's job. `auto` / `smallest` are PLANNED auto-format directives (server picks the best/smallest candidate format, reported via the result `mime_type`) \u2014 selection strategies, not concrete targets, planned until the API logic + worker proof land. See FORMAT.md.",
1673
+ "per_value_availability": {
1674
+ "auto": {
1675
+ "availability": "planned"
1676
+ },
1677
+ "smallest": {
1678
+ "availability": "planned"
1679
+ }
1680
+ },
1491
1681
  "type": "enum",
1492
1682
  "values": [
1493
1683
  "original",
1494
- "webp"
1684
+ "webp",
1685
+ "auto",
1686
+ "smallest"
1495
1687
  ]
1496
1688
  },
1497
1689
  "quality": {
@@ -1512,6 +1704,18 @@
1512
1704
  "image/webp"
1513
1705
  ],
1514
1706
  "options": {
1707
+ "encoding_mode": {
1708
+ "default": "quality",
1709
+ "description": "Compression mode (mirrors compress.video). `quality` = the `quality` slider drives the encode (default). `target_size` = hit a byte budget via the worker's encode-measure-binary-search loop \u2014 STABLE (worker-proven on staging, lambdas git-870a7c2: re-encode under target + best-effort below floor + original-wins, all proven). Optimiser (same_format) route.",
1710
+ "honored_on": [
1711
+ "same_format"
1712
+ ],
1713
+ "type": "enum",
1714
+ "values": [
1715
+ "quality",
1716
+ "target_size"
1717
+ ]
1718
+ },
1515
1719
  "fit": {
1516
1720
  "default": "max",
1517
1721
  "depends_on": {
@@ -1519,7 +1723,7 @@
1519
1723
  "logic": "or",
1520
1724
  "width": "set"
1521
1725
  },
1522
- "description": "Resize mode. max = fit within bounds (preserves aspect ratio, no crop), crop/scale = exact dimensions. Applies only when width or height is set, on whichever Output route runs.",
1726
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set, on whichever Output route runs.",
1523
1727
  "honored_on": [
1524
1728
  "same_format",
1525
1729
  "format_change"
@@ -1541,38 +1745,75 @@
1541
1745
  "min": 1,
1542
1746
  "type": "integer"
1543
1747
  },
1748
+ "keep_metadata": {
1749
+ "availability": "planned",
1750
+ "depends_on": {
1751
+ "metadata": "strip"
1752
+ },
1753
+ "description": "Selective per-category metadata keep (optimiser/same_format route): preserve ONLY these categories and strip the rest \u2014 refines the strip path (`metadata: strip`). Valid categories: `copyright`, `gps` (location), `date` (capture time); combinable. `planned` \u2014 the worker does not yet do selective keep (use `metadata: keep` to preserve everything), so the API returns feature_not_available until lambdas proves it.",
1754
+ "honored_on": [
1755
+ "same_format"
1756
+ ],
1757
+ "items": {
1758
+ "type": "string"
1759
+ },
1760
+ "type": "array",
1761
+ "uniqueItems": true
1762
+ },
1544
1763
  "lossless": {
1545
1764
  "default": false,
1546
- "description": "Encode WebP losslessly (optimiser path): a genuine lossless WebP encode. STABLE \u2014 the compress-image worker honours the `lossless` bool (un-parked 2026-06-23). Note a lossless encode can be LARGER than a lossy one at the same visual quality. Optimiser (same_format) route only.",
1765
+ "depends_on": {
1766
+ "encoding_mode": "quality"
1767
+ },
1768
+ "description": "Encode WebP losslessly (optimiser path): a genuine lossless WebP encode. STABLE \u2014 the compress-image worker honours the `lossless` bool (un-parked 2026-06-23). Note a lossless encode can be LARGER than a lossy one at the same visual quality. Only in `quality` mode \u2014 incompatible with `target_size` (the byte-budget loop is inherently lossy). Optimiser (same_format) route only.",
1547
1769
  "honored_on": [
1548
1770
  "same_format"
1549
1771
  ],
1550
1772
  "type": "boolean"
1551
1773
  },
1552
1774
  "metadata": {
1553
- "default": "all",
1554
- "description": "Metadata handling (optimiser/same_format route). `all` = strip all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). Any other value is rejected as invalid_options.",
1775
+ "default": "strip",
1776
+ "description": "Metadata handling (optimiser/same_format route). `strip` = remove all EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP \u2014 STABLE (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token; `all` reading as \"strip all\" was counterintuitive) \u2014 still accepted, emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`\u2192`all` at the worker boundary. Any other value is rejected as invalid_options.",
1555
1777
  "honored_on": [
1556
1778
  "same_format"
1557
1779
  ],
1780
+ "per_value_availability": {
1781
+ "all": {
1782
+ "availability": "deprecated"
1783
+ }
1784
+ },
1558
1785
  "type": "enum",
1559
1786
  "values": [
1560
- "all",
1561
- "keep"
1787
+ "strip",
1788
+ "keep",
1789
+ "all"
1562
1790
  ]
1563
1791
  },
1564
1792
  "output_format": {
1565
1793
  "default": "original",
1566
- "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Other format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. See FORMAT.md.",
1794
+ "description": "Output format. original = keep input format (default); webp = recompress to WebP \u2014 the one live compress+format target (proven on staging). Concrete format changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress. `auto` / `smallest` are PLANNED auto-format directives \u2014 the server encodes to several candidate formats and returns the best (`auto` = the most suitable; `smallest` = the absolute fewest bytes), reporting the chosen format via the result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert cannot express \"pick the smallest\"), so they live here and stay `planned` until the API try-all-return-smallest logic + worker proof land. See FORMAT.md.",
1795
+ "per_value_availability": {
1796
+ "auto": {
1797
+ "availability": "planned"
1798
+ },
1799
+ "smallest": {
1800
+ "availability": "planned"
1801
+ }
1802
+ },
1567
1803
  "type": "enum",
1568
1804
  "values": [
1569
1805
  "original",
1570
- "webp"
1806
+ "webp",
1807
+ "auto",
1808
+ "smallest"
1571
1809
  ]
1572
1810
  },
1573
1811
  "quality": {
1574
1812
  "default": 80,
1575
- "description": "Compression quality (1 = smallest file, 100 = best quality).",
1813
+ "depends_on": {
1814
+ "encoding_mode": "quality"
1815
+ },
1816
+ "description": "Compression quality (1 = smallest file, 100 = best quality). Active in `quality` mode (default); in `target_size` mode the encode-measure loop owns quality, so this option is inactive.",
1576
1817
  "honored_on": [
1577
1818
  "same_format"
1578
1819
  ],
@@ -1580,8 +1821,19 @@
1580
1821
  "min": 1,
1581
1822
  "type": "integer"
1582
1823
  },
1824
+ "target_size_bytes": {
1825
+ "depends_on": {
1826
+ "encoding_mode": "target_size"
1827
+ },
1828
+ "description": "Target output size in bytes (min 1024 = 1 KiB). The image encode-measure loop binary-searches quality to land at or under the target; best-effort if the target is unreachable at min quality (the result reports the chosen quality + whether the target was met). STABLE (worker-proven, lambdas git-870a7c2). Optimiser (same_format) route.",
1829
+ "honored_on": [
1830
+ "same_format"
1831
+ ],
1832
+ "min": 1024,
1833
+ "type": "integer"
1834
+ },
1583
1835
  "width": {
1584
- "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven image resize engine (Lanczos, shared with thumbnail-images) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1836
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Resize the image as part of Output (replace semantics, ONE transformed output) using the proven convert resize engine (Lanczos; the API routes Output resize through the convert worker, BOTH routes \u2014 the compress optimiser has no resize) \u2014 it is NOT the derivative `thumbnail` op. Optional; omit to keep the source dimensions.",
1585
1837
  "honored_on": [
1586
1838
  "same_format",
1587
1839
  "format_change"
@@ -1865,12 +2117,11 @@
1865
2117
  }
1866
2118
  },
1867
2119
  "image": {
2120
+ "max_output_pixels": 16000000,
1868
2121
  "mimes": [
1869
2122
  "image/jpeg",
1870
2123
  "image/png",
1871
- "image/gif",
1872
2124
  "image/webp",
1873
- "image/svg+xml",
1874
2125
  "image/tiff",
1875
2126
  "image/bmp",
1876
2127
  "image/vnd.microsoft.icon",
@@ -1889,6 +2140,46 @@
1889
2140
  "pattern": "^#[0-9a-fA-F]{6}$",
1890
2141
  "type": "string"
1891
2142
  },
2143
+ "fit": {
2144
+ "default": "max",
2145
+ "depends_on": {
2146
+ "height": "set",
2147
+ "logic": "or",
2148
+ "width": "set"
2149
+ },
2150
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and NEVER upscaling \u2014 it caps at the source dimensions. This IS the \"no-enlarge\" behaviour (there is no separate `no_enlarge` flag \u2014 the worker has no such key). `crop`/`scale` = exact dimensions (`scale` deliberately enlarges past source). Applies only when width or height is set.",
2151
+ "honored_on": [
2152
+ "format_change"
2153
+ ],
2154
+ "type": "enum",
2155
+ "values": [
2156
+ "max",
2157
+ "crop",
2158
+ "scale"
2159
+ ]
2160
+ },
2161
+ "height": {
2162
+ "description": "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Not honored for SVG input. See `width`.",
2163
+ "honored_on": [
2164
+ "format_change"
2165
+ ],
2166
+ "max": 16384,
2167
+ "min": 1,
2168
+ "type": "integer"
2169
+ },
2170
+ "metadata": {
2171
+ "availability": "planned",
2172
+ "default": "strip",
2173
+ "description": "Metadata handling on the format-change (convert/transcoder) route. `strip` = remove all EXIF/IPTC/XMP (default), `keep` = preserve. `planned` \u2014 the convert worker re-encodes from pixels and does not yet preserve metadata across a format change, so the API returns feature_not_available (rather than \"Unknown option\" on a format-change request \u2014 e2e/api flagged 2026-06-23). This is a new (planned) surface, so it carries no deprecated `all` alias \u2014 unlike compress.image.metadata, which keeps `all` for its existing callers. Stable-flip gated on lambdas proving convert-route metadata preservation; the honoured target subset may narrow (avif/heic targets re-encode and cannot keep).",
2174
+ "honored_on": [
2175
+ "format_change"
2176
+ ],
2177
+ "type": "enum",
2178
+ "values": [
2179
+ "strip",
2180
+ "keep"
2181
+ ]
2182
+ },
1892
2183
  "output_format": {
1893
2184
  "description": "Target format",
1894
2185
  "required": true,
@@ -1918,6 +2209,15 @@
1918
2209
  "max": 100,
1919
2210
  "min": 1,
1920
2211
  "type": "integer"
2212
+ },
2213
+ "width": {
2214
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). The convert worker resizes (Lanczos) before encode; single transformed output. NOT honored for SVG input (the worker rejects svg resize). Input-gated \u2014 see the resize comment above.",
2215
+ "honored_on": [
2216
+ "format_change"
2217
+ ],
2218
+ "max": 16384,
2219
+ "min": 1,
2220
+ "type": "integer"
1921
2221
  }
1922
2222
  },
1923
2223
  "per_mime_availability": {
@@ -1929,6 +2229,162 @@
1929
2229
  }
1930
2230
  }
1931
2231
  },
2232
+ "image_gif": {
2233
+ "max_output_pixels": 16000000,
2234
+ "mimes": [
2235
+ "image/gif"
2236
+ ],
2237
+ "options": {
2238
+ "background": {
2239
+ "depends_on": {
2240
+ "output_format": "jpeg"
2241
+ },
2242
+ "description": "Background colour as a 6-digit hex (`#RRGGBB`) for a transparent GIF flattened to JPEG (alpha-flatten). HEX ONLY \u2014 non-hex is rejected as `invalid_options` (see convert.image.background).",
2243
+ "honored_on": [
2244
+ "format_change"
2245
+ ],
2246
+ "pattern": "^#[0-9a-fA-F]{6}$",
2247
+ "type": "string"
2248
+ },
2249
+ "fit": {
2250
+ "default": "max",
2251
+ "depends_on": {
2252
+ "height": "set",
2253
+ "logic": "or",
2254
+ "width": "set"
2255
+ },
2256
+ "description": "Resize mode. `max` (default) = fit within bounds, preserving aspect ratio and never upscaling; `crop`/`scale` = exact dimensions. Applies only when width or height is set.",
2257
+ "honored_on": [
2258
+ "format_change"
2259
+ ],
2260
+ "type": "enum",
2261
+ "values": [
2262
+ "max",
2263
+ "crop",
2264
+ "scale"
2265
+ ]
2266
+ },
2267
+ "height": {
2268
+ "description": "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). See `width`.",
2269
+ "honored_on": [
2270
+ "format_change"
2271
+ ],
2272
+ "max": 16384,
2273
+ "min": 1,
2274
+ "type": "integer"
2275
+ },
2276
+ "metadata": {
2277
+ "availability": "planned",
2278
+ "default": "strip",
2279
+ "description": "Metadata handling on the format-change route (still-image targets). `planned` \u2014 mirrors convert.image.metadata (the convert worker does not yet preserve metadata across a format change). The video targets carry no EXIF/IPTC/XMP.",
2280
+ "honored_on": [
2281
+ "format_change"
2282
+ ],
2283
+ "type": "enum",
2284
+ "values": [
2285
+ "strip",
2286
+ "keep"
2287
+ ]
2288
+ },
2289
+ "output_format": {
2290
+ "description": "Target format. The still-image targets (jpeg/png/webp/avif/gif/tiff) take the first frame / rasterise (stable, today's gif-convert behaviour). `mp4` / `webm` are the NEW (planned) GIF\u2192VIDEO transcode targets \u2014 the animated GIF becomes a muted, play-once video (`mp4` = H.264 / yuv420p / +faststart, plays everywhere; `webm` = VP9, smaller). GIFs are silent (no audio stream); the GIF infinite-loop becomes a playback attribute (`<video loop>`) the player sets, NOT baked into the file. mp4 and webm flip planned\u2192stable independently on worker proof.",
2291
+ "per_value_availability": {
2292
+ "mp4": {
2293
+ "availability": "planned"
2294
+ },
2295
+ "webm": {
2296
+ "availability": "planned"
2297
+ }
2298
+ },
2299
+ "required": true,
2300
+ "type": "enum",
2301
+ "values": [
2302
+ "jpeg",
2303
+ "png",
2304
+ "webp",
2305
+ "avif",
2306
+ "gif",
2307
+ "tiff",
2308
+ "mp4",
2309
+ "webm"
2310
+ ]
2311
+ },
2312
+ "quality": {
2313
+ "default": 85,
2314
+ "depends_on": {
2315
+ "output_format": [
2316
+ "jpeg",
2317
+ "webp",
2318
+ "avif"
2319
+ ]
2320
+ },
2321
+ "description": "Output quality for the lossy STILL-IMAGE targets (jpeg/webp/avif). The video targets (mp4/webm) use a sensible default encode quality in v1 \u2014 there is no exposed CRF knob yet (planned-first; may be added later).",
2322
+ "honored_on": [
2323
+ "format_change"
2324
+ ],
2325
+ "max": 100,
2326
+ "min": 1,
2327
+ "type": "integer"
2328
+ },
2329
+ "width": {
2330
+ "description": "Resize-inside-Output: target width in pixels (1-16384; width*height <= max_output_pixels). Applies to the still-image targets; for the planned mp4/webm video targets, resize applicability is settled at the worker flip.",
2331
+ "honored_on": [
2332
+ "format_change"
2333
+ ],
2334
+ "max": 16384,
2335
+ "min": 1,
2336
+ "type": "integer"
2337
+ }
2338
+ }
2339
+ },
2340
+ "image_svg": {
2341
+ "mimes": [
2342
+ "image/svg+xml"
2343
+ ],
2344
+ "options": {
2345
+ "background": {
2346
+ "depends_on": {
2347
+ "output_format": "jpeg"
2348
+ },
2349
+ "description": "Background colour as a 6-digit hex (`#RRGGBB`) for transparent SVG rasterised to JPEG (alpha-flatten). HEX ONLY \u2014 non-hex is rejected as `invalid_options` (see convert.image.background).",
2350
+ "honored_on": [
2351
+ "format_change"
2352
+ ],
2353
+ "pattern": "^#[0-9a-fA-F]{6}$",
2354
+ "type": "string"
2355
+ },
2356
+ "output_format": {
2357
+ "description": "Target raster format (SVG is rasterised, then encoded).",
2358
+ "required": true,
2359
+ "type": "enum",
2360
+ "values": [
2361
+ "jpeg",
2362
+ "png",
2363
+ "webp",
2364
+ "avif",
2365
+ "gif",
2366
+ "tiff"
2367
+ ]
2368
+ },
2369
+ "quality": {
2370
+ "default": 85,
2371
+ "depends_on": {
2372
+ "output_format": [
2373
+ "jpeg",
2374
+ "webp",
2375
+ "avif"
2376
+ ]
2377
+ },
2378
+ "description": "Output quality for lossy formats",
2379
+ "honored_on": [
2380
+ "format_change"
2381
+ ],
2382
+ "max": 100,
2383
+ "min": 1,
2384
+ "type": "integer"
2385
+ }
2386
+ }
2387
+ },
1932
2388
  "video": {
1933
2389
  "mimes": [
1934
2390
  "video/mp4",
@@ -3941,7 +4397,7 @@
3941
4397
  "sole_op": true
3942
4398
  }
3943
4399
  },
3944
- "schema_version": "2.102.0",
4400
+ "schema_version": "2.111.0",
3945
4401
  "source_commit": null,
3946
4402
  "user_tier": null,
3947
4403
  "workflow_features": {