@giveitsmaller/contracts 0.9.0 → 0.16.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 (443) hide show
  1. package/asyncapi/events.yaml +540 -42
  2. package/availability/availability.json +313 -89
  3. package/dist/asyncapi/Failure.d.ts +2 -0
  4. package/dist/asyncapi/MultiOutputCompletion.d.ts +2 -0
  5. package/dist/asyncapi/{NotificationsOperationsQueue.d.ts → NotificationsJobsQueue.d.ts} +2 -2
  6. package/dist/asyncapi/OperationResultMetadata.d.ts +4 -0
  7. package/dist/asyncapi/OperationResultMetadata.js +1 -0
  8. package/dist/asyncapi/OperationType.d.ts +2 -1
  9. package/dist/asyncapi/OperationType.js +1 -0
  10. package/dist/asyncapi/PageIndexed.d.ts +1 -0
  11. package/dist/asyncapi/PositionIndexed.d.ts +1 -0
  12. package/dist/asyncapi/SingleOutputCompletion.d.ts +2 -0
  13. package/dist/asyncapi/SourceEntry.d.ts +2 -0
  14. package/dist/asyncapi/Unindexed.d.ts +1 -0
  15. package/dist/asyncapi/index.d.ts +2 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +2 -2
  17. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +2 -2
  18. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +2 -2
  19. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +2 -2
  20. package/dist/openapi/models/AuthErrorResponse.d.ts +13 -2
  21. package/dist/openapi/models/AuthErrorResponse.js +2 -2
  22. package/dist/openapi/models/AuthErrorType.d.ts +2 -2
  23. package/dist/openapi/models/AuthErrorType.js +2 -2
  24. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +126 -0
  25. package/dist/openapi/models/AuthRejectionEnvelope.js +72 -0
  26. package/dist/openapi/models/AvailabilityValue.d.ts +2 -2
  27. package/dist/openapi/models/AvailabilityValue.js +2 -2
  28. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +13 -2
  29. package/dist/openapi/models/BalanceExhaustedResponse.js +2 -2
  30. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +2 -2
  31. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +2 -2
  32. package/dist/openapi/models/CallbackEventType.d.ts +2 -2
  33. package/dist/openapi/models/CallbackEventType.js +2 -2
  34. package/dist/openapi/models/ChangePasswordRequest.d.ts +38 -0
  35. package/dist/openapi/models/ChangePasswordRequest.js +47 -0
  36. package/dist/openapi/models/CompositionPlan.d.ts +72 -0
  37. package/dist/openapi/models/CompositionPlan.js +53 -0
  38. package/dist/openapi/models/CompositionPlanJob.d.ts +39 -0
  39. package/dist/openapi/models/CompositionPlanJob.js +48 -0
  40. package/dist/openapi/models/CompositionPlanOperation.d.ts +116 -0
  41. package/dist/openapi/models/CompositionPlanOperation.js +62 -0
  42. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +46 -0
  43. package/dist/openapi/models/ConfirmEmailChange200Response.js +54 -0
  44. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +32 -0
  45. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +43 -0
  46. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +32 -0
  47. package/dist/openapi/models/ConfirmEmailChangeRequest.js +43 -0
  48. package/dist/openapi/models/ConnectionSource.d.ts +2 -2
  49. package/dist/openapi/models/ConnectionSource.js +2 -2
  50. package/dist/openapi/models/ContactRequest.d.ts +2 -2
  51. package/dist/openapi/models/ContactRequest.js +2 -2
  52. package/dist/openapi/models/ContactSubject.d.ts +2 -2
  53. package/dist/openapi/models/ContactSubject.js +2 -2
  54. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +2 -2
  55. package/dist/openapi/models/ContactValidationErrorResponse.js +2 -2
  56. package/dist/openapi/models/CreateApiKey201Response.d.ts +46 -0
  57. package/dist/openapi/models/CreateApiKey201Response.js +54 -0
  58. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +56 -0
  59. package/dist/openapi/models/CreateApiKey201ResponseData.js +59 -0
  60. package/dist/openapi/models/CreateApiKeyRequest.d.ts +32 -0
  61. package/dist/openapi/models/CreateApiKeyRequest.js +43 -0
  62. package/dist/openapi/models/CreateExternalImport403Response.d.ts +2 -2
  63. package/dist/openapi/models/CreateExternalImport403Response.js +2 -2
  64. package/dist/openapi/models/CreateExternalImport422Response.d.ts +2 -2
  65. package/dist/openapi/models/CreateExternalImport422Response.js +2 -2
  66. package/dist/openapi/models/CreateWorkflow422Response.d.ts +2 -2
  67. package/dist/openapi/models/CreateWorkflow422Response.js +2 -2
  68. package/dist/openapi/models/CreditTransaction.d.ts +2 -2
  69. package/dist/openapi/models/CreditTransaction.js +2 -2
  70. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +2 -2
  71. package/dist/openapi/models/CreditTransactionSourceBucket.js +2 -2
  72. package/dist/openapi/models/CreditsBalanceResponse.d.ts +2 -2
  73. package/dist/openapi/models/CreditsBalanceResponse.js +2 -2
  74. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +2 -2
  75. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +2 -2
  76. package/dist/openapi/models/CreditsUsageResponse.d.ts +2 -2
  77. package/dist/openapi/models/CreditsUsageResponse.js +2 -2
  78. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +2 -2
  79. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +2 -2
  80. package/dist/openapi/models/Delivery.d.ts +2 -2
  81. package/dist/openapi/models/Delivery.js +2 -2
  82. package/dist/openapi/models/DeliveryOutputRef.d.ts +9 -2
  83. package/dist/openapi/models/DeliveryOutputRef.js +2 -2
  84. package/dist/openapi/models/DeliveryPlan.d.ts +2 -2
  85. package/dist/openapi/models/DeliveryPlan.js +2 -2
  86. package/dist/openapi/models/DeliveryPlanOutput.d.ts +17 -2
  87. package/dist/openapi/models/DeliveryPlanOutput.js +4 -2
  88. package/dist/openapi/models/DeliveryPlanReason.d.ts +2 -2
  89. package/dist/openapi/models/DeliveryPlanReason.js +2 -2
  90. package/dist/openapi/models/DeliverySelection.d.ts +6 -4
  91. package/dist/openapi/models/DeliverySelection.js +2 -2
  92. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +58 -0
  93. package/dist/openapi/models/EmptySuccessEnvelope.js +53 -0
  94. package/dist/openapi/models/EndpointProjection.d.ts +12 -3
  95. package/dist/openapi/models/EndpointProjection.js +2 -2
  96. package/dist/openapi/models/ErrorEnvelope.d.ts +13 -2
  97. package/dist/openapi/models/ErrorEnvelope.js +2 -2
  98. package/dist/openapi/models/EstimateQuality.d.ts +2 -2
  99. package/dist/openapi/models/EstimateQuality.js +2 -2
  100. package/dist/openapi/models/EstimateRange.d.ts +2 -2
  101. package/dist/openapi/models/EstimateRange.js +2 -2
  102. package/dist/openapi/models/ExternalDestination.d.ts +2 -2
  103. package/dist/openapi/models/ExternalDestination.js +2 -2
  104. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +2 -2
  105. package/dist/openapi/models/ExternalImportCreatedResponse.js +2 -2
  106. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +2 -2
  107. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +2 -2
  108. package/dist/openapi/models/ExternalImportRequest.d.ts +2 -2
  109. package/dist/openapi/models/ExternalImportRequest.js +2 -2
  110. package/dist/openapi/models/ExternalImportToken.d.ts +2 -2
  111. package/dist/openapi/models/ExternalImportToken.js +2 -2
  112. package/dist/openapi/models/ExternalSource.d.ts +2 -2
  113. package/dist/openapi/models/ExternalSource.js +2 -2
  114. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +13 -2
  115. package/dist/openapi/models/FeatureNotAvailableResponse.js +2 -2
  116. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +13 -2
  117. package/dist/openapi/models/FeatureTierRestrictedResponse.js +2 -2
  118. package/dist/openapi/models/FeatureViolation.d.ts +2 -2
  119. package/dist/openapi/models/FeatureViolation.js +2 -2
  120. package/dist/openapi/models/ForgotPasswordRequest.d.ts +32 -0
  121. package/dist/openapi/models/ForgotPasswordRequest.js +43 -0
  122. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +65 -0
  123. package/dist/openapi/models/ImageEncodeCapabilities.js +55 -0
  124. package/dist/openapi/models/JobDefinition.d.ts +20 -4
  125. package/dist/openapi/models/JobDefinition.js +2 -2
  126. package/dist/openapi/models/JobDownload.d.ts +2 -2
  127. package/dist/openapi/models/JobDownload.js +2 -2
  128. package/dist/openapi/models/JobInputV2.d.ts +13 -9
  129. package/dist/openapi/models/JobInputV2.js +5 -5
  130. package/dist/openapi/models/JobMediaClass.d.ts +34 -0
  131. package/dist/openapi/models/JobMediaClass.js +52 -0
  132. package/dist/openapi/models/JobOutputSource.d.ts +2 -2
  133. package/dist/openapi/models/JobOutputSource.js +2 -2
  134. package/dist/openapi/models/JobResponse.d.ts +2 -2
  135. package/dist/openapi/models/JobResponse.js +2 -2
  136. package/dist/openapi/models/JobStatus.d.ts +2 -2
  137. package/dist/openapi/models/JobStatus.js +2 -2
  138. package/dist/openapi/models/JobType.d.ts +2 -2
  139. package/dist/openapi/models/JobType.js +2 -2
  140. package/dist/openapi/models/LivenessResponse.d.ts +2 -2
  141. package/dist/openapi/models/LivenessResponse.js +2 -2
  142. package/dist/openapi/models/LoginUser200Response.d.ts +2 -2
  143. package/dist/openapi/models/LoginUser200Response.js +2 -2
  144. package/dist/openapi/models/LoginUser200ResponseData.d.ts +2 -2
  145. package/dist/openapi/models/LoginUser200ResponseData.js +2 -2
  146. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +2 -2
  147. package/dist/openapi/models/LoginUser200ResponseDataUser.js +2 -2
  148. package/dist/openapi/models/LoginUserRequest.d.ts +2 -2
  149. package/dist/openapi/models/LoginUserRequest.js +2 -2
  150. package/dist/openapi/models/MetadataResponse.d.ts +2 -2
  151. package/dist/openapi/models/MetadataResponse.js +2 -2
  152. package/dist/openapi/models/MetadataResponseDimensions.d.ts +2 -2
  153. package/dist/openapi/models/MetadataResponseDimensions.js +2 -2
  154. package/dist/openapi/models/MetadataResponseExif.d.ts +2 -2
  155. package/dist/openapi/models/MetadataResponseExif.js +2 -2
  156. package/dist/openapi/models/MetadataResponseExifGps.d.ts +2 -2
  157. package/dist/openapi/models/MetadataResponseExifGps.js +2 -2
  158. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +2 -2
  159. package/dist/openapi/models/MetadataSuccessEnvelope.js +2 -2
  160. package/dist/openapi/models/MimeGroupSchema.d.ts +37 -2
  161. package/dist/openapi/models/MimeGroupSchema.js +5 -2
  162. package/dist/openapi/models/MultiInputSource.d.ts +41 -0
  163. package/dist/openapi/models/MultiInputSource.js +52 -0
  164. package/dist/openapi/models/MultipartCompleteRequest.d.ts +2 -2
  165. package/dist/openapi/models/MultipartCompleteRequest.js +2 -2
  166. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +2 -2
  167. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +2 -2
  168. package/dist/openapi/models/MultipartCompleteResponse.d.ts +2 -2
  169. package/dist/openapi/models/MultipartCompleteResponse.js +2 -2
  170. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +2 -2
  171. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +2 -2
  172. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +2 -2
  173. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +2 -2
  174. package/dist/openapi/models/MultipartInitiateResponse.d.ts +2 -2
  175. package/dist/openapi/models/MultipartInitiateResponse.js +2 -2
  176. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +2 -2
  177. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +2 -2
  178. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +2 -2
  179. package/dist/openapi/models/MultipartKeepaliveResponse.js +2 -2
  180. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +2 -2
  181. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +2 -2
  182. package/dist/openapi/models/MultipartPartListing.d.ts +2 -2
  183. package/dist/openapi/models/MultipartPartListing.js +2 -2
  184. package/dist/openapi/models/MultipartPresignRequest.d.ts +2 -2
  185. package/dist/openapi/models/MultipartPresignRequest.js +2 -2
  186. package/dist/openapi/models/MultipartPresignResponse.d.ts +2 -2
  187. package/dist/openapi/models/MultipartPresignResponse.js +2 -2
  188. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +2 -2
  189. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +2 -2
  190. package/dist/openapi/models/MultipartStatusResponse.d.ts +2 -2
  191. package/dist/openapi/models/MultipartStatusResponse.js +2 -2
  192. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +2 -2
  193. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +2 -2
  194. package/dist/openapi/models/OperationDefinition.d.ts +27 -2
  195. package/dist/openapi/models/OperationDefinition.js +11 -2
  196. package/dist/openapi/models/OperationDownload.d.ts +30 -2
  197. package/dist/openapi/models/OperationDownload.js +6 -2
  198. package/dist/openapi/models/OperationInputModel.d.ts +3 -3
  199. package/dist/openapi/models/OperationInputModel.js +3 -3
  200. package/dist/openapi/models/OperationResponse.d.ts +18 -2
  201. package/dist/openapi/models/OperationResponse.js +5 -2
  202. package/dist/openapi/models/OperationResult.d.ts +2 -2
  203. package/dist/openapi/models/OperationResult.js +2 -2
  204. package/dist/openapi/models/OperationResultMetadata.d.ts +48 -0
  205. package/dist/openapi/models/OperationResultMetadata.js +41 -0
  206. package/dist/openapi/models/OperationResultMetrics.d.ts +16 -3
  207. package/dist/openapi/models/OperationResultMetrics.js +2 -2
  208. package/dist/openapi/models/OperationSchemaDefinition.d.ts +6 -5
  209. package/dist/openapi/models/OperationSchemaDefinition.js +2 -2
  210. package/dist/openapi/models/OperationStatus.d.ts +2 -2
  211. package/dist/openapi/models/OperationStatus.js +2 -2
  212. package/dist/openapi/models/OperationType.d.ts +7 -4
  213. package/dist/openapi/models/OperationType.js +8 -5
  214. package/dist/openapi/models/OperationsSchemaResponse.d.ts +32 -4
  215. package/dist/openapi/models/OperationsSchemaResponse.js +5 -2
  216. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +2 -2
  217. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +2 -2
  218. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +2 -2
  219. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +2 -2
  220. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +2 -2
  221. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +2 -2
  222. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +2 -2
  223. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +2 -2
  224. package/dist/openapi/models/OptionSchema.d.ts +2 -2
  225. package/dist/openapi/models/OptionSchema.js +2 -2
  226. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +2 -2
  227. package/dist/openapi/models/PerRoleCardinalityEntry.js +2 -2
  228. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +2 -2
  229. package/dist/openapi/models/PerValueAvailabilityEntry.js +2 -2
  230. package/dist/openapi/models/PresignedUrlPart.d.ts +2 -2
  231. package/dist/openapi/models/PresignedUrlPart.js +2 -2
  232. package/dist/openapi/models/ProbePendingResponse.d.ts +13 -2
  233. package/dist/openapi/models/ProbePendingResponse.js +2 -2
  234. package/dist/openapi/models/ProcessingClass.d.ts +2 -2
  235. package/dist/openapi/models/ProcessingClass.js +2 -2
  236. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +2 -2
  237. package/dist/openapi/models/ProcessingClassBandViolation.js +2 -2
  238. package/dist/openapi/models/ProcessingClassConstraints.d.ts +69 -0
  239. package/dist/openapi/models/ProcessingClassConstraints.js +49 -0
  240. package/dist/openapi/models/ProcessingClassEntry.d.ts +93 -0
  241. package/dist/openapi/models/ProcessingClassEntry.js +57 -0
  242. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +13 -2
  243. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +2 -2
  244. package/dist/openapi/models/ProcessingClassHint.d.ts +2 -2
  245. package/dist/openapi/models/ProcessingClassHint.js +2 -2
  246. package/dist/openapi/models/ProcessingClassReason.d.ts +2 -2
  247. package/dist/openapi/models/ProcessingClassReason.js +2 -2
  248. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +2 -2
  249. package/dist/openapi/models/ProcessingClassRejectReason.js +2 -2
  250. package/dist/openapi/models/ProcessingPlan.d.ts +2 -2
  251. package/dist/openapi/models/ProcessingPlan.js +2 -2
  252. package/dist/openapi/models/ProcessingPlanJob.d.ts +2 -2
  253. package/dist/openapi/models/ProcessingPlanJob.js +2 -2
  254. package/dist/openapi/models/ReEncodeDecision.d.ts +2 -2
  255. package/dist/openapi/models/ReEncodeDecision.js +2 -2
  256. package/dist/openapi/models/ReadinessResponse.d.ts +2 -2
  257. package/dist/openapi/models/ReadinessResponse.js +2 -2
  258. package/dist/openapi/models/RegisterUser422Response.d.ts +27 -0
  259. package/dist/openapi/models/RegisterUser422Response.js +47 -0
  260. package/dist/openapi/models/RegisterUserRequest.d.ts +38 -0
  261. package/dist/openapi/models/RegisterUserRequest.js +47 -0
  262. package/dist/openapi/models/ResetPasswordRequest.d.ts +38 -0
  263. package/dist/openapi/models/ResetPasswordRequest.js +47 -0
  264. package/dist/openapi/models/ResponseEnvelope.d.ts +2 -2
  265. package/dist/openapi/models/ResponseEnvelope.js +2 -2
  266. package/dist/openapi/models/RetryResponse.d.ts +2 -2
  267. package/dist/openapi/models/RetryResponse.js +2 -2
  268. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +2 -2
  269. package/dist/openapi/models/RetrySuccessEnvelope.js +2 -2
  270. package/dist/openapi/models/SseCompletionBase.d.ts +2 -2
  271. package/dist/openapi/models/SseCompletionBase.js +2 -2
  272. package/dist/openapi/models/SseEventType.d.ts +2 -2
  273. package/dist/openapi/models/SseEventType.js +2 -2
  274. package/dist/openapi/models/SseJobCompletedData.d.ts +2 -2
  275. package/dist/openapi/models/SseJobCompletedData.js +2 -2
  276. package/dist/openapi/models/SseJobFailedData.d.ts +2 -2
  277. package/dist/openapi/models/SseJobFailedData.js +2 -2
  278. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +2 -2
  279. package/dist/openapi/models/SseMultiOutputCompletion.js +2 -2
  280. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +2 -2
  281. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +2 -2
  282. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +2 -2
  283. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +2 -2
  284. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +2 -2
  285. package/dist/openapi/models/SseMultiOutputResultEntry.js +2 -2
  286. package/dist/openapi/models/SseOperationCompletedData.d.ts +17 -3
  287. package/dist/openapi/models/SseOperationCompletedData.js +2 -2
  288. package/dist/openapi/models/SseOperationCompletionResult.d.ts +2 -2
  289. package/dist/openapi/models/SseOperationCompletionResult.js +2 -2
  290. package/dist/openapi/models/SseOperationFailedData.d.ts +2 -2
  291. package/dist/openapi/models/SseOperationFailedData.js +2 -2
  292. package/dist/openapi/models/SseOperationProgressData.d.ts +2 -2
  293. package/dist/openapi/models/SseOperationProgressData.js +2 -2
  294. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +2 -2
  295. package/dist/openapi/models/SseSingleOutputCompletion.js +2 -2
  296. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +2 -2
  297. package/dist/openapi/models/SseWorkflowTerminalData.js +2 -2
  298. package/dist/openapi/models/TierRestrictionKind.d.ts +2 -2
  299. package/dist/openapi/models/TierRestrictionKind.js +2 -2
  300. package/dist/openapi/models/TierRestrictionResponse.d.ts +13 -2
  301. package/dist/openapi/models/TierRestrictionResponse.js +2 -2
  302. package/dist/openapi/models/UpdateProfile200Response.d.ts +46 -0
  303. package/dist/openapi/models/UpdateProfile200Response.js +54 -0
  304. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +71 -0
  305. package/dist/openapi/models/UpdateProfile200ResponseData.js +67 -0
  306. package/dist/openapi/models/UpdateProfile422Response.d.ts +27 -0
  307. package/dist/openapi/models/UpdateProfile422Response.js +47 -0
  308. package/dist/openapi/models/UpdateProfileRequest.d.ts +44 -0
  309. package/dist/openapi/models/UpdateProfileRequest.js +47 -0
  310. package/dist/openapi/models/UploadConstraintsApplied.d.ts +2 -2
  311. package/dist/openapi/models/UploadConstraintsApplied.js +2 -2
  312. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +13 -2
  313. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +2 -2
  314. package/dist/openapi/models/UploadFile403Response.d.ts +2 -2
  315. package/dist/openapi/models/UploadFile403Response.js +2 -2
  316. package/dist/openapi/models/UploadFile422Response.d.ts +2 -2
  317. package/dist/openapi/models/UploadFile422Response.js +2 -2
  318. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +2 -2
  319. package/dist/openapi/models/UploadProbeMediaMetadata.js +2 -2
  320. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +2 -2
  321. package/dist/openapi/models/UploadProbeProcessingClass.js +2 -2
  322. package/dist/openapi/models/UploadProbeResponse.d.ts +2 -2
  323. package/dist/openapi/models/UploadProbeResponse.js +2 -2
  324. package/dist/openapi/models/UploadProbeStatus.d.ts +2 -2
  325. package/dist/openapi/models/UploadProbeStatus.js +2 -2
  326. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +2 -2
  327. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +2 -2
  328. package/dist/openapi/models/UploadResponse.d.ts +2 -2
  329. package/dist/openapi/models/UploadResponse.js +2 -2
  330. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +13 -2
  331. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +2 -2
  332. package/dist/openapi/models/UploadSource.d.ts +2 -2
  333. package/dist/openapi/models/UploadSource.js +2 -2
  334. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +2 -2
  335. package/dist/openapi/models/UploadSuccessEnvelope.js +2 -2
  336. package/dist/openapi/models/UploadThresholds.d.ts +2 -2
  337. package/dist/openapi/models/UploadThresholds.js +2 -2
  338. package/dist/openapi/models/UserTier.d.ts +2 -2
  339. package/dist/openapi/models/UserTier.js +2 -2
  340. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +2 -2
  341. package/dist/openapi/models/ValidationErrorEnvelope.js +2 -2
  342. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +2 -2
  343. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +2 -2
  344. package/dist/openapi/models/VerifyEmailRequest.d.ts +32 -0
  345. package/dist/openapi/models/VerifyEmailRequest.js +43 -0
  346. package/dist/openapi/models/WarningType.d.ts +2 -2
  347. package/dist/openapi/models/WarningType.js +2 -2
  348. package/dist/openapi/models/WebhookOperationContext.d.ts +2 -2
  349. package/dist/openapi/models/WebhookOperationContext.js +2 -2
  350. package/dist/openapi/models/WebhookPayload.d.ts +2 -2
  351. package/dist/openapi/models/WebhookPayload.js +2 -2
  352. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +2 -2
  353. package/dist/openapi/models/WorkflowCancelBillingEffect.js +2 -2
  354. package/dist/openapi/models/WorkflowCancelResponse.d.ts +2 -2
  355. package/dist/openapi/models/WorkflowCancelResponse.js +2 -2
  356. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +2 -2
  357. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +2 -2
  358. package/dist/openapi/models/WorkflowCreateRequest.d.ts +64 -4
  359. package/dist/openapi/models/WorkflowCreateRequest.js +10 -6
  360. package/dist/openapi/models/WorkflowCreateResponse.d.ts +24 -2
  361. package/dist/openapi/models/WorkflowCreateResponse.js +5 -2
  362. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +2 -2
  363. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +2 -2
  364. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +2 -2
  365. package/dist/openapi/models/WorkflowDownloadResponse.js +2 -2
  366. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +2 -2
  367. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +2 -2
  368. package/dist/openapi/models/WorkflowEdge.d.ts +2 -2
  369. package/dist/openapi/models/WorkflowEdge.js +2 -2
  370. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +13 -2
  371. package/dist/openapi/models/WorkflowExpiredResponse.js +2 -2
  372. package/dist/openapi/models/WorkflowListResponse.d.ts +50 -0
  373. package/dist/openapi/models/WorkflowListResponse.js +50 -0
  374. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +46 -0
  375. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +54 -0
  376. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +2 -2
  377. package/dist/openapi/models/WorkflowPauseRequiredAction.js +2 -2
  378. package/dist/openapi/models/WorkflowPausedDetail.d.ts +2 -2
  379. package/dist/openapi/models/WorkflowPausedDetail.js +2 -2
  380. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +2 -2
  381. package/dist/openapi/models/WorkflowPausedDetailLinks.js +2 -2
  382. package/dist/openapi/models/WorkflowProcessing.d.ts +2 -2
  383. package/dist/openapi/models/WorkflowProcessing.js +2 -2
  384. package/dist/openapi/models/WorkflowResumeResponse.d.ts +2 -2
  385. package/dist/openapi/models/WorkflowResumeResponse.js +2 -2
  386. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +2 -2
  387. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +2 -2
  388. package/dist/openapi/models/WorkflowSource.d.ts +7 -4
  389. package/dist/openapi/models/WorkflowSource.js +2 -2
  390. package/dist/openapi/models/WorkflowStatus.d.ts +2 -2
  391. package/dist/openapi/models/WorkflowStatus.js +2 -2
  392. package/dist/openapi/models/WorkflowStatusResponse.d.ts +21 -2
  393. package/dist/openapi/models/WorkflowStatusResponse.js +5 -2
  394. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +2 -2
  395. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +2 -2
  396. package/dist/openapi/models/WorkflowSummary.d.ts +60 -0
  397. package/dist/openapi/models/WorkflowSummary.js +57 -0
  398. package/dist/openapi/models/WorkflowSummaryJob.d.ts +57 -0
  399. package/dist/openapi/models/WorkflowSummaryJob.js +57 -0
  400. package/dist/openapi/models/WorkflowWarning.d.ts +2 -2
  401. package/dist/openapi/models/WorkflowWarning.js +2 -2
  402. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +2 -2
  403. package/dist/openapi/models/WorkflowWarningSeverity.js +2 -2
  404. package/dist/openapi/models/index.d.ts +31 -1
  405. package/dist/openapi/models/index.js +31 -1
  406. package/dist/openapi/runtime.d.ts +2 -2
  407. package/dist/openapi/runtime.js +2 -2
  408. package/dist/operations/compress.d.ts +0 -9
  409. package/dist/operations/compress.js +0 -6
  410. package/dist/operations/compress.metadata.js +4 -12
  411. package/dist/operations/index.d.ts +3 -0
  412. package/dist/operations/index.js +3 -0
  413. package/dist/operations/merge.d.ts +4 -0
  414. package/dist/operations/merge.metadata.js +12 -0
  415. package/dist/operations/passthrough.metadata.d.ts +2 -0
  416. package/dist/operations/passthrough.metadata.js +6 -0
  417. package/dist/operations/render_variants.d.ts +24 -0
  418. package/dist/operations/render_variants.js +14 -0
  419. package/dist/operations/render_variants.metadata.d.ts +2 -0
  420. package/dist/operations/render_variants.metadata.js +18 -0
  421. package/dist/operations/split.d.ts +8 -1
  422. package/dist/operations/split.js +5 -0
  423. package/dist/operations/split.metadata.js +18 -5
  424. package/openapi/api.yaml +2333 -241
  425. package/operations/schemas/archive.yaml +1 -1
  426. package/operations/schemas/audio_overlay.yaml +29 -13
  427. package/operations/schemas/audio_to_video.yaml +6 -5
  428. package/operations/schemas/audio_watermark.yaml +18 -16
  429. package/operations/schemas/compress.yaml +34 -32
  430. package/operations/schemas/custom_luma.yaml +18 -3
  431. package/operations/schemas/image_watermark.yaml +22 -7
  432. package/operations/schemas/merge.yaml +88 -35
  433. package/operations/schemas/passthrough.yaml +49 -0
  434. package/operations/schemas/render_variants.yaml +117 -0
  435. package/operations/schemas/split.yaml +72 -18
  436. package/operations/schemas/text_watermark.yaml +6 -6
  437. package/operations/schemas/thumbnail.yaml +1 -1
  438. package/operations/schemas/video_text_watermark.yaml +2 -2
  439. package/operations/schemas/video_watermark.yaml +7 -4
  440. package/package.json +3 -1
  441. package/dist/openapi/models/LogoutUser200Response.d.ts +0 -50
  442. package/dist/openapi/models/LogoutUser200Response.js +0 -53
  443. /package/dist/asyncapi/{NotificationsOperationsQueue.js → NotificationsJobsQueue.js} +0 -0
