@giveitsmaller/contracts 0.40.0 → 0.42.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 (435) hide show
  1. package/accepted-options/accepted-options.json +77 -7
  2. package/accepted-options/image-output-routes.json +13 -13
  3. package/availability/availability.json +539 -150
  4. package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
  5. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  6. package/dist/openapi/models/AccountLimits.d.ts +1 -1
  7. package/dist/openapi/models/AccountLimits.js +1 -1
  8. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  9. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  10. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  11. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  12. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  13. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  14. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  15. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  16. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  17. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  18. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  19. package/dist/openapi/models/AuthErrorType.js +1 -1
  20. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  21. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  22. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  23. package/dist/openapi/models/AvailabilityValue.js +1 -1
  24. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  25. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  26. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  27. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  28. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  29. package/dist/openapi/models/CallbackEventType.js +1 -1
  30. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  31. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  32. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  33. package/dist/openapi/models/CompositionPlan.js +1 -1
  34. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  35. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  36. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  37. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  38. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  39. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  40. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  41. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  42. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  43. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  44. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  45. package/dist/openapi/models/ConnectionSource.js +1 -1
  46. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  47. package/dist/openapi/models/ContactRequest.js +1 -1
  48. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  49. package/dist/openapi/models/ContactSubject.js +1 -1
  50. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  51. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  52. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  53. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  54. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  55. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  56. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  57. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  58. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  59. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  60. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  61. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  62. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  63. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  64. package/dist/openapi/models/CreditTransaction.d.ts +1 -1
  65. package/dist/openapi/models/CreditTransaction.js +1 -1
  66. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  67. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  68. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  69. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  70. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  71. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  72. package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
  73. package/dist/openapi/models/CreditsUsageResponse.js +1 -1
  74. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  75. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  76. package/dist/openapi/models/Delivery.d.ts +1 -1
  77. package/dist/openapi/models/Delivery.js +1 -1
  78. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  79. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  80. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  81. package/dist/openapi/models/DeliveryPlan.js +1 -1
  82. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  83. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  84. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  85. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  86. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  87. package/dist/openapi/models/DeliverySelection.js +1 -1
  88. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  89. package/dist/openapi/models/DownloadBundle.js +1 -1
  90. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  91. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  92. package/dist/openapi/models/EndpointProjection.d.ts +1 -1
  93. package/dist/openapi/models/EndpointProjection.js +1 -1
  94. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  95. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  96. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  97. package/dist/openapi/models/EstimateQuality.js +1 -1
  98. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  99. package/dist/openapi/models/EstimateRange.js +1 -1
  100. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  101. package/dist/openapi/models/ExternalDestination.js +1 -1
  102. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  103. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  104. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  105. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  106. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  107. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  108. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  109. package/dist/openapi/models/ExternalImportToken.js +1 -1
  110. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  111. package/dist/openapi/models/ExternalSource.js +1 -1
  112. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  113. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  114. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  115. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  116. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  117. package/dist/openapi/models/FeatureViolation.js +1 -1
  118. package/dist/openapi/models/ForgotPasswordRequest.d.ts +1 -1
  119. package/dist/openapi/models/ForgotPasswordRequest.js +1 -1
  120. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  121. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  122. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  123. package/dist/openapi/models/JobDefinition.js +1 -1
  124. package/dist/openapi/models/JobDownload.d.ts +1 -1
  125. package/dist/openapi/models/JobDownload.js +1 -1
  126. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  127. package/dist/openapi/models/JobInputV2.js +1 -1
  128. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  129. package/dist/openapi/models/JobMediaClass.js +1 -1
  130. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  131. package/dist/openapi/models/JobOutputSource.js +1 -1
  132. package/dist/openapi/models/JobResponse.d.ts +1 -1
  133. package/dist/openapi/models/JobResponse.js +1 -1
  134. package/dist/openapi/models/JobStatus.d.ts +1 -1
  135. package/dist/openapi/models/JobStatus.js +1 -1
  136. package/dist/openapi/models/JobType.d.ts +1 -1
  137. package/dist/openapi/models/JobType.js +1 -1
  138. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  139. package/dist/openapi/models/LivenessResponse.js +1 -1
  140. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  141. package/dist/openapi/models/LoginUser200Response.js +1 -1
  142. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  143. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  144. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  145. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  146. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  147. package/dist/openapi/models/LoginUserRequest.js +1 -1
  148. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  149. package/dist/openapi/models/MetadataResponse.js +1 -1
  150. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  151. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  152. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  153. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  154. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  155. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  156. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  157. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  158. package/dist/openapi/models/MimeGroupSchema.d.ts +1 -1
  159. package/dist/openapi/models/MimeGroupSchema.js +1 -1
  160. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  161. package/dist/openapi/models/MultiInputSource.js +1 -1
  162. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  163. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  164. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  165. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  166. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  167. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  168. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  169. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  170. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  171. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  172. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  173. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  174. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  175. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  176. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  177. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  178. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  179. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  180. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  181. package/dist/openapi/models/MultipartPartListing.js +1 -1
  182. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  183. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  184. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  185. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  186. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  187. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  188. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  189. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  190. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  191. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  192. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  193. package/dist/openapi/models/OperationDefinition.js +1 -1
  194. package/dist/openapi/models/OperationDownload.d.ts +24 -1
  195. package/dist/openapi/models/OperationDownload.js +5 -1
  196. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  197. package/dist/openapi/models/OperationInputModel.js +1 -1
  198. package/dist/openapi/models/OperationResponse.d.ts +1 -1
  199. package/dist/openapi/models/OperationResponse.js +1 -1
  200. package/dist/openapi/models/OperationResult.d.ts +1 -1
  201. package/dist/openapi/models/OperationResult.js +1 -1
  202. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  203. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  204. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  205. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  206. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  207. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  208. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  209. package/dist/openapi/models/OperationStatus.js +1 -1
  210. package/dist/openapi/models/OperationType.d.ts +3 -3
  211. package/dist/openapi/models/OperationType.js +3 -3
  212. package/dist/openapi/models/OperationsSchemaResponse.d.ts +1 -1
  213. package/dist/openapi/models/OperationsSchemaResponse.js +1 -1
  214. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
  215. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
  216. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  217. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  218. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  219. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  220. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  221. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  222. package/dist/openapi/models/OptionSchema.d.ts +1 -1
  223. package/dist/openapi/models/OptionSchema.js +1 -1
  224. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  225. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  226. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
  227. package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
  228. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  229. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  230. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  231. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  232. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  233. package/dist/openapi/models/ProcessingClass.js +1 -1
  234. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  235. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  236. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  237. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  238. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  239. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  240. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  241. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  242. package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
  243. package/dist/openapi/models/ProcessingClassHint.js +1 -1
  244. package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
  245. package/dist/openapi/models/ProcessingClassReason.js +1 -1
  246. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  247. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  248. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  249. package/dist/openapi/models/ProcessingPlan.js +1 -1
  250. package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
  251. package/dist/openapi/models/ProcessingPlanJob.js +1 -1
  252. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  253. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  254. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  255. package/dist/openapi/models/ReadinessResponse.js +1 -1
  256. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  257. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  258. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  259. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  260. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  261. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  262. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  263. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  264. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  265. package/dist/openapi/models/RetryResponse.js +1 -1
  266. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  267. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  268. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  269. package/dist/openapi/models/SseCompletionBase.js +1 -1
  270. package/dist/openapi/models/SseEventType.d.ts +1 -1
  271. package/dist/openapi/models/SseEventType.js +1 -1
  272. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  273. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  274. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  275. package/dist/openapi/models/SseJobFailedData.js +1 -1
  276. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  277. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  278. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  279. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  280. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  281. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  282. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
  283. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  284. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  285. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  286. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  287. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  288. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  289. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  290. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  291. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  292. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
  293. package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
  294. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  295. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  296. package/dist/openapi/models/TierRestrictionKind.d.ts +1 -1
  297. package/dist/openapi/models/TierRestrictionKind.js +1 -1
  298. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  299. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  300. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  301. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  302. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  303. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  304. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  305. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  306. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  307. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  308. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  309. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  310. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  311. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  312. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  313. package/dist/openapi/models/UploadFile403Response.js +1 -1
  314. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  315. package/dist/openapi/models/UploadFile422Response.js +1 -1
  316. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  317. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  318. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  319. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  320. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  321. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  322. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  323. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  324. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  325. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  326. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  327. package/dist/openapi/models/UploadResponse.js +1 -1
  328. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  329. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  330. package/dist/openapi/models/UploadSource.d.ts +1 -1
  331. package/dist/openapi/models/UploadSource.js +1 -1
  332. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  333. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  334. package/dist/openapi/models/UploadThresholds.d.ts +1 -1
  335. package/dist/openapi/models/UploadThresholds.js +1 -1
  336. package/dist/openapi/models/UserTier.d.ts +1 -1
  337. package/dist/openapi/models/UserTier.js +1 -1
  338. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  339. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  340. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  341. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  342. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  343. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  344. package/dist/openapi/models/WarningType.d.ts +1 -1
  345. package/dist/openapi/models/WarningType.js +1 -1
  346. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  347. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  348. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  349. package/dist/openapi/models/WebhookPayload.js +1 -1
  350. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  351. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  352. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  353. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  354. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  355. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  356. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  357. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  358. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  359. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  360. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  361. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  362. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  363. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  364. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  365. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  366. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  367. package/dist/openapi/models/WorkflowEdge.js +1 -1
  368. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  369. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  370. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  371. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  372. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  373. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  374. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  375. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  376. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  377. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  378. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  379. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  380. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  381. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  382. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  383. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  384. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  385. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  386. package/dist/openapi/models/WorkflowSource.d.ts +1 -1
  387. package/dist/openapi/models/WorkflowSource.js +1 -1
  388. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  389. package/dist/openapi/models/WorkflowStatus.js +1 -1
  390. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  391. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  392. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  393. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  394. package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
  395. package/dist/openapi/models/WorkflowSummary.js +1 -1
  396. package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
  397. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  398. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  399. package/dist/openapi/models/WorkflowWarning.js +1 -1
  400. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  401. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  402. package/dist/openapi/runtime.d.ts +1 -1
  403. package/dist/openapi/runtime.js +1 -1
  404. package/dist/operations/audio_overlay.metadata.js +2 -2
  405. package/dist/operations/compress.metadata.js +0 -5
  406. package/dist/operations/convert.metadata.js +0 -2
  407. package/dist/operations/image_watermark.d.ts +36 -0
  408. package/dist/operations/image_watermark.js +24 -0
  409. package/dist/operations/image_watermark.metadata.js +47 -1
  410. package/dist/operations/split.metadata.js +1 -1
  411. package/dist/operations/text_watermark.d.ts +62 -0
  412. package/dist/operations/text_watermark.js +42 -0
  413. package/dist/operations/text_watermark.metadata.js +82 -0
  414. package/dist/operations/thumbnail.d.ts +19 -0
  415. package/dist/operations/thumbnail.js +12 -0
  416. package/dist/operations/thumbnail.metadata.js +29 -0
  417. package/dist/operations/video_watermark.metadata.js +1 -1
  418. package/openapi/api.yaml +22 -3
  419. package/operation-capabilities/operation-capabilities.json +1 -1
  420. package/operations/schemas/archive.yaml +1 -1
  421. package/operations/schemas/audio_overlay.yaml +9 -11
  422. package/operations/schemas/audio_to_video.yaml +7 -11
  423. package/operations/schemas/audio_watermark.yaml +1 -5
  424. package/operations/schemas/compress.yaml +322 -399
  425. package/operations/schemas/convert.yaml +68 -83
  426. package/operations/schemas/custom_luma.yaml +6 -11
  427. package/operations/schemas/image_watermark.yaml +166 -14
  428. package/operations/schemas/merge.yaml +5 -5
  429. package/operations/schemas/passthrough.yaml +4 -4
  430. package/operations/schemas/split.yaml +22 -31
  431. package/operations/schemas/text_watermark.yaml +262 -4
  432. package/operations/schemas/thumbnail.yaml +73 -3
  433. package/operations/schemas/video_text_watermark.yaml +9 -13
  434. package/operations/schemas/video_watermark.yaml +16 -21
  435. package/package.json +1 -1