@@ -1,6 +1,13 @@
1
1
  {
2
- "capabilities_version": 60,
2
+ "capabilities_version": 89,
3
3
  "endpoints": {
4
+ "DELETE /api/auth/api-keys/{apiKeyId}": {
5
+ "auth": "required",
6
+ "availability": "stable",
7
+ "identity_scoped": true,
8
+ "operation_id": "revokeApiKey",
9
+ "required_tier": null
10
+ },
4
11
  "GET /api/operations/schema": {
5
12
  "auth": "optional",
6
13
  "availability": "stable",
@@ -36,6 +43,13 @@
36
43
  "operation_id": "getCreditsUsage",
37
44
  "required_tier": null
38
45
  },
46
+ "GET /api/workflows": {
47
+ "auth": "required",
48
+ "availability": "stable",
49
+ "identity_scoped": true,
50
+ "operation_id": "listWorkflows",
51
+ "required_tier": null
52
+ },
39
53
  "GET /api/workflows/{id}/downloads": {
40
54
  "auth": "optional",
41
55
  "availability": "stable",
@@ -71,6 +85,13 @@
71
85
  "operation_id": "readiness",
72
86
  "required_tier": null
73
87
  },
88
+ "PATCH /api/auth/profile": {
89
+ "auth": "required",
90
+ "availability": "stable",
91
+ "identity_scoped": true,
92
+ "operation_id": "updateProfile",
93
+ "required_tier": null
94
+ },
74
95
  "POST /api/audio-watermark/decode": {
75
96
  "auth": "required",
76
97
  "availability": "stable",
@@ -78,6 +99,34 @@
78
99
  "operation_id": "decodeAudioWatermark",
79
100
  "required_tier": null
80
101
  },
102
+ "POST /api/auth/api-keys": {
103
+ "auth": "required",
104
+ "availability": "stable",
105
+ "identity_scoped": true,
106
+ "operation_id": "createApiKey",
107
+ "required_tier": null
108
+ },
109
+ "POST /api/auth/change-password": {
110
+ "auth": "required",
111
+ "availability": "stable",
112
+ "identity_scoped": true,
113
+ "operation_id": "changePassword",
114
+ "required_tier": null
115
+ },
116
+ "POST /api/auth/confirm-email-change": {
117
+ "auth": "anonymous",
118
+ "availability": "stable",
119
+ "identity_scoped": false,
120
+ "operation_id": "confirmEmailChange",
121
+ "required_tier": null
122
+ },
123
+ "POST /api/auth/forgot-password": {
124
+ "auth": "anonymous",
125
+ "availability": "stable",
126
+ "identity_scoped": false,
127
+ "operation_id": "forgotPassword",
128
+ "required_tier": null
129
+ },
81
130
  "POST /api/auth/login": {
82
131
  "auth": "anonymous",
83
132
  "availability": "stable",
@@ -92,6 +141,27 @@
92
141
  "operation_id": "logoutUser",
93
142
  "required_tier": null
94
143
  },
144
+ "POST /api/auth/register": {
145
+ "auth": "anonymous",
146
+ "availability": "stable",
147
+ "identity_scoped": false,
148
+ "operation_id": "registerUser",
149
+ "required_tier": null
150
+ },
151
+ "POST /api/auth/reset-password": {
152
+ "auth": "anonymous",
153
+ "availability": "stable",
154
+ "identity_scoped": false,
155
+ "operation_id": "resetPassword",
156
+ "required_tier": null
157
+ },
158
+ "POST /api/auth/verify-email": {
159
+ "auth": "anonymous",
160
+ "availability": "stable",
161
+ "identity_scoped": false,
162
+ "operation_id": "verifyEmail",
163
+ "required_tier": null
164
+ },
95
165
  "POST /api/contact": {
96
166
  "auth": "anonymous",
97
167
  "availability": "stable",
@@ -190,7 +260,7 @@
190
260
  "options": {
191
261
  "folder_structure": {
192
262
  "default": "flat",
193
- "description": "flat = all files in root, by_job = subfolder per source job",
263
+ "description": "flat = all files together at the top level; by_job = a separate subfolder for each source",
194
264
  "type": "enum",
195
265
  "values": [
196
266
  "flat",
@@ -211,7 +281,7 @@
211
281
  "audio_overlay": {
212
282
  "availability": "planned",
213
283
  "default": false,
214
- "description": "Mix a secondary audio asset (overlay) over a primary audio or\nvideo base. Use cases: DJ tags, podcast intros/outros, station\nIDs, jingles, branded mid-rolls.\n\n**Industry naming.** This is \"audio overlay\" or \"audio branding\"\n\u2014 NOT \"audio watermark\". Audio watermarking is steganographic\n(imperceptible identifier embedded in audio for ownership /\nforensic tracking) and is owned by the separate `audio_watermark`\noperation (planned per ticket I20).\n\nMulti-input (Path B with `role: base` + `role: overlay` per\n`JobInputV2.role`). `min_inputs: 2 = max_inputs: 2` for V2.0;\nmulti-overlay support is advertised as a planned feature\n(`features.multi_overlay_stack`) but Lambda-side implementation\ndeferred.\n\nThe overlay can be uploaded directly, imported externally, or\nreferenced from a vault connection per `WorkflowSource` (from\nI10). The base is whatever single-asset source the workflow\nupstream has \u2014 for `mime_groups.audio`, the base is the primary\naudio track; for `mime_groups.video`, the overlay is mixed into\nthe video's audio track and the visual track passes through\nuntouched.\n\nPer ADR-0001 \u00a71.3 (Tension 1 \u2014 `planned` operations return\n`feature_not_available` 422 until Lambda support ships). Per\nADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F1 round 6.\n",
284
+ "description": "Mix a secondary audio asset (overlay) over a primary audio or\nvideo base. Use cases: DJ tags, podcast intros/outros, station\nIDs, jingles, branded mid-rolls.\n\n**Industry naming.** This is \"audio overlay\" or \"audio branding\"\n\u2014 NOT \"audio watermark\". Audio watermarking is steganographic\n(imperceptible identifier embedded in audio for ownership /\nforensic tracking) and is owned by the separate `audio_watermark`\noperation (planned per ticket I20).\n\nMulti-input (Path B with `role: base` + `role: overlay` per\n`JobInputV2.role`). `min_inputs: 2 = max_inputs: 2` for V2.0;\nmulti-overlay support is advertised as a planned feature\n(`features.multi_overlay_stack`) but Lambda-side implementation\ndeferred.\n\nEach input is a `MultiInputSource` \u2014 imported externally,\nreferenced from a vault connection, or an upstream `job_output`\n(uploads are NOT referenced directly inside inputs[]). An uploaded\noverlay or base enters via a `passthrough` source job referenced by\n`{ type: job_output, from: <id> }` (per ticket 4som89Uh). The base\nis whatever single-asset source the workflow\nupstream has \u2014 for `mime_groups.audio`, the base is the primary\naudio track; for `mime_groups.video`, the overlay is mixed into\nthe video's audio track and the visual track passes through\nuntouched.\n\nPer ADR-0001 \u00a71.3 (Tension 1 \u2014 `planned` operations return\n`feature_not_available` 422 until Lambda support ships). Per\nADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F1 round 6.\n",
215
285
  "features": {
216
286
  "multi_overlay_stack": {
217
287
  "availability": "planned",
@@ -250,7 +320,7 @@
250
320
  "depends_on": {
251
321
  "mode": "duck"
252
322
  },
253
- "description": "Side-chain compression ratio. Higher values produce more\naggressive ducking. Only applies when `mode: duck`.\n",
323
+ "description": "How strongly the base ducks \u2014 higher values dip it more\naggressively. Only applies when `mode: duck`.\n",
254
324
  "max": 20.0,
255
325
  "min": 1.0,
256
326
  "type": "float"
@@ -270,7 +340,7 @@
270
340
  "depends_on": {
271
341
  "mode": "duck"
272
342
  },
273
- "description": "Side-chain threshold (dB). Base audio is ducked when the\noverlay exceeds this level. Only applies when `mode: duck`.\n",
343
+ "description": "Level (dB) the overlay must reach before the base audio\nducks. Only applies when `mode: duck`.\n",
274
344
  "max": 0.0,
275
345
  "min": -60.0,
276
346
  "type": "float"
@@ -319,7 +389,7 @@
319
389
  },
320
390
  "mode": {
321
391
  "default": "mix",
322
- "description": "How the overlay combines with the base audio:\n- `mix`: simple sum (overlay + base; both audible).\n- `duck`: side-chain compress the base under the overlay\n (base attenuates while overlay plays \u2014 broadcast pattern).\n- `replace`: mute the base for the overlay's duration\n (overlay only; useful for hard-cut station IDs).\n",
392
+ "description": "How the overlay combines with the base audio:\n- `mix`: both play together (overlay added on top; both audible).\n- `duck`: the base audio dips while the overlay plays, then\n returns \u2014 the broadcast voice-over pattern.\n- `replace`: mute the base for the overlay's duration\n (overlay only; useful for hard-cut station IDs).\n",
323
393
  "per_value_availability": {
324
394
  "duck": {
325
395
  "availability": "planned"
@@ -402,7 +472,7 @@
402
472
  "depends_on": {
403
473
  "mode": "duck"
404
474
  },
405
- "description": "Side-chain compression ratio. Only applies when `mode: duck`.",
475
+ "description": "How strongly the base ducks \u2014 higher values dip it more aggressively. Only applies when `mode: duck`.",
406
476
  "max": 20.0,
407
477
  "min": 1.0,
408
478
  "type": "float"
@@ -422,7 +492,7 @@
422
492
  "depends_on": {
423
493
  "mode": "duck"
424
494
  },
425
- "description": "Side-chain threshold (dB). Only applies when `mode: duck`.",
495
+ "description": "Level (dB) the overlay must reach before the base audio ducks. Only applies when `mode: duck`.",
426
496
  "max": 0.0,
427
497
  "min": -60.0,
428
498
  "type": "float"
@@ -471,7 +541,7 @@
471
541
  },
472
542
  "mode": {
473
543
  "default": "mix",
474
- "description": "Same modes as the audio mime_group. `replace` mutes the\nbase video's audio for the overlay's duration.\n",
544
+ "description": "Same modes as for audio overlays. `replace` mutes the\nbase video's audio for the overlay's duration.\n",
475
545
  "per_value_availability": {
476
546
  "duck": {
477
547
  "availability": "planned"
@@ -543,7 +613,17 @@
543
613
  }
544
614
  }
545
615
  },
546
- "min_inputs": 2
616
+ "min_inputs": 2,
617
+ "per_role_cardinality": {
618
+ "base": {
619
+ "max": 1,
620
+ "min": 1
621
+ },
622
+ "overlay": {
623
+ "max": 1,
624
+ "min": 1
625
+ }
626
+ }
547
627
  },
548
628
  "audio_to_video": {
549
629
  "availability": "beta",
@@ -561,6 +641,7 @@
561
641
  "audio/flac",
562
642
  "audio/ogg",
563
643
  "audio/opus",
644
+ "audio/mp4",
564
645
  "audio/x-m4a"
565
646
  ],
566
647
  "options": {
@@ -571,7 +652,7 @@
571
652
  },
572
653
  "framerate": {
573
654
  "default": 2,
574
- "description": "Output video framerate. Default `2` fps \u2014 combined with\nFFmpeg `-tune stillimage`, keeps the file size tiny for\nthe common case of a single still overlay. Raise for\nanimated overlays (not supported in V1 \u2014 overlay must be\na still image) or platform requirements (e.g. YouTube\nrecommends 24+ fps; some platforms accept lower).\n",
655
+ "description": "Output video framerate. Default `2` fps keeps the file size\ntiny for the common case of a single still overlay. Raise for\nanimated overlays (not supported in V1 \u2014 overlay must be\na still image) or platform requirements (e.g. YouTube\nrecommends 24+ fps; some platforms accept lower).\n",
575
656
  "max": 60,
576
657
  "min": 1,
577
658
  "type": "integer"
@@ -588,7 +669,7 @@
588
669
  },
589
670
  "output_format": {
590
671
  "default": "mp4",
591
- "description": "Output container format. V1 supports `mp4` only. Future\nadditions (webm, mov) await Lambda follow-up.\n",
672
+ "description": "Output container format. V1 supports `mp4` only; webm and mov\nare planned additions.\n",
592
673
  "type": "enum",
593
674
  "values": [
594
675
  "mp4"
@@ -647,7 +728,7 @@
647
728
  },
648
729
  "method": {
649
730
  "default": "auto",
650
- "description": "Watermarking algorithm:\n- `auto`: server selects the best available method for the\n input (currently maps to `psychoacoustic`; will widen as\n `neural` ships).\n- `psychoacoustic`: classical masking-curve embedding.\n Resemble's open-source PerTh library provides the path-\n to-prod reference implementation. Survives MP3/AAC at\n moderate bitrates and broadcast chains.\n- `neural`: ML-based embedding (deep generative). Higher\n survival under aggressive transcoding + analog-hole\n capture; longer encoding time + non-deterministic.\n",
731
+ "description": "Watermarking algorithm:\n- `auto`: server selects the best available method for the\n input (currently maps to `psychoacoustic`; will widen as\n `neural` ships).\n- `psychoacoustic`: hides the mark below what the ear can\n hear, so it stays inaudible. Survives MP3/AAC at moderate\n bitrates and broadcast chains.\n- `neural`: machine-learning embedding. Higher survival\n under aggressive re-encoding and microphone re-recording;\n longer encoding time and non-deterministic.\n",
651
732
  "per_value_availability": {
652
733
  "neural": {
653
734
  "availability": "planned"
@@ -661,13 +742,13 @@
661
742
  ]
662
743
  },
663
744
  "payload": {
664
- "description": "Optional caller-supplied payload to embed (max 256\ncharacters). Use cases: ownership marker, distribution\nchannel ID, license key. When omitted, the server\ngenerates a UUID-v7 `watermark_id` and embeds that\ninstead; the generated ID is returned on\n`OperationResult` so the caller can subsequently call\nthe decode endpoint to verify.\n",
745
+ "description": "Optional caller-supplied payload to embed (max 256\ncharacters). Use cases: ownership marker, distribution\nchannel ID, license key. When omitted, the server\ngenerates an identifier automatically and embeds that\ninstead; the generated ID is returned on\n`OperationResult` so the caller can subsequently call\nthe decode endpoint to verify.\n",
665
746
  "required": false,
666
747
  "type": "string"
667
748
  },
668
749
  "robustness": {
669
750
  "default": "compression_resistant",
670
- "description": "Survival profile:\n- `light`: minimal payload-strength; smallest perceptual\n footprint. Survives a single re-encode pass at moderate\n bitrate.\n- `compression_resistant` (default): survives multiple\n MP3/AAC re-encodes at typical streaming bitrates.\n- `broadcast_grade`: survives broadcast compression\n chains, EQ, dynamic-range compression, and analog-hole\n capture (microphone re-recording). Higher embedding\n time + slightly larger perceptual footprint.\n",
751
+ "description": "Survival profile:\n- `light`: minimal payload-strength; smallest perceptual\n footprint. Survives a single re-encode pass at moderate\n bitrate.\n- `compression_resistant` (default): survives multiple\n MP3/AAC re-encodes at typical streaming bitrates.\n- `broadcast_grade`: survives broadcast compression\n chains, EQ, dynamic-range compression, and microphone\n re-recording. Higher embedding time + slightly larger\n perceptual footprint.\n",
671
752
  "type": "enum",
672
753
  "values": [
673
754
  "light",
@@ -716,7 +797,7 @@
716
797
  },
717
798
  "method": {
718
799
  "default": "auto",
719
- "description": "Watermarking algorithm. Same semantics as the `audio`\nmime_group; embedded into the video's audio track only.\n",
800
+ "description": "Watermarking algorithm. Same as for an audio input;\nembedded into the video's audio track only.\n",
720
801
  "per_value_availability": {
721
802
  "neural": {
722
803
  "availability": "planned"
@@ -730,13 +811,13 @@
730
811
  ]
731
812
  },
732
813
  "payload": {
733
- "description": "Optional caller-supplied payload to embed (max 256\ncharacters). When omitted, the server generates a UUID-v7\n`watermark_id` and embeds that instead.\n",
814
+ "description": "Optional caller-supplied payload to embed (max 256\ncharacters). When omitted, the server generates an\nidentifier automatically and embeds that instead.\n",
734
815
  "required": false,
735
816
  "type": "string"
736
817
  },
737
818
  "robustness": {
738
819
  "default": "compression_resistant",
739
- "description": "Survival profile. Same semantics as audio mime_group.",
820
+ "description": "Survival profile. Same as for an audio input.",
740
821
  "type": "enum",
741
822
  "values": [
742
823
  "light",
@@ -820,12 +901,14 @@
820
901
  ]
821
902
  },
822
903
  "trim_end": {
823
- "description": "Trim from end in seconds",
904
+ "availability": "planned",
905
+ "description": "Trim from end in seconds. Gated `planned` (qZI5EK9j) \u2014 see `trim_start`.",
824
906
  "min": 0,
825
907
  "type": "float"
826
908
  },
827
909
  "trim_start": {
828
- "description": "Trim from beginning in seconds",
910
+ "availability": "planned",
911
+ "description": "Trim from beginning in seconds. Gated `planned` (qZI5EK9j): no compression worker implements per-clip trim yet, so the server returns `feature_not_available` rather than accepting and silently ignoring it. Flips to `stable` when a worker lands; to trim today, chain a `split` op.\n",
829
912
  "min": 0,
830
913
  "type": "float"
831
914
  }
@@ -961,32 +1044,6 @@
961
1044
  "image/avif"
962
1045
  ],
963
1046
  "options": {
964
- "auto_orient": {
965
- "default": true,
966
- "description": "Auto-rotate based on EXIF orientation",
967
- "type": "boolean"
968
- },
969
- "fit": {
970
- "default": "max",
971
- "depends_on": {
972
- "height": "set",
973
- "logic": "or",
974
- "width": "set"
975
- },
976
- "description": "Resize mode. max = fit within bounds, crop = fill and trim, scale = force exact dimensions. Only applies when width or height is set.",
977
- "type": "enum",
978
- "values": [
979
- "max",
980
- "crop",
981
- "scale"
982
- ]
983
- },
984
- "height": {
985
- "description": "Maximum output height in pixels",
986
- "max": 16384,
987
- "min": 1,
988
- "type": "integer"
989
- },
990
1047
  "icc_profile": {
991
1048
  "default": "preserve",
992
1049
  "description": "ICC color profile handling. preserve = keep original, strip = remove, srgb = convert to sRGB",
@@ -1046,12 +1103,6 @@
1046
1103
  "max": 100,
1047
1104
  "min": 1,
1048
1105
  "type": "integer"
1049
- },
1050
- "width": {
1051
- "description": "Maximum output width in pixels",
1052
- "max": 16384,
1053
- "min": 1,
1054
- "type": "integer"
1055
1106
  }
1056
1107
  }
1057
1108
  },
@@ -1059,7 +1110,7 @@
1059
1110
  "mimes": [
1060
1111
  "video/mp4",
1061
1112
  "video/webm",
1062
- "video/ogg"
1113
+ "video/quicktime"
1063
1114
  ],
1064
1115
  "options": {
1065
1116
  "audio_bitrate": {
@@ -1110,7 +1161,7 @@
1110
1161
  },
1111
1162
  "encoding_mode": {
1112
1163
  "default": "crf",
1113
- "description": "crf = constant quality (variable file size), target_size = constrained file size (two-pass)",
1164
+ "description": "crf = constant quality (variable file size), target_size = constrained file size",
1114
1165
  "type": "enum",
1115
1166
  "values": [
1116
1167
  "crf",
@@ -1119,7 +1170,7 @@
1119
1170
  },
1120
1171
  "faststart": {
1121
1172
  "default": true,
1122
- "description": "Move MP4 moov atom to start for progressive web playback (MP4 only)",
1173
+ "description": "Move the MP4/MOV moov atom to start for progressive web playback. MP4/MOV only; an explicit faststart on a WebM output is rejected as invalid_options (no moov atom).",
1123
1174
  "type": "boolean"
1124
1175
  },
1125
1176
  "fit": {
@@ -1145,9 +1196,9 @@
1145
1196
  "type": "float"
1146
1197
  },
1147
1198
  "height": {
1148
- "description": "Output height in pixels",
1199
+ "description": "Output height in pixels. Must be an EVEN integer >= 2 (yuv420p chroma-subsampling); odd values are rejected as invalid_options by the encoder.",
1149
1200
  "max": 4320,
1150
- "min": 1,
1201
+ "min": 2,
1151
1202
  "type": "integer"
1152
1203
  },
1153
1204
  "preset": {
@@ -1170,24 +1221,26 @@
1170
1221
  "depends_on": {
1171
1222
  "encoding_mode": "target_size"
1172
1223
  },
1173
- "description": "Target output file size in bytes (min 1MB). Two-pass encoding to meet this target.",
1224
+ "description": "Target output file size in bytes (min 1MB).",
1174
1225
  "min": 1048576,
1175
1226
  "type": "integer"
1176
1227
  },
1177
1228
  "trim_end": {
1178
- "description": "Trim from end in seconds",
1229
+ "availability": "planned",
1230
+ "description": "Trim from end in seconds. Gated `planned` (qZI5EK9j) \u2014 see `trim_start`.",
1179
1231
  "min": 0,
1180
1232
  "type": "float"
1181
1233
  },
1182
1234
  "trim_start": {
1183
- "description": "Trim from beginning in seconds",
1235
+ "availability": "planned",
1236
+ "description": "Trim from beginning in seconds. Gated `planned` (qZI5EK9j): no compression worker implements per-clip trim yet, so the server returns `feature_not_available` rather than accepting and silently ignoring it. Flips to `stable` when a worker lands; to trim today, chain a `split` op.\n",
1184
1237
  "min": 0,
1185
1238
  "type": "float"
1186
1239
  },
1187
1240
  "width": {
1188
- "description": "Output width in pixels",
1241
+ "description": "Output width in pixels. Must be an EVEN integer >= 2 (yuv420p chroma-subsampling); odd values are rejected as invalid_options by the encoder.",
1189
1242
  "max": 7680,
1190
- "min": 1,
1243
+ "min": 2,
1191
1244
  "type": "integer"
1192
1245
  }
1193
1246
  },
@@ -1414,7 +1467,7 @@
1414
1467
  "custom_luma": {
1415
1468
  "availability": "planned",
1416
1469
  "default": false,
1417
- "description": "Apply a caller-uploaded luma matte (transition-mask) over a base\nvideo to produce a custom luma-matte transition effect. Inspired\nby Cloudinary's deprecated luma-matte custom transitions and\nintended as a paid-tier (`pro`+) creative feature.\n\n**NOT** related to FFmpeg's `xfade=custom` filter (which is an\nexpression-mode parameter on the same `xfade` filter). The\n`merge.transition.custom` value is tagged `planned` as an advisory\nthat points callers at this dedicated operation for caller-uploaded\nluma-matte transitions.\n\nMulti-input: exactly one input with `role: base` (the source\nvideo being transitioned) + exactly one input with\n`role: transition_mask` (the luma matte \u2014 a video whose pixel\nluminance drives the transition reveal \u2014 bright = revealed,\ndark = held). The mask can be uploaded directly, imported\nexternally, or referenced from a vault connection per\n`WorkflowSource` (from I10).\n\nPer ADR-0001 \u00a71.3 (Tension 1 \u2014 `planned` operations return\n`feature_not_available` HTTP 422 until Lambda support ships).\nPer ADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F4 round 6\n(codex-corrected \u2014 `xfade=custom` is an expression, not a\ntransition; this operation is the deliberate alternative).\n",
1470
+ "description": "Apply a caller-uploaded luma matte (transition-mask) over a base\nvideo to produce a custom luma-matte transition effect. Inspired\nby Cloudinary's deprecated luma-matte custom transitions and\nintended as a paid-tier (`pro`+) creative feature.\n\n**NOT** related to FFmpeg's `xfade=custom` filter (which is an\nexpression-mode parameter on the same `xfade` filter). The\n`merge.transition.custom` value is tagged `planned` as an advisory\nthat points callers at this dedicated operation for caller-uploaded\nluma-matte transitions.\n\nMulti-input: exactly one input with `role: base` (the source\nvideo being transitioned) + exactly one input with\n`role: transition_mask` (the luma matte \u2014 a video whose pixel\nluminance drives the transition reveal \u2014 bright = revealed,\ndark = held). Each input is a `MultiInputSource` \u2014 imported\nexternally, referenced from a vault connection, or an upstream\n`job_output` (uploads are NOT referenced directly inside inputs[]).\nAn uploaded base or mask enters via a `passthrough` source job\nreferenced by `{ type: job_output, from: <id> }` (per ticket\n4som89Uh).\n\nPer ADR-0001 \u00a71.3 (Tension 1 \u2014 `planned` operations return\n`feature_not_available` HTTP 422 until Lambda support ships).\nPer ADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F4 round 6\n(codex-corrected \u2014 `xfade=custom` is an expression, not a\ntransition; this operation is the deliberate alternative).\n",
1418
1471
  "input_model": "multi",
1419
1472
  "max_inputs": 2,
1420
1473
  "mime_groups": {
@@ -1486,11 +1539,21 @@
1486
1539
  }
1487
1540
  },
1488
1541
  "min_inputs": 2,
1542
+ "per_role_cardinality": {
1543
+ "base": {
1544
+ "max": 1,
1545
+ "min": 1
1546
+ },
1547
+ "transition_mask": {
1548
+ "max": 1,
1549
+ "min": 1
1550
+ }
1551
+ },
1489
1552
  "required_tier": "pro"
1490
1553
  },
1491
1554
  "image_watermark": {
1492
1555
  "default": false,
1493
- "description": "Apply an image overlay (file or external source) onto a base media\nasset. Multi-input: exactly one input with role: base (the source\nasset) + exactly one with role: overlay (the watermark). The overlay\ncan be an upload, an external_import handle, or a vault connection\nper WorkflowSource (ticket I10).\n\nStable today for static-image bases (image/jpeg, image/png,\nimage/webp); animated GIF bases are advertised as `planned` via\nthe parallel `image_gif` mime_group \u2014 schema is contract-defined,\ndispatch returns `feature_not_available` (422) until Lambda\nsupport ships. Per Tension 1 (ADR-0001) + plan v5 \u00a7F4 round 6.\n\n**Video bases are NOT supported by `image_watermark`.** Use the\ndedicated `video_watermark` operation\n(`schemas/operations/video_watermark.yaml`) which routes through\nFFmpeg overlay + re-encode. Per ADR-0013.\n\n**Audio is explicitly NOT supported.** For audio overlay (DJ tags,\npodcast intros, jingles), use the `audio_overlay` operation\n(declared in schemas/operations/audio_overlay.yaml at\n`availability: planned`).\n\nSource capped at 25 megapixels for image bases (V1 watermark\nprecedent retained); per-frame caps for animated GIF bases will be\ndefined when the corresponding Lambda support ships.\nPer ADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F1.\n",
1556
+ "description": "Apply an image overlay onto a base media\nasset. Multi-input: exactly one input with role: base (the source\nasset) + exactly one with role: overlay (the watermark). Each input\nis a `MultiInputSource` \u2014 an external_import handle, a vault\nconnection, or an upstream `job_output` (uploads are NOT referenced\ndirectly inside inputs[]). To use an uploaded base or overlay, feed\nit through a `passthrough` source job and reference that job via\n`{ type: job_output, from: <id> }` (per ticket 4som89Uh).\n\nStable today for static-image bases (image/jpeg, image/png,\nimage/webp); animated GIF bases are advertised as `planned` via\nthe parallel `image_gif` mime_group \u2014 schema is contract-defined,\ndispatch returns `feature_not_available` (422) until Lambda\nsupport ships. Per Tension 1 (ADR-0001) + plan v5 \u00a7F4 round 6.\n\n**Video bases are NOT supported by `image_watermark`.** Use the\ndedicated `video_watermark` operation\n(`schemas/operations/video_watermark.yaml`) which routes through\nFFmpeg overlay + re-encode. Per ADR-0013.\n\n**Audio is explicitly NOT supported.** For audio overlay (DJ tags,\npodcast intros, jingles), use the `audio_overlay` operation\n(declared in schemas/operations/audio_overlay.yaml at\n`availability: planned`).\n\nSource capped at 25 megapixels for image bases (V1 watermark\nprecedent retained); per-frame caps for animated GIF bases will be\ndefined when the corresponding Lambda support ships.\nPer ADR-0004 \u00a7\"V2 JobDefinition\" + plan v5 \u00a7F1.\n",
1494
1557
  "features": {
1495
1558
  "multi_overlay_stack": {
1496
1559
  "availability": "planned",
@@ -1509,7 +1572,7 @@
1509
1572
  "options": {
1510
1573
  "anchor": {
1511
1574
  "default": "bottom_right",
1512
- "description": "9-grid anchor position on the base image. Mirrors\nMux/Cloudinary positioning. Combined with margin_x and\nmargin_y for fine-grained offset from the anchor point.\n",
1575
+ "description": "9-grid anchor position on the base image. Combined with\nmargin_x and margin_y for fine-grained offset from the\nanchor point.\n",
1513
1576
  "type": "enum",
1514
1577
  "values": [
1515
1578
  "top_left",
@@ -1598,7 +1661,17 @@
1598
1661
  }
1599
1662
  }
1600
1663
  },
1601
- "min_inputs": 2
1664
+ "min_inputs": 2,
1665
+ "per_role_cardinality": {
1666
+ "base": {
1667
+ "max": 1,
1668
+ "min": 1
1669
+ },
1670
+ "overlay": {
1671
+ "max": 1,
1672
+ "min": 1
1673
+ }
1674
+ }
1602
1675
  },
1603
1676
  "merge": {
1604
1677
  "default": false,
@@ -1647,7 +1720,7 @@
1647
1720
  },
1648
1721
  "transition": {
1649
1722
  "default": "none",
1650
- "description": "Default transition between clips. Audio-only catalog\n(acrossfade-backed); see FORMAT.md \u00a7\"Audio vs visual\ntransition catalogs (merge)\" for additions policy. Future\nvalues (e.g. `fade_curve` variants) will be added with\n`per_value_availability` per ADR-0001 \u00a71.4.\n",
1723
+ "description": "Transition between audio clips. `none` joins them with a\nhard cut; `crossfade` blends one into the next.\n",
1651
1724
  "type": "enum",
1652
1725
  "values": [
1653
1726
  "none",
@@ -1678,6 +1751,16 @@
1678
1751
  "none",
1679
1752
  "crossfade"
1680
1753
  ]
1754
+ },
1755
+ "trim_end": {
1756
+ "description": "Trim from end in seconds (per-input). Applied to this input\nBEFORE any transition/crossfade. Matches the `compress` trim\nsemantic. No `max` \u2014 the upper bound is the input's own\nduration, enforced by the worker, not statically bounded\nhere.\n",
1757
+ "min": 0,
1758
+ "type": "float"
1759
+ },
1760
+ "trim_start": {
1761
+ "description": "Trim from beginning in seconds (per-input). Applied to this\ninput BEFORE any transition/crossfade. Matches the\n`compress` trim semantic. No `max` \u2014 the upper bound is the\ninput's own duration, enforced by the worker, not statically\nbounded here.\n",
1762
+ "min": 0,
1763
+ "type": "float"
1681
1764
  }
1682
1765
  }
1683
1766
  },
@@ -1745,7 +1828,7 @@
1745
1828
  "depends_on": {
1746
1829
  "output_type": "video"
1747
1830
  },
1748
- "description": "Transition effect between images in the slideshow output.\nCatalog from FFmpeg 7.1.1 xfade filter (per ADR-0007). See\nper_value_availability for per-value rollout state. The\n`none` value is a sentinel (\"no transition / hard cut\"),\nnot an FFmpeg preset.\n",
1831
+ "description": "Transition effect between images in the slideshow output.\n`none` means a hard cut with no transition. Some effects\nare still rolling out \u2014 check their availability.\n",
1749
1832
  "per_value_availability": {
1750
1833
  "circleclose": {
1751
1834
  "availability": "beta"
@@ -1896,7 +1979,8 @@
1896
1979
  "video": {
1897
1980
  "mimes": [
1898
1981
  "video/mp4",
1899
- "video/webm"
1982
+ "video/webm",
1983
+ "video/quicktime"
1900
1984
  ],
1901
1985
  "options": {
1902
1986
  "codec": {
@@ -1953,7 +2037,7 @@
1953
2037
  "always"
1954
2038
  ]
1955
2039
  },
1956
- "description": "CRF (quality-targeted) vs target_size (two-pass to fixed file size).\n`target_size` is currently `codec=h264` only \u2014 libx265 / libvpx-vp9 / libsvtav1 each\nrequire a different two-pass invocation and are tracked as separate per-codec\nLambda follow-ups. The `per_value_depends_on` block above gates\n`encoding_mode=target_size` itself on `codec \u2208 [h264]`, so a request with\n`encoding_mode=target_size + codec \u2208 {h265, vp9, av1}` is rejected as\n`invalid_options` regardless of whether `target_size_bytes` is supplied \u2014\nclosing the gap left by the previous option-level `depends_on` (which only\ntriggered when `target_size_bytes` was present in the payload). Per ticket\n[`bsV3FWM5`](https://trello.com/c/bsV3FWM5).\n",
2040
+ "description": "CRF aims for a quality level and lets the file size vary;\ntarget_size aims for a fixed output file size. `target_size`\ncurrently works with `codec=h264` only \u2014 a request pairing it\nwith another codec is rejected as `invalid_options`.\n",
1957
2041
  "per_value_depends_on": {
1958
2042
  "target_size": {
1959
2043
  "codec": [
@@ -2031,13 +2115,13 @@
2031
2115
  "always"
2032
2116
  ]
2033
2117
  },
2034
- "description": "Two-pass target file size in bytes (minimum 1 MiB). Required when\n`encoding_mode=target_size`. h264-only \u2014 the codec gate now lives on\n`encoding_mode.per_value_depends_on.target_size.codec` (per ticket\n[`bsV3FWM5`](https://trello.com/c/bsV3FWM5)); this option's own\n`depends_on` no longer duplicates it.\n\nPractical floor: a ~100 kbps post-AAC video bitrate (i.e. `target_size_bytes`\ncorresponding to less than ~100 kbps of video after subtracting the 160 kbps\nAAC audio track over the merged duration) is silently floored by libx264 and\nthe resulting file will not honour the requested `target_size_bytes`.\nPublishers targeting very small outputs should size accordingly.\n",
2118
+ "description": "Target file size in bytes (minimum 1 MiB). Required when\n`encoding_mode=target_size`, which is h264-only.\n\nPractical floor: if the target works out to less than\n~100 kbps of video (after subtracting the ~160 kbps AAC audio\ntrack over the merged duration), the encoder floors it and the\nresulting file will not honour the requested `target_size_bytes`.\nPublishers targeting very small outputs should size accordingly.\n",
2035
2119
  "min": 1048576,
2036
2120
  "type": "integer"
2037
2121
  },
2038
2122
  "transition": {
2039
2123
  "default": "none",
2040
- "description": "Default transition between clips. Catalog from FFmpeg 7.1.1\nxfade filter (per ADR-0007). See per_value_availability for\nper-value rollout state.\n",
2124
+ "description": "Default transition between clips. Some effects are still\nrolling out \u2014 check their availability.\n",
2041
2125
  "per_value_availability": {
2042
2126
  "circleclose": {
2043
2127
  "availability": "beta"
@@ -2296,6 +2380,16 @@
2296
2380
  "wipetr",
2297
2381
  "wipebl"
2298
2382
  ]
2383
+ },
2384
+ "trim_end": {
2385
+ "description": "Trim from end in seconds (per-input). Applied to this input\nBEFORE any transition/crossfade. Matches the `compress` trim\nsemantic. No `max` \u2014 the upper bound is the input's own\nduration, enforced by the worker, not statically bounded\nhere.\n",
2386
+ "min": 0,
2387
+ "type": "float"
2388
+ },
2389
+ "trim_start": {
2390
+ "description": "Trim from beginning in seconds (per-input). Applied to this\ninput BEFORE any transition/crossfade. Matches the\n`compress` trim semantic. No `max` \u2014 the upper bound is the\ninput's own duration, enforced by the worker, not statically\nbounded here.\n",
2391
+ "min": 0,
2392
+ "type": "float"
2299
2393
  }
2300
2394
  },
2301
2395
  "processing_class": {
@@ -2324,14 +2418,108 @@
2324
2418
  },
2325
2419
  "min_inputs": 2
2326
2420
  },
2421
+ "passthrough": {
2422
+ "availability": "beta",
2423
+ "default": false,
2424
+ "description": "Inert lossless source operation. A single-input source job whose\nSOLE operation is `passthrough` emits its source bytes UNCHANGED \u2014\nno compression, no transformation, no Lambda dispatch. The API\nself-completes the job at workflow-create/publish time: the job's\nterminal output IS the upload's `{bucket, key}` unchanged.\n\n**Purpose.** Lets an uploaded file enter a multi-input operation\n(`merge` / `archive` / `image_watermark` / etc.) LOSSLESSLY. Since\nV2 narrows `JobInputV2.source` to exclude upload-direct (`MultiInputSource`\n\u2014 job_output / external_import / connection only), an upload that\nmust feed a multi-input op enters via a `passthrough` source job\nreferenced downstream by `{ type: job_output, from: <id> }`. This\npreserves billing / DAG / lineage that direct upload-in-inputs[]\nwould bypass.\n\n**Distinct from `operations: []`.** An empty `operations[]` on a\nsingle-input upload job KEEPS its implicit-compress meaning (see\n`POST /api/workflows` description). `passthrough` is the EXPLICIT\nlossless opt-out chosen via the existing rule \"non-empty\n`operations[]` without `compress` = compression opt-out\" \u2014 it is a\nsole, named operation, not an empty chain.\n\n**Never published to SNS.** Because the API self-completes the job\nat publish, `passthrough` is INTENTIONALLY absent from the AsyncAPI\nrouting enums (`OperationType`, `OperationRequestAttributes.operation_type`)\nand has no `ops-passthrough` queue. It never appears on the wire as\na request message.\n\nMedia-agnostic (no `mime_groups`): it accepts any uploaded MIME and\ncopies it verbatim, so there are no per-MIME options or constraints.\n`availability: beta` \u2014 the API self-completion path is LIVE (the\ninputs[]-narrowing + passthrough self-complete mechanism is deployed),\nso workflow-create accepts `passthrough` source jobs and MUST NOT\nreturn `feature_not_available`. Activated per ticket\n[`4som89Uh`](https://trello.com/c/4som89Uh) + ADR-0004 (planned\u2192beta\nflip; self-complete code deployed API-side).\n",
2425
+ "input_model": "single"
2426
+ },
2427
+ "render_variants": {
2428
+ "availability": "planned",
2429
+ "description": "Generate multiple resized / re-encoded image variants from a single source image in one operation (image fan-out).",
2430
+ "input_model": "single",
2431
+ "mime_groups": {
2432
+ "image": {
2433
+ "availability": "planned",
2434
+ "mimes": [
2435
+ "image/jpeg",
2436
+ "image/png",
2437
+ "image/webp"
2438
+ ],
2439
+ "options": {
2440
+ "targets": {
2441
+ "description": "One output variant per entry (max 20). Each variant is resized /\nre-encoded independently from the single decoded source; the\noperation succeeds or fails **atomically** \u2014 there are no partial\noutputs. Each result output echoes its target's `id` back as\n`target_id` so callers can map outputs to the variants they asked\nfor.\n\nDimensions: `fit: max` needs at least one of `width` / `height`\n(aspect preserved, output may be smaller than the box). `fit: crop`\nand `fit: scale` require BOTH `width` and `height` (they produce an\nexact-size output). A target whose dimensions exceed the source is\nrejected (`invalid_options`) unless `allow_upscale: true`.\n",
2442
+ "items": {
2443
+ "properties": {
2444
+ "allow_upscale": {
2445
+ "default": false,
2446
+ "description": "When false (default), a target whose dimensions exceed the source is rejected (`invalid_options`). Set true to permit upscaling. fit max never upscales.",
2447
+ "type": "boolean"
2448
+ },
2449
+ "background": {
2450
+ "default": "#FFFFFF",
2451
+ "description": "Background colour (hex #RRGGBB), applied only when flattening a transparent source into an opaque format (e.g. a PNG with alpha rendered to JPEG). Ignored otherwise.",
2452
+ "pattern": "^#[0-9A-Fa-f]{6}$",
2453
+ "type": "string"
2454
+ },
2455
+ "fit": {
2456
+ "default": "max",
2457
+ "description": "Resize mode. max = fit within the box, aspect preserved\n(output may be smaller); needs at least one dimension.\ncrop = fill and trim to exact width x height. scale = force\nexact width x height. crop and scale require both dimensions.\n",
2458
+ "enum": [
2459
+ "max",
2460
+ "crop",
2461
+ "scale"
2462
+ ],
2463
+ "type": "string"
2464
+ },
2465
+ "height": {
2466
+ "description": "Target height in pixels. Required together with width for fit crop/scale; for fit max, at least one of width/height is required.",
2467
+ "maximum": 16384,
2468
+ "minimum": 1,
2469
+ "type": "integer"
2470
+ },
2471
+ "id": {
2472
+ "description": "Caller-assigned identifier, unique within the array\n(duplicate ids are rejected as `invalid_options`). Echoed\nverbatim as `target_id` on the matching result output \u2014 the\naddressing contract.\n",
2473
+ "maxLength": 64,
2474
+ "pattern": "^[A-Za-z0-9._-]+$",
2475
+ "type": "string"
2476
+ },
2477
+ "output_format": {
2478
+ "description": "Output format for this variant. When omitted, the source format is preserved.",
2479
+ "enum": [
2480
+ "jpeg",
2481
+ "png",
2482
+ "webp",
2483
+ "avif"
2484
+ ],
2485
+ "type": "string"
2486
+ },
2487
+ "quality": {
2488
+ "default": 85,
2489
+ "description": "Encode quality (lossy formats only \u2014 jpeg / webp / avif). Accepted but ignored for png (lossless).",
2490
+ "maximum": 100,
2491
+ "minimum": 1,
2492
+ "type": "integer"
2493
+ },
2494
+ "width": {
2495
+ "description": "Target width in pixels. Required together with height for fit crop/scale; for fit max, at least one of width/height is required.",
2496
+ "maximum": 16384,
2497
+ "minimum": 1,
2498
+ "type": "integer"
2499
+ }
2500
+ },
2501
+ "required": [
2502
+ "id"
2503
+ ],
2504
+ "type": "object"
2505
+ },
2506
+ "maxItems": 20,
2507
+ "minItems": 1,
2508
+ "required": true,
2509
+ "type": "array"
2510
+ }
2511
+ }
2512
+ }
2513
+ }
2514
+ },
2327
2515
  "split": {
2328
2516
  "availability": "beta",
2329
2517
  "default": false,
2330
- "description": "Fan one input file into N outputs across GIF, PDF, audio, and\nvideo MIME families. Single-input \u2014 one input file per job, fanned\ninto N outputs per the per-mime-group catalog. Mirrors the\n`merge` / `convert` catalog-split-by-mime-group pattern.\n\n**Three modes** (audio + video; the mode discriminator gates which\nof the three options applies per the `depends_on` rules in this\nschema):\n- `interval`: split every N numeric-seconds.\n- `count`: split into N equal-duration pieces (integer 2..=200).\n- `cut_points`: explicit cut points in numeric-seconds (strictly\n increasing, no duplicates, each > 0 and < probed duration).\n\n**GIF + PDF use range-based selection** instead of three modes:\n- GIF (`image_gif`): `frame_range` REQUIRED + `output_format`\n enum {png,webp,jpg}.\n- PDF (`document_pdf`): `page_range` OR `page_groups` (mutually\n exclusive per `depends_on`).\n\n**Wire format**: numeric seconds (floats allowed for sub-second\nprecision). NOT ISO 8601 duration strings. Matches FFmpeg /\nCloudinary / Shotstack / AWS MediaConvert conventions.\n\n**200-output hard cap** per ADR-0009 \u00a7D5\n(`OperationResult.outputs[].maxItems: 200`). Preflight rejects\nrequests exceeding this BEFORE work as `invalid_options` (422).\nCap math by mode:\n- `interval`: `ceil(probed_duration / interval) <= 200`\n- `count`: enforced by the option's `min: 2 max: 200` range\n- `cut_points`: `cut_points.len() + 1 <= 200`\n- PDF: resolved page count after expansion `<= 200`\n (cross-ref [`WgCqnMRa`](https://trello.com/c/WgCqnMRa))\n- GIF: resolved frame count after expansion `<= 200`\n\n**Output naming**: 3-digit zero-padded \u2014 `output-001` ..\n`output-200`. Matches the convert PDF\u2192N precedent.\n\n**Output envelope binding** (per ADR-0014 + ADR-0009 \u00a7D2):\n- `image_gif`: `PositionIndexed` (frame stream-position 0-based\n ordinal)\n- `document_pdf`: `PageIndexed` (1-based gapless page index)\n- `audio`: `PositionIndexed` (cut stream-position ordinal)\n- `video`: `PositionIndexed` (cut stream-position ordinal)\n\n**`precision` flag** (audio + video only): `fast` (default) =\npacket-boundary approximate cuts; `exact` = re-encode-aligned\nprecise cuts. Mime_group scoping is the gate \u2014 precision does\nNOT apply to GIF or PDF (frame extraction is exact and PDF page\nselection is exact by definition).\n\n**Long-form video** routes to a separate `split-video-fargate`\nLambda (same `split` OperationType, different worker; routing\nvia `processing_class`). No schema-side discriminator beyond MIME\ndetection + `processing_class`.\n\n`availability: beta` for the `audio` mime_group (worker live on\nstaging per lambdas #161 \u2014 shape-stable + opt-in, MUST NOT 422).\nThe `image_gif`, `document_pdf`, and `video` mime_groups stay\n`availability: planned` until their cross-repo Lambda workers ship\n([`vKI0CFDu`](https://trello.com/c/vKI0CFDu) + lambdas L1); dispatch\nreturns `feature_not_available` (422) for those groups until then.\n\nPer ADR-0014.\n",
2518
+ "description": "Fan one input file into N outputs across GIF, PDF, audio, and\nvideo MIME families. Single-input \u2014 one input file per job, fanned\ninto N outputs per the per-mime-group catalog. Mirrors the\n`merge` / `convert` catalog-split-by-mime-group pattern.\n\n**Three shared modes** (audio + video; the mode discriminator\ngates which option applies per the `depends_on` rules in this\nschema):\n- `interval`: split every N numeric-seconds.\n- `count`: split into N equal-duration pieces (integer 2..=200).\n- `cut_points`: explicit cut points in numeric-seconds (strictly\n increasing, no duplicates, each > 0 and < probed duration).\n\n**Plus an audio-only `silence` mode** (`beta`, gated by the\n`silence_mode_audio` feature): cut at detected silence gaps via\nthe worker's ffmpeg `silencedetect` filter. Video stays\nthree-mode.\n\n**GIF + PDF use range-based selection** instead of three modes:\n- GIF (`image_gif`): `frame_range` REQUIRED + `output_format`\n enum {png,webp,jpg}.\n- PDF (`document_pdf`): `page_range` OR `page_groups` (mutually\n exclusive per `depends_on`).\n\n**Wire format**: numeric seconds (floats allowed for sub-second\nprecision). NOT ISO 8601 duration strings. Matches FFmpeg /\nCloudinary / Shotstack / AWS MediaConvert conventions.\n\n**200-output hard cap** per ADR-0009 \u00a7D5\n(`OperationResult.outputs[].maxItems: 200`). Preflight rejects\nrequests exceeding this BEFORE work as `invalid_options` (422).\nCap math by mode:\n- `interval`: `ceil(probed_duration / interval) <= 200`\n- `count`: enforced by the option's `min: 2 max: 200` range\n- `cut_points`: `cut_points.len() + 1 <= 200`\n- `silence` (audio): resolved segment count (detected gaps + 1)\n `<= 200`; preflight rejects as `invalid_options` (422)\n- PDF: resolved page count after expansion `<= 200`\n (cross-ref [`WgCqnMRa`](https://trello.com/c/WgCqnMRa))\n- GIF: resolved frame count after expansion `<= 200`\n\n**Output naming**: 3-digit zero-padded \u2014 `output-001` ..\n`output-200`. Matches the convert PDF\u2192N precedent.\n\n**Output envelope binding** (per ADR-0014 + ADR-0009 \u00a7D2):\n- `image_gif`: `PositionIndexed` (frame stream-position 0-based\n ordinal)\n- `document_pdf`: `PageIndexed` (1-based gapless page index)\n- `audio`: `PositionIndexed` (cut stream-position ordinal)\n- `video`: `PositionIndexed` (cut stream-position ordinal)\n\n**`precision` flag** (audio + video only): `fast` (default) =\npacket-boundary approximate cuts; `exact` = re-encode-aligned\nprecise cuts. Mime_group scoping is the gate \u2014 precision does\nNOT apply to GIF or PDF (frame extraction is exact and PDF page\nselection is exact by definition).\n\n**Long-form video** routes to a separate `split-video-fargate`\nLambda (same `split` OperationType, different worker; routing\nvia `processing_class`). No schema-side discriminator beyond MIME\ndetection + `processing_class`.\n\n`availability: beta` for the `audio` and `video` mime_groups\n(workers live on staging \u2014 shape-stable + opt-in, MUST NOT 422).\nVideo activates **short-form only**: `video.processing_class.short_form`\nis `beta`; `long_form` (the `split-video-fargate` worker) stays\n`availability: planned` until that worker ships. The `image_gif` and\n`document_pdf` mime_groups also stay `availability: planned` until their\ncross-repo Lambda workers ship ([`vKI0CFDu`](https://trello.com/c/vKI0CFDu)\n+ lambdas L1); dispatch returns `feature_not_available` (422) for the\nstill-planned groups/classes until then.\n\nPer ADR-0014.\n",
2331
2519
  "features": {
2332
2520
  "silence_mode_audio": {
2333
- "availability": "planned",
2334
- "description": "Silence-detect cut mode for audio (`mode: silence` \u2014\nCinavia/Resemble territory, server-side silence detection).\nOUT of V1 (Lambda support not yet shipped); declared as a\nfuture-work feature here so SDK consumers see the gate.\nPicked up as a separate post-launch ticket.\n"
2521
+ "availability": "beta",
2522
+ "description": "Silence-detect cut mode for audio (`mode: silence` \u2014\nserver-side silence detection in the audio split worker).\n`beta`: shape-stable + opt-in. The worker is built; the mode\nships dark until the API regenerates enum validation to accept\n`mode: silence`. The `silence` enum value carries a matching\n`per_value_availability: beta` on `audio.mode`.\n"
2335
2523
  }
2336
2524
  },
2337
2525
  "input_model": "single",
@@ -2383,22 +2571,57 @@
2383
2571
  },
2384
2572
  "mode": {
2385
2573
  "default": "interval",
2386
- "description": "Split strategy:\n- `interval`: cut every `interval` seconds.\n- `count`: cut into `count` equal-duration pieces.\n- `cut_points`: cut at explicit timestamps.\n",
2574
+ "description": "Split strategy:\n- `interval`: cut every `interval` seconds.\n- `count`: cut into `count` equal-duration pieces.\n- `cut_points`: cut at explicit timestamps.\n- `silence`: cut at detected silence gaps (audio-only,\n `beta` via the `silence_mode_audio` feature gate).\n",
2575
+ "per_value_availability": {
2576
+ "silence": {
2577
+ "availability": "beta"
2578
+ }
2579
+ },
2387
2580
  "type": "enum",
2388
2581
  "values": [
2389
2582
  "interval",
2390
2583
  "count",
2391
- "cut_points"
2584
+ "cut_points",
2585
+ "silence"
2392
2586
  ]
2393
2587
  },
2394
2588
  "precision": {
2395
2589
  "default": "fast",
2396
- "description": "Cut precision. Under `fast`, audio cuts are\npacket-boundary approximate (drift bounded by codec\npacket size \u2014 typically <= 23ms for AAC, <= 26ms for\nMP3). Under `exact`, the Lambda re-encodes to align cuts\nprecisely at the requested timestamps (slower, larger\noutput, but sample-accurate). Avoid \"keyframe\" language\n\u2014 that's video-only; audio drift is packet-boundary.\n",
2590
+ "description": "Cut precision. Under `fast`, audio cuts are\npacket-boundary approximate (drift bounded by codec\npacket size \u2014 typically <= 23ms for AAC, <= 26ms for\nMP3). Under `exact`, the Lambda re-encodes to align cuts\nprecisely at the requested timestamps (slower, larger\noutput, but sample-accurate).\n",
2397
2591
  "type": "enum",
2398
2592
  "values": [
2399
2593
  "fast",
2400
2594
  "exact"
2401
2595
  ]
2596
+ },
2597
+ "silence_handling": {
2598
+ "default": "keep_at_end",
2599
+ "depends_on": {
2600
+ "mode": "silence"
2601
+ },
2602
+ "description": "How detected silence is handled at segment boundaries.\n`keep_at_end`: trailing silence stays appended to the\npreceding segment (no separate silence-only outputs).\nOnly valid when `mode: silence`.\n",
2603
+ "type": "enum",
2604
+ "values": [
2605
+ "keep_at_end"
2606
+ ]
2607
+ },
2608
+ "silence_min_duration": {
2609
+ "default": 0.75,
2610
+ "depends_on": {
2611
+ "mode": "silence"
2612
+ },
2613
+ "description": "Minimum duration of a silence gap, in numeric seconds\n(sub-second allowed), before it is treated as a cut point.\n`min: 0.001` is the strict-positive sub-second idiom\n(cf. `interval`). Only valid when `mode: silence`.\n",
2614
+ "min": 0.001,
2615
+ "type": "float"
2616
+ },
2617
+ "silence_threshold_db": {
2618
+ "default": -50.0,
2619
+ "depends_on": {
2620
+ "mode": "silence"
2621
+ },
2622
+ "description": "Noise floor below which audio counts as silence, in dBFS\n(negative; 0.0 = full scale). Strictly negative in\npractice; `max: 0.0` is the declarative ceiling (a 0 dB\n\"silence\" floor is degenerate, like the strict bounds\ndocumented in prose for `cut_points`). Only valid when\n`mode: silence`.\n",
2623
+ "max": 0.0,
2624
+ "type": "float"
2402
2625
  }
2403
2626
  }
2404
2627
  },
@@ -2463,10 +2686,11 @@
2463
2686
  }
2464
2687
  },
2465
2688
  "video": {
2466
- "availability": "planned",
2689
+ "availability": "beta",
2467
2690
  "mimes": [
2468
2691
  "video/mp4",
2469
- "video/webm"
2692
+ "video/webm",
2693
+ "video/quicktime"
2470
2694
  ],
2471
2695
  "options": {
2472
2696
  "count": {
@@ -2540,7 +2764,7 @@
2540
2764
  "required_tier": "pro"
2541
2765
  },
2542
2766
  "short_form": {
2543
- "availability": "planned",
2767
+ "availability": "beta",
2544
2768
  "constraints": {
2545
2769
  "max_input_duration": "PT5M",
2546
2770
  "max_input_size_bytes": 524288000,
@@ -2621,13 +2845,13 @@
2621
2845
  },
2622
2846
  "rotation": {
2623
2847
  "default": -45.0,
2624
- "description": "Rotation angle in degrees. Default -45\u00b0 suits tiled mode\n(angled diagonal pattern). Clamped to range. Tiled canvas is\ncapped at 25 megapixels pre-rotation with 5000 px maximum\nside length.\n",
2848
+ "description": "Rotation angle in degrees. Default -45\u00b0 suits tiled mode\n(angled diagonal pattern). Clamped to range.\n",
2625
2849
  "max": 360.0,
2626
2850
  "min": -360.0,
2627
2851
  "type": "float"
2628
2852
  },
2629
2853
  "text": {
2630
- "description": "Watermark text. Must be non-empty. Rendered with bundled\nLiberation Sans (SIL OFL). A single text overlay is capped\nat 4 megapixels before rendering fails.\n",
2854
+ "description": "Watermark text. Must be non-empty.\n",
2631
2855
  "required": true,
2632
2856
  "type": "string"
2633
2857
  },
@@ -2776,7 +3000,7 @@
2776
3000
  "mimes": [
2777
3001
  "video/mp4",
2778
3002
  "video/webm",
2779
- "video/ogg"
3003
+ "video/quicktime"
2780
3004
  ],
2781
3005
  "options": {
2782
3006
  "fit": {
@@ -2920,7 +3144,7 @@
2920
3144
  "type": "float"
2921
3145
  },
2922
3146
  "text": {
2923
- "description": "Watermark text. Must be non-empty. Rendered with bundled\nLiberation Sans (SIL OFL).\n",
3147
+ "description": "Watermark text. Must be non-empty.\n",
2924
3148
  "required": true,
2925
3149
  "type": "string"
2926
3150
  },
@@ -2974,7 +3198,7 @@
2974
3198
  "video_watermark": {
2975
3199
  "availability": "beta",
2976
3200
  "default": false,
2977
- "description": "Apply an image overlay (file or external source) onto a base video\nasset using FFmpeg's `overlay` filter. Multi-input role-based:\nexactly one input with `role: base` (the source video) + exactly\none with `role: overlay` (the watermark image). The overlay can be\nan upload, an external_import handle, or a vault connection per\n`WorkflowSource`.\n\n**Dedicated operation, not an extension of `image_watermark`.**\n`image_watermark` is pure-Rust/no-FFmpeg and handles\nimage-on-image overlay only. `video_watermark` requires FFmpeg's\noverlay filter + re-encode + a different deploy unit (no\nstream-copy escape \u2014 overlay = pixel modification). Per ADR-0013.\n\n**Audio passthrough.** The base video's audio stream is preserved\nunchanged via FFmpeg stream-copy \u2014 the watermark applies to the\nvisual track only.\n\nActivated to `availability: beta` (Wave A, ticket\n[`c3uthIP4`](https://trello.com/c/c3uthIP4)): the cross-repo Lambda\nbackend is live (API accepts + publishes via the operations SNS\ntopic), so the operation and its `short_form` processing class are\nshape-stable + opt-in and MUST NOT return `feature_not_available`.\n`long_form` stays `planned` (no live Fargate worker yet \u2014 its\nlong-form path is not provisioned) and the `multi_overlay_stack`\nfeature stays `planned` (Lambda support unconfirmed); requesting\nthose planned sub-features DOES still return `feature_not_available`\nuntil they are separately activated. Per ADR-0013 + lambdas\npre-launch epic Wave A (ticket\n[`SlluxMBN`'s sibling `4NrRPCgh`](https://trello.com/c/4NrRPCgh)).\n",
3201
+ "description": "Apply an image overlay onto a base video\nasset using FFmpeg's `overlay` filter. Multi-input role-based:\nexactly one input with `role: base` (the source video) + exactly\none with `role: overlay` (the watermark image). Each input is a\n`MultiInputSource` \u2014 an external_import handle, a vault connection,\nor an upstream `job_output` (uploads are NOT referenced directly\ninside inputs[]). To use an uploaded base or overlay, feed it through\na `passthrough` source job and reference it via `{ type: job_output,\nfrom: <id> }` (per ticket 4som89Uh).\n\n**Dedicated operation, not an extension of `image_watermark`.**\n`image_watermark` is pure-Rust/no-FFmpeg and handles\nimage-on-image overlay only. `video_watermark` requires FFmpeg's\noverlay filter + re-encode + a different deploy unit (no\nstream-copy escape \u2014 overlay = pixel modification). Per ADR-0013.\n\n**Audio passthrough.** The base video's audio stream is preserved\nunchanged via FFmpeg stream-copy \u2014 the watermark applies to the\nvisual track only.\n\nActivated to `availability: beta` (Wave A, ticket\n[`c3uthIP4`](https://trello.com/c/c3uthIP4)): the cross-repo Lambda\nbackend is live (API accepts + publishes via the operations SNS\ntopic), so the operation and its `short_form` processing class are\nshape-stable + opt-in and MUST NOT return `feature_not_available`.\n`long_form` stays `planned` (no live Fargate worker yet \u2014 its\nlong-form path is not provisioned) and the `multi_overlay_stack`\nfeature stays `planned` (Lambda support unconfirmed); requesting\nthose planned sub-features DOES still return `feature_not_available`\nuntil they are separately activated. Per ADR-0013 + lambdas\npre-launch epic Wave A (ticket\n[`SlluxMBN`'s sibling `4NrRPCgh`](https://trello.com/c/4NrRPCgh)).\n",
2978
3202
  "features": {
2979
3203
  "multi_overlay_stack": {
2980
3204
  "availability": "planned",
@@ -3071,7 +3295,7 @@
3071
3295
  }
3072
3296
  }
3073
3297
  },
3074
- "schema_version": "2.31.0",
3298
+ "schema_version": "2.64.0",
3075
3299
  "source_commit": null,
3076
3300
  "user_tier": null,
3077
3301
  "workflow_features": {
@@ -3093,10 +3317,10 @@
3093
3317
  "type": {
3094
3318
  "per_value_availability": {
3095
3319
  "all_outputs": {
3096
- "availability": "planned"
3320
+ "availability": "stable"
3097
3321
  },
3098
3322
  "explicit": {
3099
- "availability": "planned"
3323
+ "availability": "stable"
3100
3324
  },
3101
3325
  "terminal": {
3102
3326
  "availability": "stable"