@@ -100,30 +100,30 @@ operation:
100
100
  honored_on: [same_format]
101
101
  description: >-
102
102
  Compression quality (1 = smallest file, 100 = best quality). Active in
103
- `quality` mode (default); in `target_size` mode the encode-measure loop
104
- owns quality, so this option is inactive.
103
+ `quality` mode (default); in `target_size` mode the quality is chosen
104
+ automatically to hit the size budget, so this option is inactive.
105
105
  encoding_mode:
106
106
  type: enum
107
107
  values: [quality, target_size]
108
108
  default: quality
109
109
  honored_on: [same_format]
110
110
  description: >-
111
- Compression mode (mirrors compress.video). `quality` = the `quality`
112
- slider drives the encode (default). `target_size` = hit a byte budget via
113
- the worker's encode-measure-binary-search loop — STABLE (worker-proven on
114
- staging, lambdas git-870a7c2: re-encode under target + best-effort below
115
- floor + original-wins, all proven). Optimiser (same_format) route.
111
+ Compression mode. `quality` = the `quality` slider drives the encode
112
+ (default). `target_size` = automatically find the highest quality that
113
+ fits a byte budget (set via `target_size_bytes`); if the budget can't be
114
+ met even at the lowest quality, the closest result is returned, and the
115
+ original is kept if re-encoding wouldn't be smaller.
116
116
  target_size_bytes:
117
117
  type: integer
118
118
  min: 1024
119
119
  depends_on: { encoding_mode: target_size }
120
120
  honored_on: [same_format]
121
121
  description: >-
122
- Target output size in bytes (min 1024 = 1 KiB). The image encode-measure
123
- loop binary-searches quality to land at or under the target; best-effort
124
- if the target is unreachable at min quality (the result reports the chosen
125
- quality + whether the target was met). STABLE (worker-proven, lambdas
126
- git-870a7c2). Optimiser (same_format) route.
122
+ Target output size in bytes (min 1024 = 1 KiB). The encoder searches for
123
+ the highest quality that lands at or under this size; if the target can't
124
+ be met even at the lowest quality, the closest result is returned (the
125
+ result reports the chosen quality and whether the target was met). Requires
126
+ `encoding_mode: target_size`.
127
127
  metadata:
128
128
  type: enum
129
129
  values: [strip, keep, all]
@@ -132,54 +132,47 @@ operation:
132
132
  all: { availability: deprecated }
133
133
  honored_on: [same_format]
134
134
  description: >-
135
- Metadata handling (optimiser/same_format route). `strip` = remove all
136
- EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP — STABLE
137
- (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit
138
- test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token;
139
- `all` reading as "strip all" was counterintuitive) — still accepted,
140
- emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`→`all`
141
- at the worker boundary. Any other value is rejected as invalid_options.
135
+ Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default). `keep` =
136
+ preserve EXIF, colour profile, and XMP. `all` is a DEPRECATED alias of
137
+ `strip` (kept for older callers; emits Deprecation/Sunset headers — migrate
138
+ to `strip`). Any other value is rejected.
142
139
  keep_metadata:
143
140
  type: array
144
141
  items:
145
- # items.type is `string` (not `enum`) deliberately: the valid categories
146
- # are listed below + enforced by the API at the stable-flip. SDK operation-
147
- # schema codegen does not yet support typed array-of-enum (restore `enum` +
148
- # values:[copyright,gps,date] when that lands — likely at this option's
149
- # stable-flip). Wire-identical either way (a JSON array of strings).
142
+ # JSON-Schema `enum:` (not the DSL `type: enum`) on a string item: the
143
+ # SDK operation-schema parser's valid array-item types are
144
+ # {number,integer,float,string,object} — `type: enum` is rejected, so the
145
+ # categories are carried as a JSON-Schema `enum` constraint on a string
146
+ # item. Consumers (FE) read the allowed categories structurally from the
147
+ # sidecar; SDK codegen sees a string array (the enum key is value-only) —
148
+ # wire-identical (a JSON array of strings).
150
149
  type: string
150
+ enum: [copyright, gps, date]
151
151
  uniqueItems: true
152
152
  availability: planned
153
153
  depends_on: { metadata: strip }
154
154
  honored_on: [same_format]
155
155
  description: >-
156
- Selective per-category metadata keep (optimiser/same_format route):
157
- preserve ONLY these categories and strip the rest — refines the strip
158
- path (`metadata: strip`). Valid categories: `copyright`, `gps` (location),
159
- `date` (capture time); combinable. `planned` — the worker does not yet
160
- do selective keep (use `metadata: keep` to preserve everything), so the
161
- API returns feature_not_available until lambdas proves it.
156
+ Selectively keep only certain metadata categories and strip the rest —
157
+ refines `metadata: strip`. Allowed categories: `copyright`, `gps`
158
+ (location), `date` (capture time); combinable. `planned` — selective keep
159
+ is not yet supported (use `metadata: keep` to preserve everything).
162
160
  progressive:
163
161
  type: boolean
164
162
  default: true
165
163
  honored_on: [same_format]
166
- description: "Enable progressive JPEG rendering (a low-quality preview renders first, then refines). JPEG only — the optimiser (same_format) route."
164
+ description: "Enable progressive JPEG rendering (a low-quality preview renders first, then refines). JPEG only."
167
165
  chroma_subsampling:
168
166
  type: enum
169
167
  values: ["420", "422", "444"]
170
168
  honored_on: [same_format]
171
169
  description: >-
172
170
  JPEG chroma subsampling — the colour-resolution/size trade-off.
173
- `420` (4:2:0) = smallest, chroma at quarter resolution (default-ish for
174
- web photos); `422` (4:2:2) = half-horizontal; `444` (4:4:4) = full chroma
175
- (largest, best for sharp colour edges / text). JPEG ONLY (declared on
176
- image_jpeg only — ravif hardcodes 4:4:4, libwebp lossy locks 4:2:0).
177
- String values (the worker strict-matches strings). STABLE — worker-proven
178
- on staging (lambdas PR #264, deployed git-f2bef85: output JPEG SOF luma
179
- sampling bytes verified 0x22/0x21/0x11 for 420/422/444). INCOMPATIBLE with
180
- `lossless` (any chroma value): lossless JPEG is a DCT-coefficient copy and
181
- cannot resample chroma — see the chroma_subsampling.lossless_conflict
182
- constraint.
171
+ `420` (4:2:0) = smallest, chroma at quarter resolution (typical for web
172
+ photos); `422` (4:2:2) = half horizontal resolution; `444` (4:4:4) = full
173
+ chroma (largest, best for sharp colour edges / text). JPEG only.
174
+ INCOMPATIBLE with `lossless` (any chroma value): a lossless JPEG copies the
175
+ existing coefficients and cannot resample chroma.
183
176
  output_format:
184
177
  type: enum
185
178
  values: [original, webp, auto, smallest]
@@ -189,45 +182,39 @@ operation:
189
182
  smallest: { availability: planned }
190
183
  description: >-
191
184
  Output format. original = keep input format (default); webp = recompress to
192
- WebP — the one live compress+format target (proven on staging). Concrete format
193
- changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress.
194
- `auto` / `smallest` are PLANNED auto-format directives — the server encodes to
195
- several candidate formats and returns the best (`auto` = the most suitable;
196
- `smallest` = the absolute fewest bytes), reporting the chosen format via the
197
- result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert
198
- cannot express "pick the smallest"), so they live here and stay `planned` until
199
- the API try-all-return-smallest logic + worker proof land. See FORMAT.md.
185
+ WebP. Concrete format changes (jpeg/png/avif/gif/tiff) are handled by the
186
+ convert operation. `auto` / `smallest` are PLANNED auto-format directives —
187
+ the server encodes to several candidate formats and returns the best
188
+ (`auto` = the most suitable; `smallest` = the absolute fewest bytes),
189
+ reporting the chosen format via the result `mime_type`. They are selection
190
+ strategies, not concrete targets, and stay `planned` until supported. See
191
+ FORMAT.md.
200
192
  lossless:
201
193
  type: boolean
202
194
  default: false
203
195
  depends_on: { encoding_mode: quality }
204
196
  honored_on: [same_format]
205
197
  description: >-
206
- Lossless JPEG re-optimisation (optimiser path): optimises the Huffman
207
- tables WITHOUT re-encoding pixels — bit-preserving on the pixel data,
208
- no quality loss (it cannot recover detail a lossy JPEG already lost).
209
- STABLE — the compress-image worker honours the `lossless` bool
210
- (un-parked 2026-06-23). Only in `quality` mode — incompatible with
211
- `target_size` (the byte-budget loop is inherently lossy). Optimiser
212
- (same_format) route only.
198
+ Lossless JPEG re-optimisation: re-packs the file WITHOUT re-encoding the
199
+ pixels — no quality loss (it cannot recover detail a lossy JPEG already
200
+ lost). Only in `quality` mode — incompatible with `target_size` (hitting a
201
+ byte budget is inherently lossy).
213
202
  width:
214
203
  type: integer
215
204
  min: 1
216
205
  max: 16384
217
206
  honored_on: [same_format, format_change]
218
207
  description: >-
219
- Resize-inside-Output: target width in pixels (1-16384; width*height <=
220
- max_output_pixels). Resize the image as part of Output (replace semantics,
221
- ONE transformed output) using the proven convert resize engine (Lanczos;
222
- the API routes Output resize through the convert worker, BOTH routes —
223
- the compress optimiser has no resize) — it is NOT the derivative `thumbnail` op.
224
- Optional; omit to keep the source dimensions.
208
+ Target width in pixels (1-16384; width × height must not exceed the
209
+ group's maximum output area). Resizes the image as part of the operation
210
+ (one transformed output, replacing the source). Optional; omit to keep the
211
+ source dimensions.
225
212
  height:
226
213
  type: integer
227
214
  min: 1
228
215
  max: 16384
229
216
  honored_on: [same_format, format_change]
230
- description: "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Resize replaces the image (one output). Optional — see `width`."
217
+ description: "Target height in pixels (1-16384; width × height within the group's max output area). Resizes the image (one output). Optional — see `width`."
231
218
  fit:
232
219
  type: enum
233
220
  values: [max, crop, scale]
@@ -235,12 +222,11 @@ operation:
235
222
  depends_on: { width: set, height: set, logic: or }
236
223
  honored_on: [same_format, format_change]
237
224
  description: >-
238
- Resize mode. `max` (default) = fit within bounds, preserving aspect ratio
239
- and NEVER upscaling — it caps at the source dimensions. This IS the
240
- "no-enlarge" behaviour (there is no separate `no_enlarge` flag — the
241
- worker has no such key). `crop`/`scale` = exact dimensions (`scale`
242
- deliberately enlarges past source). Applies only when width or height is
243
- set, on whichever Output route runs.
225
+ Resize mode. `max` (default) = fit within the given bounds, preserving
226
+ aspect ratio and never upscaling (caps at the source dimensions — this is
227
+ the "no-enlarge" behaviour). `crop`/`scale` = exact dimensions (`scale`
228
+ deliberately enlarges past the source). Applies only when width or height
229
+ is set.
244
230
  color_profile:
245
231
  type: enum
246
232
  values: [keep, srgb, strip]
@@ -248,26 +234,21 @@ operation:
248
234
  availability: planned
249
235
  honored_on: [same_format, format_change]
250
236
  description: >-
251
- ICC colour-profile handling — its OWN control, DECOUPLED from `metadata`
252
- (stripping metadata must NOT silently shift colours; that coupling is the
253
- correctness bug this fixes). `keep` (default) = preserve the embedded
254
- profile; `srgb` = convert to sRGB (also handles CMYK→sRGB); `strip` = drop
255
- the profile (smallest — only when the consumer manages colour itself).
256
- `planned` — the worker does not yet honour it (today the default strips ICC
257
- during metadata-strip; the fix preserves it). Applies on BOTH Output routes
258
- (optimiser preserves; transcoder preserves/converts). Worker-proven flip.
237
+ Colour-profile handling — a dedicated control, separate from `metadata` so
238
+ that stripping metadata never silently shifts colours. `keep` (default) =
239
+ preserve the embedded colour profile; `srgb` = convert to sRGB (also
240
+ handles CMYK → sRGB); `strip` = drop the profile (smallest — only when the
241
+ consumer manages colour itself). `planned` — not yet supported.
259
242
  auto_orient:
260
243
  type: boolean
261
244
  default: true
262
- availability: planned
263
245
  honored_on: [same_format, format_change]
264
246
  description: >-
265
247
  Bake EXIF orientation into the pixels (honour the camera/device rotation
266
248
  tag) so the output displays upright everywhere, then drop the now-redundant
267
- orientation tag. `planned` — a restored control (was removed): the worker
268
- must apply the EXIF-orientation transform before encode on both Output
269
- routes. Default `true` (a behaviour change, proven planned-first). No-op for
270
- inputs without an orientation tag.
249
+ orientation tag. Default `true`; no-op for inputs without an orientation
250
+ tag. On an already-rotated image the pixels are re-encoded (near-lossless),
251
+ which can drop other (non-orientation) metadata even with `metadata: keep`.
271
252
 
272
253
  image_png:
273
254
  mimes:
@@ -289,40 +270,38 @@ operation:
289
270
  all: { availability: deprecated }
290
271
  honored_on: [same_format]
291
272
  description: >-
292
- Metadata handling (optimiser/same_format route). `strip` = remove all
293
- EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP — STABLE
294
- (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit
295
- test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token;
296
- `all` reading as "strip all" was counterintuitive) — still accepted,
297
- emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`→`all`
298
- at the worker boundary. Any other value is rejected as invalid_options.
273
+ Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default). `keep` =
274
+ preserve EXIF, colour profile, and XMP. `all` is a DEPRECATED alias of
275
+ `strip` (kept for older callers; emits Deprecation/Sunset headers — migrate
276
+ to `strip`). Any other value is rejected.
299
277
  keep_metadata:
300
278
  type: array
301
279
  items:
302
- # items.type is `string` (not `enum`) deliberately: the valid categories
303
- # are listed below + enforced by the API at the stable-flip. SDK operation-
304
- # schema codegen does not yet support typed array-of-enum (restore `enum` +
305
- # values:[copyright,gps,date] when that lands — likely at this option's
306
- # stable-flip). Wire-identical either way (a JSON array of strings).
280
+ # JSON-Schema `enum:` (not the DSL `type: enum`) on a string item: the
281
+ # SDK operation-schema parser's valid array-item types are
282
+ # {number,integer,float,string,object} — `type: enum` is rejected, so the
283
+ # categories are carried as a JSON-Schema `enum` constraint on a string
284
+ # item. Consumers (FE) read the allowed categories structurally from the
285
+ # sidecar; SDK codegen sees a string array (the enum key is value-only) —
286
+ # wire-identical (a JSON array of strings).
307
287
  type: string
288
+ enum: [copyright, gps, date]
308
289
  uniqueItems: true
309
290
  availability: planned
310
291
  depends_on: { metadata: strip }
311
292
  honored_on: [same_format]
312
293
  description: >-
313
- Selective per-category metadata keep (optimiser/same_format route):
314
- preserve ONLY these categories and strip the rest — refines the strip
315
- path (`metadata: strip`). Valid categories: `copyright`, `gps` (location),
316
- `date` (capture time); combinable. `planned` — the worker does not yet
317
- do selective keep (use `metadata: keep` to preserve everything), so the
318
- API returns feature_not_available until lambdas proves it.
294
+ Selectively keep only certain metadata categories and strip the rest —
295
+ refines `metadata: strip`. Allowed categories: `copyright`, `gps`
296
+ (location), `date` (capture time); combinable. `planned` — selective keep
297
+ is not yet supported (use `metadata: keep` to preserve everything).
319
298
  optimization_level:
320
299
  type: integer
321
300
  min: 0
322
301
  max: 6
323
302
  default: 3
324
303
  honored_on: [same_format]
325
- description: "PNG optimization effort (0-6, oxipng). Higher = smaller file, slower encode. Default 3. Optimiser (same_format) route."
304
+ description: "PNG optimization effort (0-6). Higher = smaller file, slower encode. Default 3."
326
305
  output_format:
327
306
  type: enum
328
307
  values: [original, webp, auto, smallest]
@@ -332,43 +311,37 @@ operation:
332
311
  smallest: { availability: planned }
333
312
  description: >-
334
313
  Output format. original = keep input format (default); webp = recompress to
335
- WebP — the one live compress+format target (proven on staging). Concrete format
336
- changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress.
337
- `auto` / `smallest` are PLANNED auto-format directives — the server encodes to
338
- several candidate formats and returns the best (`auto` = the most suitable;
339
- `smallest` = the absolute fewest bytes), reporting the chosen format via the
340
- result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert
341
- cannot express "pick the smallest"), so they live here and stay `planned` until
342
- the API try-all-return-smallest logic + worker proof land. See FORMAT.md.
314
+ WebP. Concrete format changes (jpeg/png/avif/gif/tiff) are handled by the
315
+ convert operation. `auto` / `smallest` are PLANNED auto-format directives —
316
+ the server encodes to several candidate formats and returns the best
317
+ (`auto` = the most suitable; `smallest` = the absolute fewest bytes),
318
+ reporting the chosen format via the result `mime_type`. They are selection
319
+ strategies, not concrete targets, and stay `planned` until supported. See
320
+ FORMAT.md.
343
321
  lossy:
344
322
  type: boolean
345
323
  default: false
346
324
  availability: planned
347
325
  honored_on: [same_format]
348
326
  description: >-
349
- Lossy PNG palette quantization (pngquant/imagequant-class) — a large
350
- saving for flat-colour PNGs. `planned` AND LICENSING-GATED: do not
351
- stable-flip until the lambdas licensing spike confirms a permissive
352
- quantizer path (libimagequant/pngquant is GPL-or-commercial). Optimiser
353
- (same_format) route only.
327
+ Lossy PNG palette quantization — a large saving for flat-colour PNGs.
328
+ `planned` — not yet supported.
354
329
  width:
355
330
  type: integer
356
331
  min: 1
357
332
  max: 16384
358
333
  honored_on: [same_format, format_change]
359
334
  description: >-
360
- Resize-inside-Output: target width in pixels (1-16384; width*height <=
361
- max_output_pixels). Resize the image as part of Output (replace semantics,
362
- ONE transformed output) using the proven convert resize engine (Lanczos;
363
- the API routes Output resize through the convert worker, BOTH routes —
364
- the compress optimiser has no resize) — it is NOT the derivative `thumbnail` op.
365
- Optional; omit to keep the source dimensions.
335
+ Target width in pixels (1-16384; width × height must not exceed the
336
+ group's maximum output area). Resizes the image as part of the operation
337
+ (one transformed output, replacing the source). Optional; omit to keep the
338
+ source dimensions.
366
339
  height:
367
340
  type: integer
368
341
  min: 1
369
342
  max: 16384
370
343
  honored_on: [same_format, format_change]
371
- description: "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Resize replaces the image (one output). Optional — see `width`."
344
+ description: "Target height in pixels (1-16384; width × height within the group's max output area). Resizes the image (one output). Optional — see `width`."
372
345
  fit:
373
346
  type: enum
374
347
  values: [max, crop, scale]
@@ -376,12 +349,11 @@ operation:
376
349
  depends_on: { width: set, height: set, logic: or }
377
350
  honored_on: [same_format, format_change]
378
351
  description: >-
379
- Resize mode. `max` (default) = fit within bounds, preserving aspect ratio
380
- and NEVER upscaling — it caps at the source dimensions. This IS the
381
- "no-enlarge" behaviour (there is no separate `no_enlarge` flag — the
382
- worker has no such key). `crop`/`scale` = exact dimensions (`scale`
383
- deliberately enlarges past source). Applies only when width or height is
384
- set, on whichever Output route runs.
352
+ Resize mode. `max` (default) = fit within the given bounds, preserving
353
+ aspect ratio and never upscaling (caps at the source dimensions — this is
354
+ the "no-enlarge" behaviour). `crop`/`scale` = exact dimensions (`scale`
355
+ deliberately enlarges past the source). Applies only when width or height
356
+ is set.
385
357
  color_profile:
386
358
  type: enum
387
359
  values: [keep, srgb, strip]
@@ -389,26 +361,21 @@ operation:
389
361
  availability: planned
390
362
  honored_on: [same_format, format_change]
391
363
  description: >-
392
- ICC colour-profile handling — its OWN control, DECOUPLED from `metadata`
393
- (stripping metadata must NOT silently shift colours; that coupling is the
394
- correctness bug this fixes). `keep` (default) = preserve the embedded
395
- profile; `srgb` = convert to sRGB (also handles CMYK→sRGB); `strip` = drop
396
- the profile (smallest — only when the consumer manages colour itself).
397
- `planned` — the worker does not yet honour it (today the default strips ICC
398
- during metadata-strip; the fix preserves it). Applies on BOTH Output routes
399
- (optimiser preserves; transcoder preserves/converts). Worker-proven flip.
364
+ Colour-profile handling — a dedicated control, separate from `metadata` so
365
+ that stripping metadata never silently shifts colours. `keep` (default) =
366
+ preserve the embedded colour profile; `srgb` = convert to sRGB (also
367
+ handles CMYK → sRGB); `strip` = drop the profile (smallest — only when the
368
+ consumer manages colour itself). `planned` — not yet supported.
400
369
  auto_orient:
401
370
  type: boolean
402
371
  default: true
403
- availability: planned
404
372
  honored_on: [same_format, format_change]
405
373
  description: >-
406
374
  Bake EXIF orientation into the pixels (honour the camera/device rotation
407
375
  tag) so the output displays upright everywhere, then drop the now-redundant
408
- orientation tag. `planned` — a restored control (was removed): the worker
409
- must apply the EXIF-orientation transform before encode on both Output
410
- routes. Default `true` (a behaviour change, proven planned-first). No-op for
411
- inputs without an orientation tag.
376
+ orientation tag. Default `true`; no-op for inputs without an orientation
377
+ tag. On an already-rotated image the pixels are re-encoded (near-lossless),
378
+ which can drop other (non-orientation) metadata even with `metadata: keep`.
412
379
 
413
380
  image_avif:
414
381
  availability: beta
@@ -434,31 +401,31 @@ operation:
434
401
  honored_on: [same_format]
435
402
  description: >-
436
403
  Compression quality (1 = smallest file, 100 = best quality). Active in
437
- `quality` mode (default); in `target_size` mode the encode-measure loop
438
- owns quality, so this option is inactive.
404
+ `quality` mode (default); in `target_size` mode the quality is chosen
405
+ automatically to hit the size budget, so this option is inactive.
439
406
  encoding_mode:
440
407
  type: enum
441
408
  values: [quality, target_size]
442
409
  default: quality
443
410
  honored_on: [same_format]
444
411
  description: >-
445
- Compression mode (mirrors compress.video). `quality` = the `quality`
446
- slider drives the encode (default). `target_size` = hit a byte budget via
447
- the worker's encode-measure-binary-search loop — STABLE (worker-proven on
448
- staging, lambdas git-870a7c2: re-encode under target + best-effort +
449
- original-wins). AVIF encodes are slow, so the loop caps iterations (a
450
- 6-iteration cap, ~18s worst case). Optimiser (same_format) route.
412
+ Compression mode. `quality` = the `quality` slider drives the encode
413
+ (default). `target_size` = automatically find the highest quality that
414
+ fits a byte budget (set via `target_size_bytes`); if the budget can't be
415
+ met even at the lowest quality, the closest result is returned, and the
416
+ original is kept if re-encoding wouldn't be smaller. AVIF encoding is
417
+ slower, so the search is bounded and may stop slightly above the budget.
451
418
  target_size_bytes:
452
419
  type: integer
453
420
  min: 1024
454
421
  depends_on: { encoding_mode: target_size }
455
422
  honored_on: [same_format]
456
423
  description: >-
457
- Target output size in bytes (min 1024 = 1 KiB). The image encode-measure
458
- loop binary-searches quality to land at or under the target; best-effort
459
- if the target is unreachable at min quality (the result reports the chosen
460
- quality + whether the target was met). STABLE (worker-proven, lambdas
461
- git-870a7c2). Optimiser (same_format) route.
424
+ Target output size in bytes (min 1024 = 1 KiB). The encoder searches for
425
+ the highest quality that lands at or under this size; if the target can't
426
+ be met even at the lowest quality, the closest result is returned (the
427
+ result reports the chosen quality and whether the target was met). Requires
428
+ `encoding_mode: target_size`.
462
429
  metadata:
463
430
  type: enum
464
431
  values: [strip, all]
@@ -469,16 +436,15 @@ operation:
469
436
  description: >-
470
437
  Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default, the only
471
438
  supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to
472
- `strip`; the API lowers it at the worker boundary). `keep` is NOT offered
473
- for AVIF — ravif re-encodes from pixels and cannot preserve metadata (the
474
- worker rejects `keep` as invalid_options).
439
+ `strip`). `keep` is NOT offered for AVIF — it is re-encoded from pixels and
440
+ cannot preserve metadata.
475
441
  avif_speed:
476
442
  type: integer
477
443
  min: 1
478
444
  max: 10
479
445
  default: 4
480
446
  honored_on: [same_format]
481
- description: "AVIF encode speed (1-10, ravif). Lower = smaller file, slower encode; higher = faster, larger. Default 4. Optimiser (same_format) route."
447
+ description: "AVIF encode speed (1-10). Lower = smaller file, slower encode; higher = faster, larger. Default 4."
482
448
  output_format:
483
449
  type: enum
484
450
  values: [original, webp, auto, smallest]
@@ -488,32 +454,29 @@ operation:
488
454
  smallest: { availability: planned }
489
455
  description: >-
490
456
  Output format. original = keep input format (default); webp = recompress to
491
- WebP — the one live compress+format target (proven on staging). Concrete format
492
- changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress.
493
- `auto` / `smallest` are PLANNED auto-format directives — the server encodes to
494
- several candidate formats and returns the best (`auto` = the most suitable;
495
- `smallest` = the absolute fewest bytes), reporting the chosen format via the
496
- result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert
497
- cannot express "pick the smallest"), so they live here and stay `planned` until
498
- the API try-all-return-smallest logic + worker proof land. See FORMAT.md.
457
+ WebP. Concrete format changes (jpeg/png/avif/gif/tiff) are handled by the
458
+ convert operation. `auto` / `smallest` are PLANNED auto-format directives —
459
+ the server encodes to several candidate formats and returns the best
460
+ (`auto` = the most suitable; `smallest` = the absolute fewest bytes),
461
+ reporting the chosen format via the result `mime_type`. They are selection
462
+ strategies, not concrete targets, and stay `planned` until supported. See
463
+ FORMAT.md.
499
464
  width:
500
465
  type: integer
501
466
  min: 1
502
467
  max: 16384
503
468
  honored_on: [same_format, format_change]
504
469
  description: >-
505
- Resize-inside-Output: target width in pixels (1-16384; width*height <=
506
- max_output_pixels). Resize the image as part of Output (replace semantics,
507
- ONE transformed output) using the proven convert resize engine (Lanczos;
508
- the API routes Output resize through the convert worker, BOTH routes —
509
- the compress optimiser has no resize) — it is NOT the derivative `thumbnail` op.
510
- Optional; omit to keep the source dimensions.
470
+ Target width in pixels (1-16384; width × height must not exceed the
471
+ group's maximum output area). Resizes the image as part of the operation
472
+ (one transformed output, replacing the source). Optional; omit to keep the
473
+ source dimensions.
511
474
  height:
512
475
  type: integer
513
476
  min: 1
514
477
  max: 16384
515
478
  honored_on: [same_format, format_change]
516
- description: "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Resize replaces the image (one output). Optional — see `width`."
479
+ description: "Target height in pixels (1-16384; width × height within the group's max output area). Resizes the image (one output). Optional — see `width`."
517
480
  fit:
518
481
  type: enum
519
482
  values: [max, crop, scale]
@@ -521,12 +484,11 @@ operation:
521
484
  depends_on: { width: set, height: set, logic: or }
522
485
  honored_on: [same_format, format_change]
523
486
  description: >-
524
- Resize mode. `max` (default) = fit within bounds, preserving aspect ratio
525
- and NEVER upscaling — it caps at the source dimensions. This IS the
526
- "no-enlarge" behaviour (there is no separate `no_enlarge` flag — the
527
- worker has no such key). `crop`/`scale` = exact dimensions (`scale`
528
- deliberately enlarges past source). Applies only when width or height is
529
- set, on whichever Output route runs.
487
+ Resize mode. `max` (default) = fit within the given bounds, preserving
488
+ aspect ratio and never upscaling (caps at the source dimensions — this is
489
+ the "no-enlarge" behaviour). `crop`/`scale` = exact dimensions (`scale`
490
+ deliberately enlarges past the source). Applies only when width or height
491
+ is set.
530
492
  color_profile:
531
493
  type: enum
532
494
  values: [keep, srgb, strip]
@@ -534,26 +496,21 @@ operation:
534
496
  availability: planned
535
497
  honored_on: [same_format, format_change]
536
498
  description: >-
537
- ICC colour-profile handling — its OWN control, DECOUPLED from `metadata`
538
- (stripping metadata must NOT silently shift colours; that coupling is the
539
- correctness bug this fixes). `keep` (default) = preserve the embedded
540
- profile; `srgb` = convert to sRGB (also handles CMYK→sRGB); `strip` = drop
541
- the profile (smallest — only when the consumer manages colour itself).
542
- `planned` — the worker does not yet honour it (today the default strips ICC
543
- during metadata-strip; the fix preserves it). Applies on BOTH Output routes
544
- (optimiser preserves; transcoder preserves/converts). Worker-proven flip.
499
+ Colour-profile handling — a dedicated control, separate from `metadata` so
500
+ that stripping metadata never silently shifts colours. `keep` (default) =
501
+ preserve the embedded colour profile; `srgb` = convert to sRGB (also
502
+ handles CMYK → sRGB); `strip` = drop the profile (smallest — only when the
503
+ consumer manages colour itself). `planned` — not yet supported.
545
504
  auto_orient:
546
505
  type: boolean
547
506
  default: true
548
- availability: planned
549
507
  honored_on: [same_format, format_change]
550
508
  description: >-
551
509
  Bake EXIF orientation into the pixels (honour the camera/device rotation
552
510
  tag) so the output displays upright everywhere, then drop the now-redundant
553
- orientation tag. `planned` — a restored control (was removed): the worker
554
- must apply the EXIF-orientation transform before encode on both Output
555
- routes. Default `true` (a behaviour change, proven planned-first). No-op for
556
- inputs without an orientation tag.
511
+ orientation tag. Default `true`; no-op for inputs without an orientation
512
+ tag. On an already-rotated image the pixels are re-encoded (near-lossless),
513
+ which can drop other (non-orientation) metadata even with `metadata: keep`.
557
514
 
558
515
  # webp split out of the former bundled image group: it is the one input that
559
516
  # carries BOTH Resize (raster, proven in thumbnail-images) AND the optimiser
@@ -573,30 +530,30 @@ operation:
573
530
  honored_on: [same_format]
574
531
  description: >-
575
532
  Compression quality (1 = smallest file, 100 = best quality). Active in
576
- `quality` mode (default); in `target_size` mode the encode-measure loop
577
- owns quality, so this option is inactive.
533
+ `quality` mode (default); in `target_size` mode the quality is chosen
534
+ automatically to hit the size budget, so this option is inactive.
578
535
  encoding_mode:
579
536
  type: enum
580
537
  values: [quality, target_size]
581
538
  default: quality
582
539
  honored_on: [same_format]
583
540
  description: >-
584
- Compression mode (mirrors compress.video). `quality` = the `quality`
585
- slider drives the encode (default). `target_size` = hit a byte budget via
586
- the worker's encode-measure-binary-search loop — STABLE (worker-proven on
587
- staging, lambdas git-870a7c2: re-encode under target + best-effort below
588
- floor + original-wins, all proven). Optimiser (same_format) route.
541
+ Compression mode. `quality` = the `quality` slider drives the encode
542
+ (default). `target_size` = automatically find the highest quality that
543
+ fits a byte budget (set via `target_size_bytes`); if the budget can't be
544
+ met even at the lowest quality, the closest result is returned, and the
545
+ original is kept if re-encoding wouldn't be smaller.
589
546
  target_size_bytes:
590
547
  type: integer
591
548
  min: 1024
592
549
  depends_on: { encoding_mode: target_size }
593
550
  honored_on: [same_format]
594
551
  description: >-
595
- Target output size in bytes (min 1024 = 1 KiB). The image encode-measure
596
- loop binary-searches quality to land at or under the target; best-effort
597
- if the target is unreachable at min quality (the result reports the chosen
598
- quality + whether the target was met). STABLE (worker-proven, lambdas
599
- git-870a7c2). Optimiser (same_format) route.
552
+ Target output size in bytes (min 1024 = 1 KiB). The encoder searches for
553
+ the highest quality that lands at or under this size; if the target can't
554
+ be met even at the lowest quality, the closest result is returned (the
555
+ result reports the chosen quality and whether the target was met). Requires
556
+ `encoding_mode: target_size`.
600
557
  metadata:
601
558
  type: enum
602
559
  values: [strip, keep, all]
@@ -605,33 +562,31 @@ operation:
605
562
  all: { availability: deprecated }
606
563
  honored_on: [same_format]
607
564
  description: >-
608
- Metadata handling (optimiser/same_format route). `strip` = remove all
609
- EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP — STABLE
610
- (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit
611
- test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token;
612
- `all` reading as "strip all" was counterintuitive) — still accepted,
613
- emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`→`all`
614
- at the worker boundary. Any other value is rejected as invalid_options.
565
+ Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default). `keep` =
566
+ preserve EXIF, colour profile, and XMP. `all` is a DEPRECATED alias of
567
+ `strip` (kept for older callers; emits Deprecation/Sunset headers — migrate
568
+ to `strip`). Any other value is rejected.
615
569
  keep_metadata:
616
570
  type: array
617
571
  items:
618
- # items.type is `string` (not `enum`) deliberately: the valid categories
619
- # are listed below + enforced by the API at the stable-flip. SDK operation-
620
- # schema codegen does not yet support typed array-of-enum (restore `enum` +
621
- # values:[copyright,gps,date] when that lands — likely at this option's
622
- # stable-flip). Wire-identical either way (a JSON array of strings).
572
+ # JSON-Schema `enum:` (not the DSL `type: enum`) on a string item: the
573
+ # SDK operation-schema parser's valid array-item types are
574
+ # {number,integer,float,string,object} — `type: enum` is rejected, so the
575
+ # categories are carried as a JSON-Schema `enum` constraint on a string
576
+ # item. Consumers (FE) read the allowed categories structurally from the
577
+ # sidecar; SDK codegen sees a string array (the enum key is value-only) —
578
+ # wire-identical (a JSON array of strings).
623
579
  type: string
580
+ enum: [copyright, gps, date]
624
581
  uniqueItems: true
625
582
  availability: planned
626
583
  depends_on: { metadata: strip }
627
584
  honored_on: [same_format]
628
585
  description: >-
629
- Selective per-category metadata keep (optimiser/same_format route):
630
- preserve ONLY these categories and strip the rest — refines the strip
631
- path (`metadata: strip`). Valid categories: `copyright`, `gps` (location),
632
- `date` (capture time); combinable. `planned` — the worker does not yet
633
- do selective keep (use `metadata: keep` to preserve everything), so the
634
- API returns feature_not_available until lambdas proves it.
586
+ Selectively keep only certain metadata categories and strip the rest —
587
+ refines `metadata: strip`. Allowed categories: `copyright`, `gps`
588
+ (location), `date` (capture time); combinable. `planned` — selective keep
589
+ is not yet supported (use `metadata: keep` to preserve everything).
635
590
  output_format:
636
591
  type: enum
637
592
  values: [original, webp, auto, smallest]
@@ -641,44 +596,39 @@ operation:
641
596
  smallest: { availability: planned }
642
597
  description: >-
643
598
  Output format. original = keep input format (default); webp = recompress to
644
- WebP — the one live compress+format target (proven on staging). Concrete format
645
- changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress.
646
- `auto` / `smallest` are PLANNED auto-format directives — the server encodes to
647
- several candidate formats and returns the best (`auto` = the most suitable;
648
- `smallest` = the absolute fewest bytes), reporting the chosen format via the
649
- result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert
650
- cannot express "pick the smallest"), so they live here and stay `planned` until
651
- the API try-all-return-smallest logic + worker proof land. See FORMAT.md.
599
+ WebP. Concrete format changes (jpeg/png/avif/gif/tiff) are handled by the
600
+ convert operation. `auto` / `smallest` are PLANNED auto-format directives —
601
+ the server encodes to several candidate formats and returns the best
602
+ (`auto` = the most suitable; `smallest` = the absolute fewest bytes),
603
+ reporting the chosen format via the result `mime_type`. They are selection
604
+ strategies, not concrete targets, and stay `planned` until supported. See
605
+ FORMAT.md.
652
606
  lossless:
653
607
  type: boolean
654
608
  default: false
655
609
  depends_on: { encoding_mode: quality }
656
610
  honored_on: [same_format]
657
611
  description: >-
658
- Encode WebP losslessly (optimiser path): a genuine lossless WebP encode.
659
- STABLE — the compress-image worker honours the `lossless` bool (un-parked
660
- 2026-06-23). Note a lossless encode can be LARGER than a lossy one at the
661
- same visual quality. Only in `quality` mode — incompatible with
662
- `target_size` (the byte-budget loop is inherently lossy). Optimiser
663
- (same_format) route only.
612
+ Encode WebP losslessly: a genuine lossless WebP encode. Note a lossless
613
+ encode can be LARGER than a lossy one at the same visual quality. Only in
614
+ `quality` mode — incompatible with `target_size` (hitting a byte budget is
615
+ inherently lossy).
664
616
  width:
665
617
  type: integer
666
618
  min: 1
667
619
  max: 16384
668
620
  honored_on: [same_format, format_change]
669
621
  description: >-
670
- Resize-inside-Output: target width in pixels (1-16384; width*height <=
671
- max_output_pixels). Resize the image as part of Output (replace semantics,
672
- ONE transformed output) using the proven convert resize engine (Lanczos;
673
- the API routes Output resize through the convert worker, BOTH routes —
674
- the compress optimiser has no resize) — it is NOT the derivative `thumbnail` op.
675
- Optional; omit to keep the source dimensions.
622
+ Target width in pixels (1-16384; width × height must not exceed the
623
+ group's maximum output area). Resizes the image as part of the operation
624
+ (one transformed output, replacing the source). Optional; omit to keep the
625
+ source dimensions.
676
626
  height:
677
627
  type: integer
678
628
  min: 1
679
629
  max: 16384
680
630
  honored_on: [same_format, format_change]
681
- description: "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Resize replaces the image (one output). Optional — see `width`."
631
+ description: "Target height in pixels (1-16384; width × height within the group's max output area). Resizes the image (one output). Optional — see `width`."
682
632
  fit:
683
633
  type: enum
684
634
  values: [max, crop, scale]
@@ -686,12 +636,11 @@ operation:
686
636
  depends_on: { width: set, height: set, logic: or }
687
637
  honored_on: [same_format, format_change]
688
638
  description: >-
689
- Resize mode. `max` (default) = fit within bounds, preserving aspect ratio
690
- and NEVER upscaling — it caps at the source dimensions. This IS the
691
- "no-enlarge" behaviour (there is no separate `no_enlarge` flag — the
692
- worker has no such key). `crop`/`scale` = exact dimensions (`scale`
693
- deliberately enlarges past source). Applies only when width or height is
694
- set, on whichever Output route runs.
639
+ Resize mode. `max` (default) = fit within the given bounds, preserving
640
+ aspect ratio and never upscaling (caps at the source dimensions — this is
641
+ the "no-enlarge" behaviour). `crop`/`scale` = exact dimensions (`scale`
642
+ deliberately enlarges past the source). Applies only when width or height
643
+ is set.
695
644
  color_profile:
696
645
  type: enum
697
646
  values: [keep, srgb, strip]
@@ -699,26 +648,21 @@ operation:
699
648
  availability: planned
700
649
  honored_on: [same_format, format_change]
701
650
  description: >-
702
- ICC colour-profile handling — its OWN control, DECOUPLED from `metadata`
703
- (stripping metadata must NOT silently shift colours; that coupling is the
704
- correctness bug this fixes). `keep` (default) = preserve the embedded
705
- profile; `srgb` = convert to sRGB (also handles CMYK→sRGB); `strip` = drop
706
- the profile (smallest — only when the consumer manages colour itself).
707
- `planned` — the worker does not yet honour it (today the default strips ICC
708
- during metadata-strip; the fix preserves it). Applies on BOTH Output routes
709
- (optimiser preserves; transcoder preserves/converts). Worker-proven flip.
651
+ Colour-profile handling — a dedicated control, separate from `metadata` so
652
+ that stripping metadata never silently shifts colours. `keep` (default) =
653
+ preserve the embedded colour profile; `srgb` = convert to sRGB (also
654
+ handles CMYK → sRGB); `strip` = drop the profile (smallest — only when the
655
+ consumer manages colour itself). `planned` — not yet supported.
710
656
  auto_orient:
711
657
  type: boolean
712
658
  default: true
713
- availability: planned
714
659
  honored_on: [same_format, format_change]
715
660
  description: >-
716
661
  Bake EXIF orientation into the pixels (honour the camera/device rotation
717
662
  tag) so the output displays upright everywhere, then drop the now-redundant
718
- orientation tag. `planned` — a restored control (was removed): the worker
719
- must apply the EXIF-orientation transform before encode on both Output
720
- routes. Default `true` (a behaviour change, proven planned-first). No-op for
721
- inputs without an orientation tag.
663
+ orientation tag. Default `true`; no-op for inputs without an orientation
664
+ tag. On an already-rotated image the pixels are re-encoded (near-lossless),
665
+ which can drop other (non-orientation) metadata even with `metadata: keep`.
722
666
 
723
667
  # svg is VECTOR: no raster resize (thumbnail-images does not list svg), and the
724
668
  # optimiser `lossless` knob does not apply. SVG compression is SVGO; only
@@ -744,9 +688,8 @@ operation:
744
688
  description: >-
745
689
  Metadata handling. `strip` = remove all metadata (default, the only
746
690
  supported behaviour). `all` is a DEPRECATED alias of `strip` (migrate to
747
- `strip`; the API lowers it at the worker boundary). `keep` is NOT offered
748
- for SVG — SVGO optimises the markup and cannot preserve a metadata block
749
- (the worker rejects `keep` as invalid_options).
691
+ `strip`). `keep` is NOT offered for SVG — optimising the markup cannot
692
+ preserve a metadata block.
750
693
  output_format:
751
694
  type: enum
752
695
  values: [original, webp, auto, smallest]
@@ -756,10 +699,10 @@ operation:
756
699
  smallest: { availability: planned }
757
700
  description: >-
758
701
  Output format. original = keep input format (default); webp = recompress to
759
- WebP. Concrete format changes are the convert operation's job. `auto` /
760
- `smallest` are PLANNED auto-format directives (server picks the best/smallest
761
- candidate format, reported via the result `mime_type`) — selection strategies,
762
- not concrete targets, planned until the API logic + worker proof land. See
702
+ WebP. Concrete format changes are handled by the convert operation. `auto` /
703
+ `smallest` are PLANNED auto-format directives (the server picks the
704
+ best/smallest candidate format, reported via the result `mime_type`) —
705
+ selection strategies, not concrete targets, planned until supported. See
763
706
  FORMAT.md.
764
707
 
765
708
  # gif/tiff: raster Resize is engine-proven (both are in thumbnail-images), but
@@ -778,7 +721,7 @@ operation:
778
721
  honored_on: [same_format]
779
722
  description: >-
780
723
  Compression quality (1 = smallest file, 100 = best quality). For animated
781
- GIF the worker honours this but real-world size reduction is typically small.
724
+ GIF this is honoured but real-world size reduction is typically small.
782
725
  metadata:
783
726
  type: enum
784
727
  values: [strip, keep, all]
@@ -787,33 +730,31 @@ operation:
787
730
  all: { availability: deprecated }
788
731
  honored_on: [same_format]
789
732
  description: >-
790
- Metadata handling (optimiser/same_format route). `strip` = remove all
791
- EXIF/IPTC/XMP (default). `keep` = preserve EXIF/ICC/XMP — STABLE
792
- (worker-proven, libcaesium; lambdas PR #260, staging round-trip + unit
793
- test). `all` is a DEPRECATED alias of `strip` (the pre-2026-06-23 token;
794
- `all` reading as "strip all" was counterintuitive) — still accepted,
795
- emits Deprecation/Sunset, migrate to `strip`. The API lowers `strip`→`all`
796
- at the worker boundary. Any other value is rejected as invalid_options.
733
+ Metadata handling. `strip` = remove all EXIF/IPTC/XMP (default). `keep` =
734
+ preserve EXIF, colour profile, and XMP. `all` is a DEPRECATED alias of
735
+ `strip` (kept for older callers; emits Deprecation/Sunset headers — migrate
736
+ to `strip`). Any other value is rejected.
797
737
  keep_metadata:
798
738
  type: array
799
739
  items:
800
- # items.type is `string` (not `enum`) deliberately: the valid categories
801
- # are listed below + enforced by the API at the stable-flip. SDK operation-
802
- # schema codegen does not yet support typed array-of-enum (restore `enum` +
803
- # values:[copyright,gps,date] when that lands — likely at this option's
804
- # stable-flip). Wire-identical either way (a JSON array of strings).
740
+ # JSON-Schema `enum:` (not the DSL `type: enum`) on a string item: the
741
+ # SDK operation-schema parser's valid array-item types are
742
+ # {number,integer,float,string,object} — `type: enum` is rejected, so the
743
+ # categories are carried as a JSON-Schema `enum` constraint on a string
744
+ # item. Consumers (FE) read the allowed categories structurally from the
745
+ # sidecar; SDK codegen sees a string array (the enum key is value-only) —
746
+ # wire-identical (a JSON array of strings).
805
747
  type: string
748
+ enum: [copyright, gps, date]
806
749
  uniqueItems: true
807
750
  availability: planned
808
751
  depends_on: { metadata: strip }
809
752
  honored_on: [same_format]
810
753
  description: >-
811
- Selective per-category metadata keep (optimiser/same_format route):
812
- preserve ONLY these categories and strip the rest — refines the strip
813
- path (`metadata: strip`). Valid categories: `copyright`, `gps` (location),
814
- `date` (capture time); combinable. `planned` — the worker does not yet
815
- do selective keep (use `metadata: keep` to preserve everything), so the
816
- API returns feature_not_available until lambdas proves it.
754
+ Selectively keep only certain metadata categories and strip the rest —
755
+ refines `metadata: strip`. Allowed categories: `copyright`, `gps`
756
+ (location), `date` (capture time); combinable. `planned` — selective keep
757
+ is not yet supported (use `metadata: keep` to preserve everything).
817
758
  output_format:
818
759
  type: enum
819
760
  values: [original, webp, auto, smallest]
@@ -823,32 +764,29 @@ operation:
823
764
  smallest: { availability: planned }
824
765
  description: >-
825
766
  Output format. original = keep input format (default); webp = recompress to
826
- WebP — the one live compress+format target (proven on staging). Concrete format
827
- changes (jpeg/png/avif/gif/tiff) are the convert operation's job, not compress.
828
- `auto` / `smallest` are PLANNED auto-format directives — the server encodes to
829
- several candidate formats and returns the best (`auto` = the most suitable;
830
- `smallest` = the absolute fewest bytes), reporting the chosen format via the
831
- result `mime_type`. They are SELECTION STRATEGIES, not concrete targets (convert
832
- cannot express "pick the smallest"), so they live here and stay `planned` until
833
- the API try-all-return-smallest logic + worker proof land. See FORMAT.md.
767
+ WebP. Concrete format changes (jpeg/png/avif/gif/tiff) are handled by the
768
+ convert operation. `auto` / `smallest` are PLANNED auto-format directives —
769
+ the server encodes to several candidate formats and returns the best
770
+ (`auto` = the most suitable; `smallest` = the absolute fewest bytes),
771
+ reporting the chosen format via the result `mime_type`. They are selection
772
+ strategies, not concrete targets, and stay `planned` until supported. See
773
+ FORMAT.md.
834
774
  width:
835
775
  type: integer
836
776
  min: 1
837
777
  max: 16384
838
778
  honored_on: [same_format, format_change]
839
779
  description: >-
840
- Resize-inside-Output: target width in pixels (1-16384; width*height <=
841
- max_output_pixels). Resize the image as part of Output (replace semantics,
842
- ONE transformed output) using the proven convert resize engine (Lanczos;
843
- the API routes Output resize through the convert worker, BOTH routes —
844
- the compress optimiser has no resize) — it is NOT the derivative `thumbnail` op.
845
- Optional; omit to keep the source dimensions.
780
+ Target width in pixels (1-16384; width × height must not exceed the
781
+ group's maximum output area). Resizes the image as part of the operation
782
+ (one transformed output, replacing the source). Optional; omit to keep the
783
+ source dimensions.
846
784
  height:
847
785
  type: integer
848
786
  min: 1
849
787
  max: 16384
850
788
  honored_on: [same_format, format_change]
851
- description: "Resize-inside-Output: target height in pixels (1-16384; width*height <= max_output_pixels). Resize replaces the image (one output). Optional — see `width`."
789
+ description: "Target height in pixels (1-16384; width × height within the group's max output area). Resizes the image (one output). Optional — see `width`."
852
790
  fit:
853
791
  type: enum
854
792
  values: [max, crop, scale]
@@ -856,12 +794,11 @@ operation:
856
794
  depends_on: { width: set, height: set, logic: or }
857
795
  honored_on: [same_format, format_change]
858
796
  description: >-
859
- Resize mode. `max` (default) = fit within bounds, preserving aspect ratio
860
- and NEVER upscaling — it caps at the source dimensions. This IS the
861
- "no-enlarge" behaviour (there is no separate `no_enlarge` flag — the
862
- worker has no such key). `crop`/`scale` = exact dimensions (`scale`
863
- deliberately enlarges past source). Applies only when width or height is
864
- set, on whichever Output route runs.
797
+ Resize mode. `max` (default) = fit within the given bounds, preserving
798
+ aspect ratio and never upscaling (caps at the source dimensions — this is
799
+ the "no-enlarge" behaviour). `crop`/`scale` = exact dimensions (`scale`
800
+ deliberately enlarges past the source). Applies only when width or height
801
+ is set.
865
802
  color_profile:
866
803
  type: enum
867
804
  values: [keep, srgb, strip]
@@ -869,26 +806,21 @@ operation:
869
806
  availability: planned
870
807
  honored_on: [same_format, format_change]
871
808
  description: >-
872
- ICC colour-profile handling — its OWN control, DECOUPLED from `metadata`
873
- (stripping metadata must NOT silently shift colours; that coupling is the
874
- correctness bug this fixes). `keep` (default) = preserve the embedded
875
- profile; `srgb` = convert to sRGB (also handles CMYK→sRGB); `strip` = drop
876
- the profile (smallest — only when the consumer manages colour itself).
877
- `planned` — the worker does not yet honour it (today the default strips ICC
878
- during metadata-strip; the fix preserves it). Applies on BOTH Output routes
879
- (optimiser preserves; transcoder preserves/converts). Worker-proven flip.
809
+ Colour-profile handling — a dedicated control, separate from `metadata` so
810
+ that stripping metadata never silently shifts colours. `keep` (default) =
811
+ preserve the embedded colour profile; `srgb` = convert to sRGB (also
812
+ handles CMYK → sRGB); `strip` = drop the profile (smallest — only when the
813
+ consumer manages colour itself). `planned` — not yet supported.
880
814
  auto_orient:
881
815
  type: boolean
882
816
  default: true
883
- availability: planned
884
817
  honored_on: [same_format, format_change]
885
818
  description: >-
886
819
  Bake EXIF orientation into the pixels (honour the camera/device rotation
887
820
  tag) so the output displays upright everywhere, then drop the now-redundant
888
- orientation tag. `planned` — a restored control (was removed): the worker
889
- must apply the EXIF-orientation transform before encode on both Output
890
- routes. Default `true` (a behaviour change, proven planned-first). No-op for
891
- inputs without an orientation tag.
821
+ orientation tag. Default `true`; no-op for inputs without an orientation
822
+ tag. On an already-rotated image the pixels are re-encoded (near-lossless),
823
+ which can drop other (non-orientation) metadata even with `metadata: keep`.
892
824
 
893
825
  audio:
894
826
  mimes:
@@ -924,7 +856,7 @@ operation:
924
856
  Output bitrate in kbps (CBR/ABR). Applies to lossy OUTPUTS. Only a
925
857
  caller-EXPLICIT bitrate against a lossless output is rejected as
926
858
  invalid_options (flac/wav have no bitrate target); the `default: 128` is
927
- never the basis for a rejection (ADR-0020 D1, carried into ADR-0023 — a default a caller did not set
859
+ never the basis for a rejection (a default a caller did not set
928
860
  is the server's to resolve, and is dropped for a lossless target). The output
929
861
  is the input format unless `output_format` re-targets it: with
930
862
  `output_format: original` the lossy/lossless distinction follows the input MIME
@@ -953,18 +885,17 @@ operation:
953
885
  type: float
954
886
  min: 0
955
887
  description: >
956
- Trim from beginning in seconds (absent = from the start). STABLE
957
- (qZI5EK9j) — the compress-audio worker cuts the clip before encoding
958
- (input-side ffmpeg `-ss`/`-t`; lambdas PR #259), SAME FROM-END
959
- semantic as compress.video / convert / merge: the kept clip is
960
- [`trim_start`, input_duration − `trim_end`].
888
+ Trim from beginning in seconds (absent = from the start). The clip
889
+ is cut before encoding, with the same from-end semantic as compress.video
890
+ / convert / merge: the kept clip is [`trim_start`, input_duration −
891
+ `trim_end`].
961
892
  trim_end:
962
893
  type: float
963
894
  min: 0
964
895
  description: >
965
896
  Trim from end in seconds (absent = to the end). Removes this many
966
897
  seconds from the end; with `trim_start` the kept clip is
967
- [`trim_start`, input_duration − `trim_end`]. STABLE — see `trim_start`.
898
+ [`trim_start`, input_duration − `trim_end`]. See `trim_start`.
968
899
 
969
900
  video:
970
901
  mimes:
@@ -1021,11 +952,11 @@ operation:
1021
952
  Output container. original = keep the input container (default,
1022
953
  same-format compression). Non-`original` values re-target the
1023
954
  container via the API "compress+format" facade (one canonicalized
1024
- convert-with-size-cap pass); see per_value_availability + ADR-0023 +
1025
- FORMAT.md. When set, the RESOLVED target container determines the
1026
- valid codec/audio_codec/faststart sets — an absent/default codec
1027
- resolves to a container-valid one (e.g. webm -> vp9) and is never
1028
- rejected; only a caller-EXPLICIT incompatible value is invalid_options.
955
+ convert-with-size-cap pass); see FORMAT.md. When set, the RESOLVED
956
+ target container determines the valid codec/audio_codec/faststart
957
+ sets — an absent/default codec resolves to a container-valid one
958
+ (e.g. webm -> vp9) and is never rejected; only a caller-EXPLICIT
959
+ incompatible value is rejected.
1029
960
  codec:
1030
961
  type: enum
1031
962
  values: [h264, h265, vp9, av1]
@@ -1039,9 +970,8 @@ operation:
1039
970
  AV1) the server resolves a container-valid codec (WebM -> vp9). A
1040
971
  DEFAULT value is never rejected — including an explicit
1041
972
  `output_format: webm` left at the default `h264` (resolves to vp9,
1042
- NOT invalid_options); only a caller-EXPLICIT incompatible codec
1043
- returns invalid_options. See FORMAT.md "Container-conditional
1044
- defaults" + ADR-0023 (supersedes ADR-0020).
973
+ not rejected); only a caller-EXPLICIT incompatible codec is rejected.
974
+ See FORMAT.md "Container-conditional defaults".
1045
975
  encoding_mode:
1046
976
  type: enum
1047
977
  values: [crf, target_size]
@@ -1059,7 +989,7 @@ operation:
1059
989
  crf = constant quality (variable file size). target_size = constrained
1060
990
  output file size (two-pass). target_size is LIVE for mp4/MOV output; for
1061
991
  webm/ogg output and long-form the server returns `feature_not_available`
1062
- (use crf there) until VP9 two-pass ships.
992
+ (use crf there) until two-pass for this container ships.
1063
993
  crf:
1064
994
  type: integer
1065
995
  min: 0
@@ -1075,10 +1005,10 @@ operation:
1075
1005
  # like encoding_mode:target_size — feature_not_available for webm/ogg +
1076
1006
  # long-form until VP9 two-pass ships. min 1MiB (the two-pass 1MiB floor).
1077
1007
  description: >-
1078
- Target output file size in bytes (min 1MiB). The libx264 two-pass encode
1079
- lands the output at or under the target (a safety undershoot + audio
1080
- reserve apply). mp4/MOV output only — webm/ogg + long-form return
1081
- `feature_not_available` until VP9 two-pass ships.
1008
+ Target output file size in bytes (min 1MiB). A two-pass encode lands the
1009
+ output at or under the target (a safety undershoot + audio reserve apply).
1010
+ mp4/MOV output only — webm/ogg + long-form return `feature_not_available`
1011
+ until two-pass for this container ships.
1082
1012
  preset:
1083
1013
  type: enum
1084
1014
  values: [ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow]
@@ -1088,12 +1018,12 @@ operation:
1088
1018
  type: integer
1089
1019
  min: 2
1090
1020
  max: 7680
1091
- description: "Output width in pixels. Must be an EVEN integer >= 2 (yuv420p chroma-subsampling); odd values are rejected as invalid_options by the encoder."
1021
+ description: "Output width in pixels. Must be an even integer ≥ 2; odd values are rejected by the encoder."
1092
1022
  height:
1093
1023
  type: integer
1094
1024
  min: 2
1095
1025
  max: 4320
1096
- description: "Output height in pixels. Must be an EVEN integer >= 2 (yuv420p chroma-subsampling); odd values are rejected as invalid_options by the encoder."
1026
+ description: "Output height in pixels. Must be an even integer ≥ 2; odd values are rejected by the encoder."
1097
1027
  fit:
1098
1028
  type: enum
1099
1029
  values: [max, crop, scale, pad]
@@ -1109,14 +1039,13 @@ operation:
1109
1039
  type: boolean
1110
1040
  default: true
1111
1041
  description: >
1112
- Move the MP4/MOV moov atom to start for progressive web playback.
1113
- MP4/MOV only. CONTAINER-CONDITIONAL against the RESOLVED output
1114
- container (the explicit `output_format` if set, else the input): the
1115
- default (true) is silently inapplicable for a container with no moov
1116
- atom (e.g. WebM) — that is NOT a rejection. Only a caller-EXPLICIT
1117
- faststart:true on such a container returns invalid_options. See
1118
- FORMAT.md "Container-conditional defaults" + ADR-0023 (supersedes
1119
- ADR-0020).
1042
+ Move the MP4/MOV moov atom to the front so the file starts playing
1043
+ before it is fully downloaded (progressive web playback). MP4/MOV only.
1044
+ CONTAINER-CONDITIONAL against the RESOLVED output container (the explicit
1045
+ `output_format` if set, else the input): the default (true) is silently
1046
+ inapplicable for a container with no moov atom (e.g. WebM) — that is NOT a
1047
+ rejection. Only a caller-EXPLICIT faststart:true on such a container is
1048
+ rejected. See FORMAT.md "Container-conditional defaults".
1120
1049
  audio_codec:
1121
1050
  type: enum
1122
1051
  values: [aac, opus, vorbis, copy]
@@ -1124,18 +1053,16 @@ operation:
1124
1053
  description: >
1125
1054
  Audio codec. copy = passthrough (keep the source stream as-is;
1126
1055
  re-encode only on explicit request) — aac/opus/vorbis re-encode.
1127
- Default is `copy` (ADR-0020 D7, carried into ADR-0023): on the
1128
- same-container path (`output_format` original/absent) the source
1129
- stream is already container-compatible, so copy is safe. When
1130
- `output_format` RE-TARGETS the container, an absent/default
1131
- audio_codec resolves to a container-valid codec via the facade
1132
- (e.g. webm -> opus), NOT a blind copy of an incompatible stream — a
1133
- DEFAULT is never rejected (the exact per-container resolution, incl.
1134
- ogg vorbis-vs-opus, is an output_format stable-flip prerequisite,
1135
- ADR-0023 D5). A caller-EXPLICIT codec the resolved container cannot
1136
- carry (e.g. aac on a webm target) returns invalid_options. See
1137
- FORMAT.md "Container-conditional defaults" + ADR-0023 (supersedes
1138
- ADR-0020).
1056
+ Default is `copy`: on the same-container path (`output_format`
1057
+ original/absent) the source stream is already container-compatible,
1058
+ so copy is safe. When `output_format` RE-TARGETS the container, an
1059
+ absent/default audio_codec resolves to a container-valid codec via the
1060
+ facade (e.g. webm -> opus), NOT a blind copy of an incompatible stream
1061
+ — a DEFAULT is never rejected (the exact per-container resolution,
1062
+ incl. ogg vorbis-vs-opus, is an output_format stable-flip
1063
+ prerequisite). A caller-EXPLICIT codec the resolved container cannot
1064
+ carry (e.g. aac on a webm target) is rejected. See FORMAT.md
1065
+ "Container-conditional defaults".
1139
1066
  audio_bitrate:
1140
1067
  type: enum
1141
1068
  value_type: integer
@@ -1152,21 +1079,17 @@ operation:
1152
1079
  description: >
1153
1080
  Audio track bitrate in kbps. Only valid with an explicit re-encode
1154
1081
  audio_codec (aac/opus/vorbis): an explicit audio_bitrate with
1155
- audio_codec `copy`/omitted is rejected as `invalid_options` at
1156
- workflow-create (the API enforces this `depends_on`); copy preserves
1157
- the source bitrate. FE/SDK also prune it pre-submit. No default: a
1158
- bitrate is only meaningful on an explicit re-encode (matches the
1159
- worker, which applies none).
1082
+ audio_codec `copy`/omitted is rejected; copy preserves the source
1083
+ bitrate. No default: a bitrate is only meaningful on an explicit
1084
+ re-encode.
1160
1085
  trim_start:
1161
1086
  type: float
1162
1087
  min: 0
1163
1088
  description: >
1164
- Trim from beginning in seconds (absent = from the start). STABLE
1165
- (qZI5EK9j) — the compress-video worker cuts the clip before encoding
1166
- (input-side ffmpeg `-ss`/`-t`; lambdas PR #258), SAME FROM-END
1167
- semantic as convert/merge: the kept clip is [`trim_start`,
1168
- input_duration − `trim_end`]. SHORT-FORM only — for long-form video
1169
- the server returns `feature_not_available` (trim a short clip, or
1089
+ Trim from beginning in seconds (absent = from the start). The clip
1090
+ is cut before encoding, with the same from-end semantic as convert/merge:
1091
+ the kept clip is [`trim_start`, input_duration − `trim_end`]. SHORT-FORM
1092
+ only — for long-form video this is not supported (trim a short clip, or
1170
1093
  chain a `split`); see the compress.video.trim.longform constraint.
1171
1094
  trim_end:
1172
1095
  type: float
@@ -1174,8 +1097,8 @@ operation:
1174
1097
  description: >
1175
1098
  Trim from end in seconds (absent = to the end). Removes this many
1176
1099
  seconds from the end; with `trim_start` the kept clip is
1177
- [`trim_start`, input_duration − `trim_end`]. STABLE — see
1178
- `trim_start` (short-form only; long-form → `feature_not_available`).
1100
+ [`trim_start`, input_duration − `trim_end`]. See `trim_start`
1101
+ (short-form only; long-form is not supported).
1179
1102
 
1180
1103
  document_pdf:
1181
1104
  mimes:
@@ -1198,39 +1121,39 @@ operation:
1198
1121
  min: 1
1199
1122
  max: 100
1200
1123
  default: 50
1201
- description: "Compression quality (1 = smallest, 100 = best). Maps to a Ghostscript preset. Overridden by `profile` when that is set."
1124
+ description: "Compression quality (1 = smallest, 100 = best). Maps to a compression preset. Overridden by `profile` when that is set."
1202
1125
  profile:
1203
1126
  type: enum
1204
1127
  values: [screen, ebook, printer, prepress]
1205
1128
  description: >-
1206
- Ghostscript optimization preset, pinned directly (overrides the
1207
- quality→preset mapping). screen = lowest-res / smallest, ebook = mid,
1208
- printer = 300dpi, prepress = print-production. Optional — omit to let
1209
- `quality` drive the preset.
1129
+ Compression preset, pinned directly (overrides the quality→preset
1130
+ mapping). screen = lowest-res / smallest, ebook = mid, printer =
1131
+ 300dpi, prepress = print-production. Optional — omit to let `quality`
1132
+ drive the preset.
1210
1133
  grayscale:
1211
1134
  type: boolean
1212
1135
  default: false
1213
- description: "Convert all images to grayscale (smaller output; discards colour). Worker-honored."
1136
+ description: "Convert all images to grayscale (smaller output; discards colour)."
1214
1137
  image_dpi:
1215
1138
  type: integer
1216
1139
  min: 72
1217
1140
  max: 600
1218
- description: "Downsample images above this DPI (72–600 inclusive). Omit to keep the worker's DPI analysis. Out-of-range is rejected as invalid_options."
1141
+ description: "Downsample images above this DPI (72–600 inclusive). Omit to use automatic DPI analysis. Out-of-range is rejected."
1219
1142
  colorspace:
1220
1143
  type: enum
1221
1144
  values: [unchanged, rgb, cmyk, grayscale]
1222
1145
  default: unchanged
1223
1146
  availability: planned
1224
- description: "Output color space. `planned` — not yet read by the worker (use `grayscale` for grayscale conversion)."
1147
+ description: "Output color space. `planned` — not yet supported (use `grayscale` for grayscale conversion)."
1225
1148
  pages:
1226
1149
  type: string
1227
1150
  availability: planned
1228
- description: "Page selection (e.g. '1-5,8,10-12'). Omit to keep all pages. `planned` — not yet read by the worker."
1151
+ description: "Page selection (e.g. '1-5,8,10-12'). Omit to keep all pages. `planned` — not yet supported."
1229
1152
  flatten_forms:
1230
1153
  type: boolean
1231
1154
  default: false
1232
1155
  availability: planned
1233
- description: "Flatten interactive form fields into static content. `planned` — not yet read by the worker."
1156
+ description: "Flatten interactive form fields into static content. `planned` — not yet supported."
1234
1157
 
1235
1158
  document_office:
1236
1159
  mimes:
@@ -1245,29 +1168,29 @@ operation:
1245
1168
  min: 1
1246
1169
  max: 100
1247
1170
  default: 50
1248
- description: "Compression quality (1 = smallest, 100 = best). The only worker-honored document option today."
1171
+ description: "Compression quality (1 = smallest, 100 = best). The only document compression option supported today."
1249
1172
  image_quality:
1250
1173
  type: integer
1251
1174
  min: 1
1252
1175
  max: 100
1253
1176
  default: 80
1254
1177
  availability: planned
1255
- description: "Recompress embedded images at this quality level (1 = smallest, 100 = best). `planned` — not yet read by the worker (use `quality`)."
1178
+ description: "Recompress embedded images at this quality level (1 = smallest, 100 = best). `planned` — not yet supported (use `quality`)."
1256
1179
  strip_macros:
1257
1180
  type: boolean
1258
1181
  default: true
1259
1182
  availability: planned
1260
- description: "Remove VBA macros and ActiveX controls. `planned` — not yet read by the worker."
1183
+ description: "Remove VBA macros and ActiveX controls. `planned` — not yet supported."
1261
1184
  strip_hidden_data:
1262
1185
  type: boolean
1263
1186
  default: true
1264
1187
  availability: planned
1265
- description: "Remove revisions, comments, personal info, hidden rows/columns, and speaker notes. `planned` — not yet read by the worker."
1188
+ description: "Remove revisions, comments, personal info, hidden rows/columns, and speaker notes. `planned` — not yet supported."
1266
1189
  strip_unused_fonts:
1267
1190
  type: boolean
1268
1191
  default: false
1269
1192
  availability: planned
1270
- description: "Remove embedded fonts not referenced in the document. Risk: may affect rendering on systems without the font installed. `planned` — not yet read by the worker."
1193
+ description: "Remove embedded fonts not referenced in the document. Risk: may affect rendering on systems without the font installed. `planned` — not yet supported."
1271
1194
 
1272
1195
  document_odf:
1273
1196
  mimes:
@@ -1281,24 +1204,24 @@ operation:
1281
1204
  min: 1
1282
1205
  max: 100
1283
1206
  default: 50
1284
- description: "Compression quality (1 = smallest, 100 = best). The only worker-honored document option today."
1207
+ description: "Compression quality (1 = smallest, 100 = best). The only document compression option supported today."
1285
1208
  image_quality:
1286
1209
  type: integer
1287
1210
  min: 1
1288
1211
  max: 100
1289
1212
  default: 80
1290
1213
  availability: planned
1291
- description: "Recompress embedded images at this quality level. `planned` — not yet read by the worker (use `quality`)."
1214
+ description: "Recompress embedded images at this quality level. `planned` — not yet supported (use `quality`)."
1292
1215
  strip_metadata:
1293
1216
  type: boolean
1294
1217
  default: true
1295
1218
  availability: planned
1296
- description: "Remove document metadata (author, revision history, comments). `planned` — not yet read by the worker."
1219
+ description: "Remove document metadata (author, revision history, comments). `planned` — not yet supported."
1297
1220
  strip_unused_styles:
1298
1221
  type: boolean
1299
1222
  default: false
1300
1223
  availability: planned
1301
- description: "Remove style definitions not referenced in document content. `planned` — not yet read by the worker."
1224
+ description: "Remove style definitions not referenced in document content. `planned` — not yet supported."
1302
1225
 
1303
1226
  document_epub:
1304
1227
  mimes:
@@ -1310,21 +1233,21 @@ operation:
1310
1233
  min: 1
1311
1234
  max: 100
1312
1235
  default: 50
1313
- description: "Compression quality (1 = smallest, 100 = best). The only worker-honored document option today."
1236
+ description: "Compression quality (1 = smallest, 100 = best). The only document compression option supported today."
1314
1237
  image_quality:
1315
1238
  type: integer
1316
1239
  min: 1
1317
1240
  max: 100
1318
1241
  default: 80
1319
1242
  availability: planned
1320
- description: "Recompress embedded images at this quality level. `planned` — not yet read by the worker (use `quality`)."
1243
+ description: "Recompress embedded images at this quality level. `planned` — not yet supported (use `quality`)."
1321
1244
  font_subsetting:
1322
1245
  type: boolean
1323
1246
  default: true
1324
1247
  availability: planned
1325
- description: "Subset embedded fonts to only include glyphs used in the document. Significant size reduction for books with large font files. `planned` — not yet read by the worker."
1248
+ description: "Subset embedded fonts to only include glyphs used in the document. Significant size reduction for books with large font files. `planned` — not yet supported."
1326
1249
  strip_unused_css:
1327
1250
  type: boolean
1328
1251
  default: false
1329
1252
  availability: planned
1330
- description: "Remove CSS rules not referenced by any content. Risk: may affect rendering in some readers. `planned` — not yet read by the worker."
1253
+ description: "Remove CSS rules not referenced by any content. Risk: may affect rendering in some readers. `planned` — not yet supported."