@giveitsmaller/contracts 0.63.0 → 0.67.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 (517) hide show
  1. package/README.md +2 -2
  2. package/accepted-options/accepted-options.json +1 -1
  3. package/accepted-options/image-output-routes.json +1 -1
  4. package/asyncapi/events.yaml +179 -7
  5. package/availability/availability.json +20 -3
  6. package/code-builder/code-builder-metadata.json +2 -2
  7. package/dist/openapi/models/AccountLimitEntry.d.ts +1 -1
  8. package/dist/openapi/models/AccountLimitEntry.js +1 -1
  9. package/dist/openapi/models/AccountLimits.d.ts +15 -7
  10. package/dist/openapi/models/AccountLimits.js +1 -1
  11. package/dist/openapi/models/AccountLimitsLimits.d.ts +1 -1
  12. package/dist/openapi/models/AccountLimitsLimits.js +1 -1
  13. package/dist/openapi/models/AccountLimitsSuccessEnvelope.d.ts +1 -1
  14. package/dist/openapi/models/AccountLimitsSuccessEnvelope.js +1 -1
  15. package/dist/openapi/models/AudioWatermarkDecodeRequest.d.ts +1 -1
  16. package/dist/openapi/models/AudioWatermarkDecodeRequest.js +1 -1
  17. package/dist/openapi/models/AudioWatermarkDecodeResponse.d.ts +1 -1
  18. package/dist/openapi/models/AudioWatermarkDecodeResponse.js +1 -1
  19. package/dist/openapi/models/AuthErrorResponse.d.ts +1 -1
  20. package/dist/openapi/models/AuthErrorResponse.js +1 -1
  21. package/dist/openapi/models/AuthErrorType.d.ts +1 -1
  22. package/dist/openapi/models/AuthErrorType.js +1 -1
  23. package/dist/openapi/models/AuthRejectionEnvelope.d.ts +1 -1
  24. package/dist/openapi/models/AuthRejectionEnvelope.js +1 -1
  25. package/dist/openapi/models/AvailabilityValue.d.ts +1 -1
  26. package/dist/openapi/models/AvailabilityValue.js +1 -1
  27. package/dist/openapi/models/BalanceExhaustedResponse.d.ts +1 -1
  28. package/dist/openapi/models/BalanceExhaustedResponse.js +1 -1
  29. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.d.ts +1 -1
  30. package/dist/openapi/models/BalanceExhaustedResponseAllOfLinks.js +1 -1
  31. package/dist/openapi/models/BillingCheckoutRequest.d.ts +12 -1
  32. package/dist/openapi/models/BillingCheckoutRequest.js +1 -1
  33. package/dist/openapi/models/BillingCheckoutSession.d.ts +1 -1
  34. package/dist/openapi/models/BillingCheckoutSession.js +1 -1
  35. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.d.ts +1 -1
  36. package/dist/openapi/models/BillingCheckoutSuccessEnvelope.js +1 -1
  37. package/dist/openapi/models/CallbackEventType.d.ts +1 -1
  38. package/dist/openapi/models/CallbackEventType.js +1 -1
  39. package/dist/openapi/models/CancelAccountDeletion200Response.d.ts +1 -1
  40. package/dist/openapi/models/CancelAccountDeletion200Response.js +1 -1
  41. package/dist/openapi/models/CancelAccountDeletion200ResponseData.d.ts +1 -1
  42. package/dist/openapi/models/CancelAccountDeletion200ResponseData.js +1 -1
  43. package/dist/openapi/models/CapabilityCondition.d.ts +1 -1
  44. package/dist/openapi/models/CapabilityCondition.js +1 -1
  45. package/dist/openapi/models/CapabilityConditionOneOf.d.ts +1 -1
  46. package/dist/openapi/models/CapabilityConditionOneOf.js +1 -1
  47. package/dist/openapi/models/CapabilityConditionOneOf1.d.ts +1 -1
  48. package/dist/openapi/models/CapabilityConditionOneOf1.js +1 -1
  49. package/dist/openapi/models/CapabilityConditionOneOf2.d.ts +1 -1
  50. package/dist/openapi/models/CapabilityConditionOneOf2.js +1 -1
  51. package/dist/openapi/models/CapabilityConditionOneOf3.d.ts +1 -1
  52. package/dist/openapi/models/CapabilityConditionOneOf3.js +1 -1
  53. package/dist/openapi/models/CapabilityConditionOneOf4.d.ts +1 -1
  54. package/dist/openapi/models/CapabilityConditionOneOf4.js +1 -1
  55. package/dist/openapi/models/CapabilityConditionOneOf5.d.ts +1 -1
  56. package/dist/openapi/models/CapabilityConditionOneOf5.js +1 -1
  57. package/dist/openapi/models/CapabilityConditionOneOf6.d.ts +1 -1
  58. package/dist/openapi/models/CapabilityConditionOneOf6.js +1 -1
  59. package/dist/openapi/models/CapabilityConstraint.d.ts +1 -1
  60. package/dist/openapi/models/CapabilityConstraint.js +1 -1
  61. package/dist/openapi/models/CapabilityInputSpec.d.ts +1 -1
  62. package/dist/openapi/models/CapabilityInputSpec.js +1 -1
  63. package/dist/openapi/models/CapabilityProduces.d.ts +1 -1
  64. package/dist/openapi/models/CapabilityProduces.js +1 -1
  65. package/dist/openapi/models/CapabilityProducesOneOf.d.ts +1 -1
  66. package/dist/openapi/models/CapabilityProducesOneOf.js +1 -1
  67. package/dist/openapi/models/CapabilityProducesOneOf1.d.ts +1 -1
  68. package/dist/openapi/models/CapabilityProducesOneOf1.js +1 -1
  69. package/dist/openapi/models/CapabilityProducesOneOf2.d.ts +1 -1
  70. package/dist/openapi/models/CapabilityProducesOneOf2.js +1 -1
  71. package/dist/openapi/models/ChangePasswordRequest.d.ts +1 -1
  72. package/dist/openapi/models/ChangePasswordRequest.js +1 -1
  73. package/dist/openapi/models/CodegenSource.d.ts +1 -1
  74. package/dist/openapi/models/CodegenSource.js +1 -1
  75. package/dist/openapi/models/CodegenSourceInput.d.ts +1 -1
  76. package/dist/openapi/models/CodegenSourceInput.js +1 -1
  77. package/dist/openapi/models/CodegenSourceJob.d.ts +1 -1
  78. package/dist/openapi/models/CodegenSourceJob.js +1 -1
  79. package/dist/openapi/models/CodegenSourceJobSource.d.ts +1 -1
  80. package/dist/openapi/models/CodegenSourceJobSource.js +1 -1
  81. package/dist/openapi/models/CodegenSourceOperation.d.ts +1 -1
  82. package/dist/openapi/models/CodegenSourceOperation.js +1 -1
  83. package/dist/openapi/models/CodegenUploadPlaceholder.d.ts +1 -1
  84. package/dist/openapi/models/CodegenUploadPlaceholder.js +1 -1
  85. package/dist/openapi/models/CompositionPlan.d.ts +1 -1
  86. package/dist/openapi/models/CompositionPlan.js +1 -1
  87. package/dist/openapi/models/CompositionPlanJob.d.ts +1 -1
  88. package/dist/openapi/models/CompositionPlanJob.js +1 -1
  89. package/dist/openapi/models/CompositionPlanOperation.d.ts +1 -1
  90. package/dist/openapi/models/CompositionPlanOperation.js +1 -1
  91. package/dist/openapi/models/ConfirmEmailChange200Response.d.ts +1 -1
  92. package/dist/openapi/models/ConfirmEmailChange200Response.js +1 -1
  93. package/dist/openapi/models/ConfirmEmailChange200ResponseData.d.ts +1 -1
  94. package/dist/openapi/models/ConfirmEmailChange200ResponseData.js +1 -1
  95. package/dist/openapi/models/ConfirmEmailChangeRequest.d.ts +1 -1
  96. package/dist/openapi/models/ConfirmEmailChangeRequest.js +1 -1
  97. package/dist/openapi/models/ConnectionSource.d.ts +1 -1
  98. package/dist/openapi/models/ConnectionSource.js +1 -1
  99. package/dist/openapi/models/ContactRequest.d.ts +1 -1
  100. package/dist/openapi/models/ContactRequest.js +1 -1
  101. package/dist/openapi/models/ContactSubject.d.ts +1 -1
  102. package/dist/openapi/models/ContactSubject.js +1 -1
  103. package/dist/openapi/models/ContactValidationErrorResponse.d.ts +1 -1
  104. package/dist/openapi/models/ContactValidationErrorResponse.js +1 -1
  105. package/dist/openapi/models/CreateApiKey201Response.d.ts +1 -1
  106. package/dist/openapi/models/CreateApiKey201Response.js +1 -1
  107. package/dist/openapi/models/CreateApiKey201ResponseData.d.ts +1 -1
  108. package/dist/openapi/models/CreateApiKey201ResponseData.js +1 -1
  109. package/dist/openapi/models/CreateApiKeyRequest.d.ts +1 -1
  110. package/dist/openapi/models/CreateApiKeyRequest.js +1 -1
  111. package/dist/openapi/models/CreateBillingCheckoutSession422Response.d.ts +1 -1
  112. package/dist/openapi/models/CreateBillingCheckoutSession422Response.js +1 -1
  113. package/dist/openapi/models/CreateExternalImport403Response.d.ts +1 -1
  114. package/dist/openapi/models/CreateExternalImport403Response.js +1 -1
  115. package/dist/openapi/models/CreateExternalImport422Response.d.ts +1 -1
  116. package/dist/openapi/models/CreateExternalImport422Response.js +1 -1
  117. package/dist/openapi/models/CreateWorkflow401Response.d.ts +1 -1
  118. package/dist/openapi/models/CreateWorkflow401Response.js +1 -1
  119. package/dist/openapi/models/CreateWorkflow422Response.d.ts +1 -1
  120. package/dist/openapi/models/CreateWorkflow422Response.js +1 -1
  121. package/dist/openapi/models/CreditTransaction.d.ts +1 -1
  122. package/dist/openapi/models/CreditTransaction.js +1 -1
  123. package/dist/openapi/models/CreditTransactionSourceBucket.d.ts +1 -1
  124. package/dist/openapi/models/CreditTransactionSourceBucket.js +1 -1
  125. package/dist/openapi/models/CreditsBalanceResponse.d.ts +1 -1
  126. package/dist/openapi/models/CreditsBalanceResponse.js +1 -1
  127. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.d.ts +1 -1
  128. package/dist/openapi/models/CreditsBalanceSuccessEnvelope.js +1 -1
  129. package/dist/openapi/models/CreditsUsageResponse.d.ts +1 -1
  130. package/dist/openapi/models/CreditsUsageResponse.js +1 -1
  131. package/dist/openapi/models/CreditsUsageSuccessEnvelope.d.ts +1 -1
  132. package/dist/openapi/models/CreditsUsageSuccessEnvelope.js +1 -1
  133. package/dist/openapi/models/Delivery.d.ts +1 -1
  134. package/dist/openapi/models/Delivery.js +1 -1
  135. package/dist/openapi/models/DeliveryOutputRef.d.ts +1 -1
  136. package/dist/openapi/models/DeliveryOutputRef.js +1 -1
  137. package/dist/openapi/models/DeliveryPlan.d.ts +1 -1
  138. package/dist/openapi/models/DeliveryPlan.js +1 -1
  139. package/dist/openapi/models/DeliveryPlanOutput.d.ts +1 -1
  140. package/dist/openapi/models/DeliveryPlanOutput.js +1 -1
  141. package/dist/openapi/models/DeliveryPlanReason.d.ts +1 -1
  142. package/dist/openapi/models/DeliveryPlanReason.js +1 -1
  143. package/dist/openapi/models/DeliverySelection.d.ts +1 -1
  144. package/dist/openapi/models/DeliverySelection.js +1 -1
  145. package/dist/openapi/models/DownloadBundle.d.ts +1 -1
  146. package/dist/openapi/models/DownloadBundle.js +1 -1
  147. package/dist/openapi/models/DroppedOption.d.ts +1 -1
  148. package/dist/openapi/models/DroppedOption.js +1 -1
  149. package/dist/openapi/models/EmailNotify.d.ts +1 -1
  150. package/dist/openapi/models/EmailNotify.js +1 -1
  151. package/dist/openapi/models/EmptySuccessEnvelope.d.ts +1 -1
  152. package/dist/openapi/models/EmptySuccessEnvelope.js +1 -1
  153. package/dist/openapi/models/EndpointProjection.d.ts +44 -9
  154. package/dist/openapi/models/EndpointProjection.js +4 -1
  155. package/dist/openapi/models/{MediaCategory.js → EndpointProjectionServersInner.d.ts} +42 -34
  156. package/dist/openapi/models/{TierDefaultLimits.js → EndpointProjectionServersInner.js} +17 -15
  157. package/dist/openapi/models/ErrorEnvelope.d.ts +1 -1
  158. package/dist/openapi/models/ErrorEnvelope.js +1 -1
  159. package/dist/openapi/models/EstimateQuality.d.ts +1 -1
  160. package/dist/openapi/models/EstimateQuality.js +1 -1
  161. package/dist/openapi/models/EstimateRange.d.ts +1 -1
  162. package/dist/openapi/models/EstimateRange.js +1 -1
  163. package/dist/openapi/models/ExportAccountData200Response.d.ts +1 -1
  164. package/dist/openapi/models/ExportAccountData200Response.js +1 -1
  165. package/dist/openapi/models/ExportAccountData200ResponseData.d.ts +1 -1
  166. package/dist/openapi/models/ExportAccountData200ResponseData.js +1 -1
  167. package/dist/openapi/models/ExternalDestination.d.ts +1 -1
  168. package/dist/openapi/models/ExternalDestination.js +1 -1
  169. package/dist/openapi/models/ExternalImportCreatedResponse.d.ts +1 -1
  170. package/dist/openapi/models/ExternalImportCreatedResponse.js +1 -1
  171. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.d.ts +1 -1
  172. package/dist/openapi/models/ExternalImportCreatedSuccessEnvelope.js +1 -1
  173. package/dist/openapi/models/ExternalImportRequest.d.ts +1 -1
  174. package/dist/openapi/models/ExternalImportRequest.js +1 -1
  175. package/dist/openapi/models/ExternalImportToken.d.ts +1 -1
  176. package/dist/openapi/models/ExternalImportToken.js +1 -1
  177. package/dist/openapi/models/ExternalSource.d.ts +1 -1
  178. package/dist/openapi/models/ExternalSource.js +1 -1
  179. package/dist/openapi/models/FeatureNotAvailableResponse.d.ts +1 -1
  180. package/dist/openapi/models/FeatureNotAvailableResponse.js +1 -1
  181. package/dist/openapi/models/FeatureTierRestrictedResponse.d.ts +1 -1
  182. package/dist/openapi/models/FeatureTierRestrictedResponse.js +1 -1
  183. package/dist/openapi/models/FeatureViolation.d.ts +1 -1
  184. package/dist/openapi/models/FeatureViolation.js +1 -1
  185. package/dist/openapi/models/ImageEncodeCapabilities.d.ts +1 -1
  186. package/dist/openapi/models/ImageEncodeCapabilities.js +1 -1
  187. package/dist/openapi/models/JobDefinition.d.ts +1 -1
  188. package/dist/openapi/models/JobDefinition.js +1 -1
  189. package/dist/openapi/models/JobDownload.d.ts +1 -1
  190. package/dist/openapi/models/JobDownload.js +1 -1
  191. package/dist/openapi/models/JobInputV2.d.ts +1 -1
  192. package/dist/openapi/models/JobInputV2.js +1 -1
  193. package/dist/openapi/models/JobMediaClass.d.ts +1 -1
  194. package/dist/openapi/models/JobMediaClass.js +1 -1
  195. package/dist/openapi/models/JobOutputSource.d.ts +1 -1
  196. package/dist/openapi/models/JobOutputSource.js +1 -1
  197. package/dist/openapi/models/JobResponse.d.ts +1 -1
  198. package/dist/openapi/models/JobResponse.js +1 -1
  199. package/dist/openapi/models/JobStatus.d.ts +1 -1
  200. package/dist/openapi/models/JobStatus.js +1 -1
  201. package/dist/openapi/models/JobType.d.ts +1 -1
  202. package/dist/openapi/models/JobType.js +1 -1
  203. package/dist/openapi/models/LivenessResponse.d.ts +1 -1
  204. package/dist/openapi/models/LivenessResponse.js +1 -1
  205. package/dist/openapi/models/LoginUser200Response.d.ts +1 -1
  206. package/dist/openapi/models/LoginUser200Response.js +1 -1
  207. package/dist/openapi/models/LoginUser200ResponseData.d.ts +1 -1
  208. package/dist/openapi/models/LoginUser200ResponseData.js +1 -1
  209. package/dist/openapi/models/LoginUser200ResponseDataUser.d.ts +1 -1
  210. package/dist/openapi/models/LoginUser200ResponseDataUser.js +1 -1
  211. package/dist/openapi/models/LoginUser401Response.d.ts +1 -1
  212. package/dist/openapi/models/LoginUser401Response.js +1 -1
  213. package/dist/openapi/models/LoginUserRequest.d.ts +1 -1
  214. package/dist/openapi/models/LoginUserRequest.js +1 -1
  215. package/dist/openapi/models/LongFormConcurrencyLimitResponse.d.ts +1 -1
  216. package/dist/openapi/models/LongFormConcurrencyLimitResponse.js +1 -1
  217. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.d.ts +1 -1
  218. package/dist/openapi/models/LongFormConcurrencyLimitResponseAllOfLinks.js +1 -1
  219. package/dist/openapi/models/MetadataResponse.d.ts +1 -1
  220. package/dist/openapi/models/MetadataResponse.js +1 -1
  221. package/dist/openapi/models/MetadataResponseDimensions.d.ts +1 -1
  222. package/dist/openapi/models/MetadataResponseDimensions.js +1 -1
  223. package/dist/openapi/models/MetadataResponseExif.d.ts +1 -1
  224. package/dist/openapi/models/MetadataResponseExif.js +1 -1
  225. package/dist/openapi/models/MetadataResponseExifGps.d.ts +1 -1
  226. package/dist/openapi/models/MetadataResponseExifGps.js +1 -1
  227. package/dist/openapi/models/MetadataSuccessEnvelope.d.ts +1 -1
  228. package/dist/openapi/models/MetadataSuccessEnvelope.js +1 -1
  229. package/dist/openapi/models/MimeGroupSchema.d.ts +1 -1
  230. package/dist/openapi/models/MimeGroupSchema.js +1 -1
  231. package/dist/openapi/models/MultiInputSource.d.ts +1 -1
  232. package/dist/openapi/models/MultiInputSource.js +1 -1
  233. package/dist/openapi/models/MultipartCompleteRequest.d.ts +1 -1
  234. package/dist/openapi/models/MultipartCompleteRequest.js +1 -1
  235. package/dist/openapi/models/MultipartCompleteRequestPartsInner.d.ts +1 -1
  236. package/dist/openapi/models/MultipartCompleteRequestPartsInner.js +1 -1
  237. package/dist/openapi/models/MultipartCompleteResponse.d.ts +1 -1
  238. package/dist/openapi/models/MultipartCompleteResponse.js +1 -1
  239. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.d.ts +1 -1
  240. package/dist/openapi/models/MultipartCompleteSuccessEnvelope.js +1 -1
  241. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.d.ts +1 -1
  242. package/dist/openapi/models/MultipartInitiateRequestMetadataHint.js +1 -1
  243. package/dist/openapi/models/MultipartInitiateResponse.d.ts +1 -1
  244. package/dist/openapi/models/MultipartInitiateResponse.js +1 -1
  245. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.d.ts +1 -1
  246. package/dist/openapi/models/MultipartInitiateSuccessEnvelope.js +1 -1
  247. package/dist/openapi/models/MultipartKeepaliveResponse.d.ts +1 -1
  248. package/dist/openapi/models/MultipartKeepaliveResponse.js +1 -1
  249. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.d.ts +1 -1
  250. package/dist/openapi/models/MultipartKeepaliveSuccessEnvelope.js +1 -1
  251. package/dist/openapi/models/MultipartPartListing.d.ts +1 -1
  252. package/dist/openapi/models/MultipartPartListing.js +1 -1
  253. package/dist/openapi/models/MultipartPresignRequest.d.ts +1 -1
  254. package/dist/openapi/models/MultipartPresignRequest.js +1 -1
  255. package/dist/openapi/models/MultipartPresignResponse.d.ts +1 -1
  256. package/dist/openapi/models/MultipartPresignResponse.js +1 -1
  257. package/dist/openapi/models/MultipartPresignSuccessEnvelope.d.ts +1 -1
  258. package/dist/openapi/models/MultipartPresignSuccessEnvelope.js +1 -1
  259. package/dist/openapi/models/MultipartStatusResponse.d.ts +1 -1
  260. package/dist/openapi/models/MultipartStatusResponse.js +1 -1
  261. package/dist/openapi/models/MultipartStatusSuccessEnvelope.d.ts +1 -1
  262. package/dist/openapi/models/MultipartStatusSuccessEnvelope.js +1 -1
  263. package/dist/openapi/models/NotifyConfig.d.ts +1 -1
  264. package/dist/openapi/models/NotifyConfig.js +1 -1
  265. package/dist/openapi/models/OperationCapability.d.ts +1 -1
  266. package/dist/openapi/models/OperationCapability.js +1 -1
  267. package/dist/openapi/models/OperationDefinition.d.ts +1 -1
  268. package/dist/openapi/models/OperationDefinition.js +1 -1
  269. package/dist/openapi/models/OperationDownload.d.ts +1 -1
  270. package/dist/openapi/models/OperationDownload.js +1 -1
  271. package/dist/openapi/models/OperationInputModel.d.ts +1 -1
  272. package/dist/openapi/models/OperationInputModel.js +1 -1
  273. package/dist/openapi/models/OperationResponse.d.ts +1 -1
  274. package/dist/openapi/models/OperationResponse.js +1 -1
  275. package/dist/openapi/models/OperationResult.d.ts +1 -1
  276. package/dist/openapi/models/OperationResult.js +1 -1
  277. package/dist/openapi/models/OperationResultMetadata.d.ts +1 -1
  278. package/dist/openapi/models/OperationResultMetadata.js +1 -1
  279. package/dist/openapi/models/OperationResultMetrics.d.ts +1 -1
  280. package/dist/openapi/models/OperationResultMetrics.js +1 -1
  281. package/dist/openapi/models/OperationSchemaDefinition.d.ts +1 -1
  282. package/dist/openapi/models/OperationSchemaDefinition.js +1 -1
  283. package/dist/openapi/models/OperationStatus.d.ts +1 -1
  284. package/dist/openapi/models/OperationStatus.js +1 -1
  285. package/dist/openapi/models/OperationType.d.ts +1 -1
  286. package/dist/openapi/models/OperationType.js +1 -1
  287. package/dist/openapi/models/OperationsSchemaResponse.d.ts +22 -11
  288. package/dist/openapi/models/OperationsSchemaResponse.js +1 -4
  289. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.d.ts +1 -1
  290. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeatures.js +1 -1
  291. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.d.ts +1 -1
  292. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDelivery.js +1 -1
  293. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.d.ts +1 -1
  294. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliveryMode.js +1 -1
  295. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.d.ts +1 -1
  296. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesDeliverySelection.js +1 -1
  297. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.d.ts +1 -1
  298. package/dist/openapi/models/OperationsSchemaResponseWorkflowFeaturesProcessing.js +1 -1
  299. package/dist/openapi/models/OptionSchema.d.ts +1 -1
  300. package/dist/openapi/models/OptionSchema.js +1 -1
  301. package/dist/openapi/models/OutputProperties.d.ts +1 -1
  302. package/dist/openapi/models/OutputProperties.js +1 -1
  303. package/dist/openapi/models/OutputPropertiesIsAnimated.d.ts +1 -1
  304. package/dist/openapi/models/OutputPropertiesIsAnimated.js +1 -1
  305. package/dist/openapi/models/PerClassAvailabilityEntry.d.ts +1 -1
  306. package/dist/openapi/models/PerClassAvailabilityEntry.js +1 -1
  307. package/dist/openapi/models/PerRoleCardinalityEntry.d.ts +1 -1
  308. package/dist/openapi/models/PerRoleCardinalityEntry.js +1 -1
  309. package/dist/openapi/models/PerValueAvailabilityEntry.d.ts +1 -1
  310. package/dist/openapi/models/PerValueAvailabilityEntry.js +1 -1
  311. package/dist/openapi/models/PresignedUrlPart.d.ts +1 -1
  312. package/dist/openapi/models/PresignedUrlPart.js +1 -1
  313. package/dist/openapi/models/ProbePendingResponse.d.ts +1 -1
  314. package/dist/openapi/models/ProbePendingResponse.js +1 -1
  315. package/dist/openapi/models/ProcessingClass.d.ts +1 -1
  316. package/dist/openapi/models/ProcessingClass.js +1 -1
  317. package/dist/openapi/models/ProcessingClassBandViolation.d.ts +1 -1
  318. package/dist/openapi/models/ProcessingClassBandViolation.js +1 -1
  319. package/dist/openapi/models/ProcessingClassConstraints.d.ts +1 -1
  320. package/dist/openapi/models/ProcessingClassConstraints.js +1 -1
  321. package/dist/openapi/models/ProcessingClassEntry.d.ts +1 -1
  322. package/dist/openapi/models/ProcessingClassEntry.js +1 -1
  323. package/dist/openapi/models/ProcessingClassExceedsBandResponse.d.ts +1 -1
  324. package/dist/openapi/models/ProcessingClassExceedsBandResponse.js +1 -1
  325. package/dist/openapi/models/ProcessingClassHint.d.ts +1 -1
  326. package/dist/openapi/models/ProcessingClassHint.js +1 -1
  327. package/dist/openapi/models/ProcessingClassReason.d.ts +1 -1
  328. package/dist/openapi/models/ProcessingClassReason.js +1 -1
  329. package/dist/openapi/models/ProcessingClassRejectReason.d.ts +1 -1
  330. package/dist/openapi/models/ProcessingClassRejectReason.js +1 -1
  331. package/dist/openapi/models/ProcessingPlan.d.ts +1 -1
  332. package/dist/openapi/models/ProcessingPlan.js +1 -1
  333. package/dist/openapi/models/ProcessingPlanJob.d.ts +1 -1
  334. package/dist/openapi/models/ProcessingPlanJob.js +1 -1
  335. package/dist/openapi/models/ReEncodeDecision.d.ts +1 -1
  336. package/dist/openapi/models/ReEncodeDecision.js +1 -1
  337. package/dist/openapi/models/ReadinessResponse.d.ts +1 -1
  338. package/dist/openapi/models/ReadinessResponse.js +1 -1
  339. package/dist/openapi/models/RegisterUser422Response.d.ts +1 -1
  340. package/dist/openapi/models/RegisterUser422Response.js +1 -1
  341. package/dist/openapi/models/RegisterUserRequest.d.ts +1 -1
  342. package/dist/openapi/models/RegisterUserRequest.js +1 -1
  343. package/dist/openapi/models/RequestAccountDeletion200Response.d.ts +1 -1
  344. package/dist/openapi/models/RequestAccountDeletion200Response.js +1 -1
  345. package/dist/openapi/models/RequestAccountDeletion200ResponseData.d.ts +1 -1
  346. package/dist/openapi/models/RequestAccountDeletion200ResponseData.js +1 -1
  347. package/dist/openapi/models/RequestAccountDeletionRequest.d.ts +1 -1
  348. package/dist/openapi/models/RequestAccountDeletionRequest.js +1 -1
  349. package/dist/openapi/models/ResendVerificationEmailRequest.d.ts +1 -1
  350. package/dist/openapi/models/ResendVerificationEmailRequest.js +1 -1
  351. package/dist/openapi/models/ResetPasswordRequest.d.ts +1 -1
  352. package/dist/openapi/models/ResetPasswordRequest.js +1 -1
  353. package/dist/openapi/models/ResponseEnvelope.d.ts +1 -1
  354. package/dist/openapi/models/ResponseEnvelope.js +1 -1
  355. package/dist/openapi/models/RetryResponse.d.ts +1 -1
  356. package/dist/openapi/models/RetryResponse.js +1 -1
  357. package/dist/openapi/models/RetrySuccessEnvelope.d.ts +1 -1
  358. package/dist/openapi/models/RetrySuccessEnvelope.js +1 -1
  359. package/dist/openapi/models/SseCompletionBase.d.ts +1 -1
  360. package/dist/openapi/models/SseCompletionBase.js +1 -1
  361. package/dist/openapi/models/SseEventType.d.ts +1 -1
  362. package/dist/openapi/models/SseEventType.js +1 -1
  363. package/dist/openapi/models/SseJobCompletedData.d.ts +1 -1
  364. package/dist/openapi/models/SseJobCompletedData.js +1 -1
  365. package/dist/openapi/models/SseJobFailedData.d.ts +1 -1
  366. package/dist/openapi/models/SseJobFailedData.js +1 -1
  367. package/dist/openapi/models/SseMultiOutputCompletion.d.ts +1 -1
  368. package/dist/openapi/models/SseMultiOutputCompletion.js +1 -1
  369. package/dist/openapi/models/SseMultiOutputCompletionMetrics.d.ts +1 -1
  370. package/dist/openapi/models/SseMultiOutputCompletionMetrics.js +1 -1
  371. package/dist/openapi/models/SseMultiOutputCompletionWithKind.d.ts +1 -1
  372. package/dist/openapi/models/SseMultiOutputCompletionWithKind.js +1 -1
  373. package/dist/openapi/models/SseMultiOutputResultEntry.d.ts +1 -1
  374. package/dist/openapi/models/SseMultiOutputResultEntry.js +1 -1
  375. package/dist/openapi/models/SseOperationCompletedData.d.ts +1 -1
  376. package/dist/openapi/models/SseOperationCompletedData.js +1 -1
  377. package/dist/openapi/models/SseOperationCompletionResult.d.ts +1 -1
  378. package/dist/openapi/models/SseOperationCompletionResult.js +1 -1
  379. package/dist/openapi/models/SseOperationFailedData.d.ts +1 -1
  380. package/dist/openapi/models/SseOperationFailedData.js +1 -1
  381. package/dist/openapi/models/SseOperationProgressData.d.ts +1 -1
  382. package/dist/openapi/models/SseOperationProgressData.js +1 -1
  383. package/dist/openapi/models/SseSingleOutputCompletion.d.ts +1 -1
  384. package/dist/openapi/models/SseSingleOutputCompletion.js +1 -1
  385. package/dist/openapi/models/SseWorkflowTerminalData.d.ts +1 -1
  386. package/dist/openapi/models/SseWorkflowTerminalData.js +1 -1
  387. package/dist/openapi/models/TierRestrictionKind.d.ts +19 -5
  388. package/dist/openapi/models/TierRestrictionKind.js +19 -5
  389. package/dist/openapi/models/TierRestrictionResponse.d.ts +1 -1
  390. package/dist/openapi/models/TierRestrictionResponse.js +1 -1
  391. package/dist/openapi/models/UpdateProfile200Response.d.ts +1 -1
  392. package/dist/openapi/models/UpdateProfile200Response.js +1 -1
  393. package/dist/openapi/models/UpdateProfile200ResponseData.d.ts +1 -1
  394. package/dist/openapi/models/UpdateProfile200ResponseData.js +1 -1
  395. package/dist/openapi/models/UpdateProfile422Response.d.ts +1 -1
  396. package/dist/openapi/models/UpdateProfile422Response.js +1 -1
  397. package/dist/openapi/models/UpdateProfileRequest.d.ts +1 -1
  398. package/dist/openapi/models/UpdateProfileRequest.js +1 -1
  399. package/dist/openapi/models/UploadConstraintsApplied.d.ts +1 -1
  400. package/dist/openapi/models/UploadConstraintsApplied.js +1 -1
  401. package/dist/openapi/models/UploadDurationExceedsTierResponse.d.ts +1 -1
  402. package/dist/openapi/models/UploadDurationExceedsTierResponse.js +1 -1
  403. package/dist/openapi/models/UploadFile403Response.d.ts +1 -1
  404. package/dist/openapi/models/UploadFile403Response.js +1 -1
  405. package/dist/openapi/models/UploadFile422Response.d.ts +1 -1
  406. package/dist/openapi/models/UploadFile422Response.js +1 -1
  407. package/dist/openapi/models/UploadProbeMediaMetadata.d.ts +1 -1
  408. package/dist/openapi/models/UploadProbeMediaMetadata.js +1 -1
  409. package/dist/openapi/models/UploadProbeProcessingClass.d.ts +1 -1
  410. package/dist/openapi/models/UploadProbeProcessingClass.js +1 -1
  411. package/dist/openapi/models/UploadProbeResponse.d.ts +1 -1
  412. package/dist/openapi/models/UploadProbeResponse.js +1 -1
  413. package/dist/openapi/models/UploadProbeStatus.d.ts +1 -1
  414. package/dist/openapi/models/UploadProbeStatus.js +1 -1
  415. package/dist/openapi/models/UploadProbeSuccessEnvelope.d.ts +1 -1
  416. package/dist/openapi/models/UploadProbeSuccessEnvelope.js +1 -1
  417. package/dist/openapi/models/UploadResponse.d.ts +1 -1
  418. package/dist/openapi/models/UploadResponse.js +1 -1
  419. package/dist/openapi/models/UploadSizeExceedsTierResponse.d.ts +1 -1
  420. package/dist/openapi/models/UploadSizeExceedsTierResponse.js +1 -1
  421. package/dist/openapi/models/UploadSource.d.ts +1 -1
  422. package/dist/openapi/models/UploadSource.js +1 -1
  423. package/dist/openapi/models/UploadSuccessEnvelope.d.ts +1 -1
  424. package/dist/openapi/models/UploadSuccessEnvelope.js +1 -1
  425. package/dist/openapi/models/UploadThresholds.d.ts +1 -1
  426. package/dist/openapi/models/UploadThresholds.js +1 -1
  427. package/dist/openapi/models/UserTier.d.ts +108 -35
  428. package/dist/openapi/models/UserTier.js +108 -35
  429. package/dist/openapi/models/ValidationErrorEnvelope.d.ts +1 -1
  430. package/dist/openapi/models/ValidationErrorEnvelope.js +1 -1
  431. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.d.ts +1 -1
  432. package/dist/openapi/models/ValidationErrorEnvelopeDetailsInner.js +1 -1
  433. package/dist/openapi/models/VerifyEmailRequest.d.ts +1 -1
  434. package/dist/openapi/models/VerifyEmailRequest.js +1 -1
  435. package/dist/openapi/models/WarningType.d.ts +1 -1
  436. package/dist/openapi/models/WarningType.js +1 -1
  437. package/dist/openapi/models/WebhookOperationContext.d.ts +1 -1
  438. package/dist/openapi/models/WebhookOperationContext.js +1 -1
  439. package/dist/openapi/models/WebhookPayload.d.ts +1 -1
  440. package/dist/openapi/models/WebhookPayload.js +1 -1
  441. package/dist/openapi/models/WorkflowArchiveResponse.d.ts +1 -1
  442. package/dist/openapi/models/WorkflowArchiveResponse.js +1 -1
  443. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.d.ts +1 -1
  444. package/dist/openapi/models/WorkflowArchiveSuccessEnvelope.js +1 -1
  445. package/dist/openapi/models/WorkflowCancelBillingEffect.d.ts +1 -1
  446. package/dist/openapi/models/WorkflowCancelBillingEffect.js +1 -1
  447. package/dist/openapi/models/WorkflowCancelResponse.d.ts +1 -1
  448. package/dist/openapi/models/WorkflowCancelResponse.js +1 -1
  449. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.d.ts +1 -1
  450. package/dist/openapi/models/WorkflowCancelSuccessEnvelope.js +1 -1
  451. package/dist/openapi/models/WorkflowCreateRequest.d.ts +1 -1
  452. package/dist/openapi/models/WorkflowCreateRequest.js +1 -1
  453. package/dist/openapi/models/WorkflowCreateResponse.d.ts +1 -1
  454. package/dist/openapi/models/WorkflowCreateResponse.js +1 -1
  455. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.d.ts +1 -1
  456. package/dist/openapi/models/WorkflowCreateSuccessEnvelope.js +1 -1
  457. package/dist/openapi/models/WorkflowCreditSummary.d.ts +1 -1
  458. package/dist/openapi/models/WorkflowCreditSummary.js +1 -1
  459. package/dist/openapi/models/WorkflowDownloadResponse.d.ts +1 -1
  460. package/dist/openapi/models/WorkflowDownloadResponse.js +1 -1
  461. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.d.ts +1 -1
  462. package/dist/openapi/models/WorkflowDownloadSuccessEnvelope.js +1 -1
  463. package/dist/openapi/models/WorkflowEdge.d.ts +1 -1
  464. package/dist/openapi/models/WorkflowEdge.js +1 -1
  465. package/dist/openapi/models/WorkflowExpiredResponse.d.ts +1 -1
  466. package/dist/openapi/models/WorkflowExpiredResponse.js +1 -1
  467. package/dist/openapi/models/WorkflowListResponse.d.ts +1 -1
  468. package/dist/openapi/models/WorkflowListResponse.js +1 -1
  469. package/dist/openapi/models/WorkflowListSuccessEnvelope.d.ts +1 -1
  470. package/dist/openapi/models/WorkflowListSuccessEnvelope.js +1 -1
  471. package/dist/openapi/models/WorkflowPauseRequiredAction.d.ts +1 -1
  472. package/dist/openapi/models/WorkflowPauseRequiredAction.js +1 -1
  473. package/dist/openapi/models/WorkflowPausedDetail.d.ts +1 -1
  474. package/dist/openapi/models/WorkflowPausedDetail.js +1 -1
  475. package/dist/openapi/models/WorkflowPausedDetailLinks.d.ts +1 -1
  476. package/dist/openapi/models/WorkflowPausedDetailLinks.js +1 -1
  477. package/dist/openapi/models/WorkflowProcessing.d.ts +1 -1
  478. package/dist/openapi/models/WorkflowProcessing.js +1 -1
  479. package/dist/openapi/models/WorkflowRestoreResponse.d.ts +1 -1
  480. package/dist/openapi/models/WorkflowRestoreResponse.js +1 -1
  481. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.d.ts +1 -1
  482. package/dist/openapi/models/WorkflowRestoreSuccessEnvelope.js +1 -1
  483. package/dist/openapi/models/WorkflowResumeResponse.d.ts +1 -1
  484. package/dist/openapi/models/WorkflowResumeResponse.js +1 -1
  485. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.d.ts +1 -1
  486. package/dist/openapi/models/WorkflowResumeSuccessEnvelope.js +1 -1
  487. package/dist/openapi/models/WorkflowSource.d.ts +1 -1
  488. package/dist/openapi/models/WorkflowSource.js +1 -1
  489. package/dist/openapi/models/WorkflowStatus.d.ts +1 -1
  490. package/dist/openapi/models/WorkflowStatus.js +1 -1
  491. package/dist/openapi/models/WorkflowStatusResponse.d.ts +1 -1
  492. package/dist/openapi/models/WorkflowStatusResponse.js +1 -1
  493. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.d.ts +1 -1
  494. package/dist/openapi/models/WorkflowStatusSuccessEnvelope.js +1 -1
  495. package/dist/openapi/models/WorkflowSummary.d.ts +1 -1
  496. package/dist/openapi/models/WorkflowSummary.js +1 -1
  497. package/dist/openapi/models/WorkflowSummaryJob.d.ts +1 -1
  498. package/dist/openapi/models/WorkflowSummaryJob.js +1 -1
  499. package/dist/openapi/models/WorkflowWarning.d.ts +1 -1
  500. package/dist/openapi/models/WorkflowWarning.js +1 -1
  501. package/dist/openapi/models/WorkflowWarningSeverity.d.ts +1 -1
  502. package/dist/openapi/models/WorkflowWarningSeverity.js +1 -1
  503. package/dist/openapi/models/index.d.ts +1 -4
  504. package/dist/openapi/models/index.js +1 -4
  505. package/dist/openapi/runtime.d.ts +1 -1
  506. package/dist/openapi/runtime.js +1 -1
  507. package/dist/operations/metadata-types.d.ts +1 -1
  508. package/openapi/README.md +1 -1
  509. package/openapi/api.yaml +628 -200
  510. package/operation-capabilities/operation-capabilities.json +1 -1
  511. package/package.json +7 -3
  512. package/dist/openapi/models/MediaCategory.d.ts +0 -31
  513. package/dist/openapi/models/TierDefaultLimits.d.ts +0 -59
  514. package/dist/openapi/models/TierDefaults.d.ts +0 -66
  515. package/dist/openapi/models/TierDefaults.js +0 -49
  516. package/dist/openapi/models/TierDefaultsByAudience.d.ts +0 -73
  517. package/dist/openapi/models/TierDefaultsByAudience.js +0 -60
package/openapi/api.yaml CHANGED
@@ -89,7 +89,7 @@ info:
89
89
  of truth instead of hardcoding magic numbers. A runtime
90
90
  `GET /api/uploads/limits` endpoint for dynamic discovery
91
91
  (per-tier / per-environment overrides) is a deferred follow-up.
92
- version: 2.192.0
92
+ version: 2.196.0
93
93
  contact:
94
94
  name: API Support
95
95
 
@@ -168,7 +168,14 @@ paths:
168
168
  $ref: '#/components/schemas/SingleUploadRequest'
169
169
  responses:
170
170
  '200':
171
- description: File uploaded successfully
171
+ description: |
172
+ File uploaded successfully.
173
+
174
+ ⚠️ **SAMPLE VALUES BELOW ARE ILLUSTRATIVE AND NOT A LIMITS SOURCE.**
175
+ `constraints_applied` shows the SHAPE of what the server echoes; the
176
+ figures are not maintained against the API's tier enum and must not
177
+ be read as current caps. A caller's real, override-aware limits come
178
+ from `GET /api/v2/account/limits`.
172
179
  content:
173
180
  application/json:
174
181
  schema:
@@ -215,7 +222,7 @@ paths:
215
222
  feature_tier_restricted: '#/components/schemas/FeatureTierRestrictedResponse'
216
223
  examples:
217
224
  tier_restriction_mime:
218
- summary: Free tier uploading a video
225
+ summary: A caller's tier does not permit the uploaded MIME type
219
226
  value:
220
227
  success: false
221
228
  error: "Your tier does not permit this MIME type"
@@ -313,16 +320,24 @@ paths:
313
320
  upload_duration_exceeds_tier: '#/components/schemas/UploadDurationExceedsTierResponse'
314
321
  examples:
315
322
  size_exceeds_tier:
316
- summary: Free-tier caller uploads a 200MB file (cap is 10 MiB)
323
+ summary: >-
324
+ Envelope shape only — SAMPLE VALUES ARE ILLUSTRATIVE AND NOT
325
+ A LIMITS SOURCE. The figures below are not maintained against
326
+ the API's tier enum; a caller's real, override-aware limits
327
+ come from GET /api/v2/account/limits.
317
328
  value:
318
329
  success: false
319
- error: "Upload exceeds size cap for free tier (max 10 MiB; pro permits up to 5 GiB)."
330
+ error: "Upload exceeds the size cap for your tier."
320
331
  error_type: "upload_size_exceeds_tier"
321
332
  current_tier: "free"
322
- max_size_bytes: 10485760
333
+ max_size_bytes: 1048576
323
334
  required_tier: "pro"
324
335
  duration_exceeds_tier:
325
- summary: Pro-tier caller uploads a 30-minute video (cap is 5min on short_form)
336
+ summary: >-
337
+ Envelope shape only — SAMPLE VALUES ARE ILLUSTRATIVE AND NOT
338
+ A LIMITS SOURCE. The authoritative duration bands are
339
+ generated into each operation schema's processing_class
340
+ constraints.
326
341
  value:
327
342
  success: false
328
343
  error: "Upload exceeds short_form duration cap (max 5 minutes; long_form permits up to 12 hours)."
@@ -2369,6 +2384,252 @@ paths:
2369
2384
  /api/workflows/{id}/events:
2370
2385
  get:
2371
2386
  summary: Stream workflow events (SSE)
2387
+ # THE STREAM DOES NOT LIVE ON THE API HOST. THAT IS A CONTRACT FACT,
2388
+ # DECLARED PER-OPERATION, AND DELIBERATELY NOT A CONVENTION.
2389
+ #
2390
+ # ⚠️ RULING (hub, 2026-08-14, on sdks' recommendation with api agreeing):
2391
+ # SPLIT HOSTS, DECLARED PER-OPERATION. Not string surgery on `api.*`, not
2392
+ # a per-client rule. The reason is not aesthetic — IT IS THAT A CONVENTION
2393
+ # CAN ONLY FAIL SILENTLY. The frontend carried `VITE_SSE_BASE_URL`
2394
+ # (created 2026-06-17) and preferred it when set; PROD NEVER SET IT, so
2395
+ # prod silently fell back to the gateway path and inherited an entry point
2396
+ # that cannot stream — for weeks, while everyone believed SSE worked. A
2397
+ # declared per-operation server cannot fail that way.
2398
+ #
2399
+ # 🔴 WHAT THIS DECLARATION DOES **NOT** DO, STATED BECAUSE IT IS THE
2400
+ # DIFFERENCE BETWEEN DECLARED AND IN EFFECT: it does not repoint any
2401
+ # existing client. Both shipped SDKs resolve EVERY url from a single
2402
+ # configured base — PHP `GislClient::streamEvents()` builds from the same
2403
+ # base URL as everything else, and TypeScript does likewise — and the
2404
+ # generators emit models and supporting files rather than per-operation
2405
+ # server handling. **A CLIENT CONFIGURED FOR `api.*` KEEPS SENDING SSE TO
2406
+ # `api.*` AFTER THIS LANDS.**
2407
+ #
2408
+ # ⇒ This block makes the routing a CONTRACT FACT that a client can
2409
+ # consume. Consuming it is a change to endpoint RESOLUTION in two
2410
+ # languages (sdks' `VUozk5Bc`), and it is theirs. Writing "a generated
2411
+ # client picks the host up from the contract" would be the same
2412
+ # declared-equals-working error this comment exists to warn about.
2413
+ #
2414
+ # THE RULE, STATED SO NOBODY DERIVES A DIFFERENT ONE: this is the ONLY
2415
+ # operation with its own `servers`. Every other endpoint uses the
2416
+ # root-level `servers:`. The stream API happens to proxy `ANY /{proxy+}`
2417
+ # — the whole API — so "route SSE at the stream host" could have meant
2418
+ # "move everything"; IT DOES NOT. Split per-endpoint, and the split is
2419
+ # expressed here rather than in three consumers' READMEs.
2420
+ #
2421
+ # WHY THE API HOST CANNOT DO THIS — mechanism, not a workaround (api,
2422
+ # 2026-08-13, relayed via the hub; contracts has not measured it):
2423
+ # `api.*` is an API Gateway **HTTP API** with `integration_timeout_ms`
2424
+ # 29000 against a **30s hard AWS ceiling with no quota path**, and
2425
+ # `responseTransferMode: STREAM` is **REST-only**. `stream.*` is a REST
2426
+ # API with a 900000ms timeout and STREAM set. Raising a number fixes
2427
+ # nothing.
2428
+ #
2429
+ # THE REVERT CONDITION IS MET. This block was reverted on 2026-08-12
2430
+ # (27d606c) with a named gate: "re-lands when the path is PROVEN".
2431
+ # e2e then measured `stream.staging` streaming — `:ok` at 0.0s, frames
2432
+ # over 165s, ~16s heartbeats — while `api.staging` 503s at 29.35s, which
2433
+ # is the integration timeout firing to the millisecond. Measured AND
2434
+ # mechanistically explained, which is what the gate asked for.
2435
+ #
2436
+ # HISTORY, kept because the reasoning is still live even though its
2437
+ # conclusion is not: from 2026-08-14 to 2026-08-18 there was DELIBERATELY
2438
+ # NO PRODUCTION ENTRY, on the rule that declaring a prod host would be a
2439
+ # contract fact pointing at something unproven — worse than the gap
2440
+ # because it LOOKS resolved.
2441
+ #
2442
+ # ⚠️ THAT RULE IS NOT REPEALED. What ended the withholding is that the gap
2443
+ # was found to be ALREADY OCCUPIED: `compression_frontend`'s prod deploy
2444
+ # hardcodes `VITE_SSE_BASE_URL` to the prod stream host, so the convention
2445
+ # was live and undeclared, and silence was preventing consumers from
2446
+ # KNOWING about a host they already depended on. The rule is now satisfied
2447
+ # a different way — the prod entry states, in itself, which half is proven
2448
+ # (ROUTING) and which is not (DURATION, the property the split host exists
2449
+ # for). See its description.
2450
+ #
2451
+ # ⇒ Do NOT read the prod entry as "prod SSE is proven". If you are about
2452
+ # to write that sentence, the discriminator is named in the entry and has
2453
+ # not been run.
2454
+ servers:
2455
+ - url: http://localhost:8080
2456
+ # WHICH ROOT SERVER THIS ENTRY REPLACES. Without it a client has to
2457
+ # infer the mapping from ordering or hostname shape — which is a
2458
+ # per-client rule, i.e. the exact thing declaring the split was meant
2459
+ # to remove. A client matches its CONFIGURED base against
2460
+ # `x-replaces` exactly and takes `url`; no convention, no ordering
2461
+ # dependency, and an unmatched base is an honest "no override for the
2462
+ # host you are pointed at" rather than a guess.
2463
+ x-replaces: http://localhost:8080
2464
+ description: |
2465
+ Local development. Same origin as the rest of the API — local runs
2466
+ do NOT reproduce the split-host topology, so a client that works
2467
+ locally has **not** exercised the cross-origin path. Treat a local
2468
+ pass as evidence about your code and not about the routing.
2469
+ - url: https://stream.giveitsmaller.com
2470
+ x-replaces: https://api.giveitsmaller.com
2471
+ description: |
2472
+ Production stream host. Declared 2026-08-18 after **routing** was
2473
+ measured; see the two headings below for exactly what that does and
2474
+ does not cover.
2475
+
2476
+ 🔴 **THIS ENTRY WAS DELIBERATELY WITHHELD FROM 2026-08-14 TO
2477
+ 2026-08-18, AND THE REASON IT LANDED IS NOT THAT THE ORIGINAL GATE
2478
+ WAS MET.** The gate was *"prod has never had a proven stream; a
2479
+ declared host would be a contract fact pointing at nothing — worse
2480
+ than the gap, because it looks resolved."* What changed is that **the
2481
+ gap was found to be already occupied**:
2482
+ `compression_frontend/.github/workflows/deploy-env.yml` hardcodes
2483
+ `VITE_SSE_BASE_URL: https://stream.giveitsmaller.com` for prod, so
2484
+ **the production frontend has been routing SSE to this host all
2485
+ along, undeclared.** Contract silence was not preventing anyone from
2486
+ depending on the host; it was preventing them from *knowing* about
2487
+ it — which is the undeclared per-client convention this whole
2488
+ declaration exists to end.
2489
+
2490
+ ### WHAT IS MEASURED (2026-08-18, prod, by `compression_e2e`)
2491
+
2492
+ - An **authenticated stream against a real prod workflow** returned
2493
+ `200` with `content-type: text/event-stream`, replayed
2494
+ `operation.progress` at 10 / 50 / 90, then `operation.completed`
2495
+ carrying a real presigned S3 `download_url`, `size_bytes` 246217,
2496
+ `compression_ratio` 0.3288 — then `job.completed` and
2497
+ `workflow.completed`.
2498
+ - An **unauthenticated** request returns the full localised error
2499
+ envelope (`WORKFLOW_NOT_FOUND` with `message_key`,
2500
+ `Content-Language: en-GB`, `Vary`, HSTS), byte-identical to
2501
+ `api.giveitsmaller.com` — so this host reaches the **real
2502
+ application**, not an edge stub or a parked custom domain.
2503
+ - **CORS is correct on both hosts**: preflight `200`,
2504
+ `Access-Control-Allow-Origin` exactly
2505
+ `https://www.giveitsmaller.com`, `Allow-Credentials: true`,
2506
+ `Authorization` among the allowed headers.
2507
+
2508
+ ### ⚠️ WHAT IS **NOT** MEASURED: DURATION — THE PROPERTY THIS HOST EXISTS FOR
2509
+
2510
+ **The split host exists because `api.*` is an API Gateway HTTP API
2511
+ with a 30-second hard ceiling** (staging measured it `503`-ing at
2512
+ **29.35s**, to the millisecond) and `responseTransferMode: STREAM` is
2513
+ REST-only. **Nothing has yet shown that a stream on THIS host
2514
+ survives past that ceiling.**
2515
+
2516
+ The attempt was made and could not answer: prod holds exactly one
2517
+ workflow and it was already **terminal**, so the server correctly
2518
+ replayed history and closed on the terminal frame — total elapsed
2519
+ **0.355s**. ⇒ **A stream that closes at 0.4s because the job finished
2520
+ says nothing about whether a stream that WANTED to stay open would
2521
+ survive to 35s.** It is a non-answer, not a negative result.
2522
+
2523
+ **The discriminator, named so nobody re-derives it:** a
2524
+ **NON-TERMINAL** prod job, streamed and held, reporting either the
2525
+ last-byte timestamp or that the connection was still open at **35s+**.
2526
+ One request; no browser needed. Until then, treat long-lived prod
2527
+ streams as unproven on this host — and note that a client falling
2528
+ back to `api.giveitsmaller.com` is *provably* subject to the 30s
2529
+ ceiling, so this entry cannot be worse than the fallback.
2530
+
2531
+ ⚠️ **The BROWSER path is also unmeasured.** The evidence above is
2532
+ HTTP-layer. The CORS preflight is correct, which is the part a
2533
+ browser needs, but no browser client has been observed consuming this
2534
+ stream in production.
2535
+
2536
+ **This entry declares ROUTING. It does not assert that prod SSE
2537
+ works** — do not let it be quoted as though it did.
2538
+
2539
+ The CORS scope, auth and cross-origin caveats stated on the staging
2540
+ entry above apply here too, with one difference already noted there:
2541
+ **prod's API host has never permitted `localhost`.**
2542
+ - url: https://stream.staging.giveitsmaller.com
2543
+ x-replaces: https://api.staging.giveitsmaller.com
2544
+ description: |
2545
+ Staging stream host. A SEPARATE PUBLIC ENTRY POINT from
2546
+ `api.staging.giveitsmaller.com`, which is why it is declared here
2547
+ rather than inherited: the API host fronts an integration with no
2548
+ response-streaming mode, and this is the only endpoint that needs
2549
+ streaming.
2550
+
2551
+ ⚠️ **THIS HOST ALLOWS EXACTLY ONE CORS ORIGIN, AND IT IS A
2552
+ DIFFERENT POLICY FROM THE API HOST.** The stream stack sets
2553
+ `cors_allow_origin` (**singular**) to the frontend host alone, in
2554
+ **both** environments. The API host sets `cors_allow_origins`
2555
+ (**plural**) — and **the list differs BY ENVIRONMENT**:
2556
+
2557
+ staging api host localhost:5173, localhost:3000, www.staging…
2558
+ prod api host www.giveitsmaller.com ← NO localhost, never had
2559
+ both stream the frontend host only (singular)
2560
+
2561
+ ⇒ **A BROWSER ON localhost CAN CALL THE STAGING API HOST AND
2562
+ CANNOT CALL EITHER STREAM HOST.** The break is **conditional on a
2563
+ local build choosing this host**: the frontend's local build leaves
2564
+ `VITE_SSE_BASE_URL` unset and falls back to the API host, so nothing
2565
+ breaks today (measured by `compression_frontend`, 2026-08-14). **A
2566
+ client that DOES point a localhost browser here is blocked, and the
2567
+ failure arrives as a CORS error that reads as a configuration
2568
+ mistake in their own app.**
2569
+
2570
+ **This is a local-development concern only; prod never permitted
2571
+ localhost on any host** (measured by `compression_terraform`,
2572
+ 2026-08-14 — an earlier version of this note gave the staging list
2573
+ without saying it was staging's, which would have read as universal
2574
+ and turned a dev-experience issue into an apparent launch one).
2575
+
2576
+ ⚠️ **"Just add another origin" is not a CONFIG CHANGE here, and
2577
+ the reason is our implementation rather than an AWS limit.** An API
2578
+ Gateway **HTTP** API has a native, declarative CORS configuration
2579
+ that takes a LIST and echoes whichever origin matches. A **REST**
2580
+ API has no equivalent declarative feature — the value is whatever
2581
+ the preflight MOCK integration and the backend return — so
2582
+ multi-origin support is possible but must be **built**
2583
+ (validate-the-Origin-then-echo), which is a change with its own
2584
+ correctness risk rather than an extra list entry.
2585
+
2586
+ *(An earlier version of this note said a REST API simply cannot do
2587
+ it. That is wrong: AWS documents that for proxy integrations the
2588
+ BACKEND returns `Access-Control-Allow-Origin`, so per-origin
2589
+ responses are available to anyone willing to implement them.
2590
+ Stating a platform prohibition where an implementation choice
2591
+ exists closes a door that is open.)*
2592
+
2593
+ The credentialed case does foreclose the other escape: with
2594
+ `Allow-Credentials: true` the origin header cannot be `*`.
2595
+
2596
+ The same applies to embedded and third-party consumers, and to any
2597
+ **browser build of a published SDK**: `@giveitsmaller/sdk` ships a
2598
+ browser entry point whose client carries `streamEvents`, so this is
2599
+ a published-surface limit rather than an internal one.
2600
+
2601
+ A server-side caller is unaffected. **The origin list is a property
2602
+ of the deployed stack, not of this contract** — it is stated here
2603
+ because a client author reading only the URL cannot discover it, and
2604
+ it changes only in `compression_terraform`.
2605
+
2606
+ ⚠️ **AUTH ON THIS HOST IS CROSS-ORIGIN, AND `sessionAuth` IS THE
2607
+ ONE THAT MAY NOT SURVIVE IT.** This operation advertises
2608
+ `bearerAuth`, `sessionAuth` and anonymous access — but the security
2609
+ list describes what the ENDPOINT accepts, not what a browser can
2610
+ deliver to a different origin.
2611
+
2612
+ **Cookie domain scope is necessary and NOT sufficient.** A
2613
+ credentialed cross-origin request additionally requires the client
2614
+ to opt in (`EventSource { withCredentials: true }`, or `fetch`
2615
+ with `credentials: 'include'`) **and** the server to answer with
2616
+ `Access-Control-Allow-Credentials` and a non-wildcard origin. Bearer
2617
+ and capability headers likewise need the header to be permitted by
2618
+ the preflight response.
2619
+
2620
+ **None of that is verified by this contract, and contracts has not
2621
+ measured it.**
2622
+
2623
+ 🔴 **This passage used to conclude "a browser client SHOULD prefer
2624
+ `bearerAuth` or the anonymous capability header on this host, and
2625
+ should treat cookie-based session auth as unproven". DO NOT
2626
+ REINSTATE IT.** For an **owned** stream the shipped browser client
2627
+ has no bearer token on its runtime path at all, so that advice named
2628
+ a credential the caller does not possess — leaving a logged-in user
2629
+ with nothing to send. See **AUTH ON THE STREAM HOST** on the
2630
+ operation below, which is the single place this question is
2631
+ answered; the cross-origin caveats above remain true and are what
2632
+ that section is qualified by.
2372
2633
  description: |
2373
2634
  Server-Sent Events endpoint for real-time workflow progress. The server pushes
2374
2635
  events as workflow, job, and operation statuses change.
@@ -2426,7 +2687,85 @@ paths:
2426
2687
  the `data:` JSON payload of each event. The SSE envelope framing itself
2427
2688
  (the `id:` and `event:` lines) is transport-level and intentionally
2428
2689
  **not** schema-described.
2690
+
2691
+ ### AUTH ON THE STREAM HOST: the CREDENTIAL decides, not the caller
2692
+
2693
+ **Two axes, and conflating them is what made two earlier versions of this
2694
+ note wrong.** *Which credential is available to you* depends on the
2695
+ workflow and your runtime. *What the browser then requires of the
2696
+ request* depends only on **which credential you actually send**.
2697
+
2698
+ **Which credential you have:**
2699
+
2700
+ | workflow | caller | credential |
2701
+ |---|---|---|
2702
+ | null-owner | any runtime, server or browser | **`X-Workflow-Capability`** — bearer does NOT establish workflow ownership and is not a substitute |
2703
+ | owned | server-side | **`bearerAuth`** (or `sessionAuth`) |
2704
+ | owned | the shipped browser client | **the session cookie** — it carries no bearer token on its runtime path, so this is the only credential it possesses |
2705
+
2706
+ ⚠️ **The last row describes the SHIPPED CLIENT, not what the endpoint
2707
+ supports.** The endpoint accepts `bearerAuth` for an owned workflow; a
2708
+ browser build that obtains a bearer token can use it.
2709
+
2710
+ **What the credential then requires of the request:**
2711
+
2712
+ | credential sent | `credentials` mode | why |
2713
+ |---|---|---|
2714
+ | any **header** (bearer or capability) | **`omit`** | the header carries the auth; `include` would impose the credentialed-CORS requirement for nothing |
2715
+ | the **session cookie** | **`include`** | the cookie *is* the credential, and the browser only sends it in this mode |
2716
+
2717
+ ⇒ **The mode follows the CREDENTIAL, not the ownership and not the
2718
+ runtime.** An owned stream authenticated by bearer uses `omit`; only a
2719
+ cookie-authenticated request needs `include`.
2720
+
2721
+ **Where a header credential is available it is already the right answer** —
2722
+ headers are immune to `SameSite` and third-party-cookie policy and need no
2723
+ `Access-Control-Allow-Credentials`. What is NOT yet available is a
2724
+ **browser** bearer credential for an **owned** stream, and until one
2725
+ exists that one cell of the matrix cannot act on the advice.
2726
+
2727
+ 🔴 **Two earlier versions of this note stated a destination in the present
2728
+ tense and would have caused harm.** One concluded *"a browser client
2729
+ SHOULD prefer `bearerAuth` or the anonymous capability header on this
2730
+ host"*; a later revision restated it as *"cookie session auth is NOT
2731
+ supported on the stream host"*. **Both named a credential an owned browser
2732
+ caller does not possess**, and an implementer following either would have
2733
+ left every logged-in user with nothing to send. Verified in the shipped
2734
+ client, not inferred. **DO NOT REINSTATE EITHER.**
2735
+
2736
+ ⚠️ **`sessionAuth` therefore stays in the `security` list, and so does the
2737
+ anonymous `{}` alternative, pending the modelling fix noted below.**
2738
+ OpenAPI has **no per-server `security`**: an operation-level `servers`
2739
+ block does not scope it, so one list covers this operation on every host.
2740
+
2741
+ ⚠️ **`X-Workflow-Capability` is currently a HEADER PARAMETER, not a
2742
+ security scheme**, so the machine-readable contract does not express that
2743
+ a null-owner read requires it — the `{}` alternative advertises
2744
+ credential-free access that a successful null-owner read does not
2745
+ actually have. Promoting it to an `apiKey` scheme is available and is
2746
+ tracked separately; naming it in prose is documentation, and treating
2747
+ that as a declaration is the mistake this note exists to prevent.
2748
+
2749
+ ⚠️ **`credentials: 'include'` is a property of the REQUEST MODE, not of
2750
+ the credential you meant to send.** A `fetch` issued with it makes the
2751
+ browser require the response to carry `Access-Control-Allow-Credentials:
2752
+ true` **and** a non-wildcard origin — **or it blocks the response, whether
2753
+ or not a cookie was actually sent**. So a header-authenticated request
2754
+ that keeps `include` is browser-blocked against a host that does not
2755
+ return the header **while its authentication is perfectly fine** — a
2756
+ failure that reads as an auth bug and is not one. The shipped browser
2757
+ client already splits on exactly this.
2429
2758
  operationId: streamWorkflowEvents
2759
+ # ⚠️ `sessionAuth` IS LOAD-BEARING — the session cookie is the SOLE
2760
+ # credential for an OWNED stream on the shipped browser client, which
2761
+ # carries no bearer token on its runtime path. Do not remove it on the
2762
+ # strength of a "prefer headers" ruling; that ruling is a direction, and
2763
+ # for owned streams there is currently nothing to point at.
2764
+ # `{}` is the anonymous alternative and is currently OVER-PERMISSIVE: a
2765
+ # successful null-owner read requires `X-Workflow-Capability`, which is a
2766
+ # header PARAMETER rather than a security scheme, so the security list
2767
+ # cannot yet say so. Tracked separately.
2768
+ # See AUTH ON THE STREAM HOST in the description above.
2430
2769
  security: [{}, {bearerAuth: []}, {sessionAuth: []}] # optional (anon-OK; identity-scoped to workflow owner)
2431
2770
  x-identity-scoped: true # workflow-ownership-scoped per ADR-0016 D3
2432
2771
  tags:
@@ -5594,7 +5933,13 @@ paths:
5594
5933
  $ref: '#/components/schemas/AccountLimitsSuccessEnvelope'
5595
5934
  examples:
5596
5935
  free_tier_defaults:
5597
- summary: Free tier, no overrides (effective == tier_default)
5936
+ summary: >-
5937
+ Free tier, no overrides (effective == tier_default) — SAMPLE
5938
+ VALUES ARE ILLUSTRATIVE AND NOT A LIMITS SOURCE. The field is
5939
+ named tier_default, which makes a stale figure here read as
5940
+ authoritative; the numbers are not maintained against the
5941
+ API's tier enum. The response itself is the source, per
5942
+ caller.
5598
5943
  value:
5599
5944
  success: true
5600
5945
  data:
@@ -5609,7 +5954,11 @@ paths:
5609
5954
  tier_default: 1073741824
5610
5955
  overridden: false
5611
5956
  enterprise_with_upload_override:
5612
- summary: Enterprise tier with a raised per-account upload override
5957
+ summary: >-
5958
+ Enterprise tier with a raised per-account upload override —
5959
+ SAMPLE VALUES ARE ILLUSTRATIVE AND NOT A LIMITS SOURCE. It
5960
+ demonstrates the override SHAPE (effective diverging from
5961
+ tier_default), not the current figures.
5613
5962
  value:
5614
5963
  success: true
5615
5964
  data:
@@ -5699,7 +6048,7 @@ paths:
5699
6048
  type: subscription
5700
6049
  key: pro
5701
6050
  credit_pack:
5702
- summary: Buy a 25-credit pack
6051
+ summary: Buy the £25 credit pack
5703
6052
  value:
5704
6053
  type: pack
5705
6054
  key: pack_25
@@ -7118,6 +7467,17 @@ components:
7118
7467
  - `type: subscription` → `key` ∈ { `pro`, `max` }
7119
7468
  - `type: pack` → `key` ∈ { `pack_10`, `pack_25`, `pack_50` }
7120
7469
 
7470
+ ⚠️ **The number in a pack SKU is the PRICE IN POUNDS, not a credit
7471
+ count** — `pack_25` is the £25 pack, and the credits it grants are a
7472
+ different number entirely, roughly two orders of magnitude larger.
7473
+ **How many** is server-side (api's versioned Stripe catalog) and is
7474
+ deliberately not restated here, because a credit grant that lives in
7475
+ two places drifts — and the copy a customer reads before paying is the
7476
+ one that must not be stale. Clients that need to show it read it from
7477
+ the server; they never infer it from the SKU. *An example on this very
7478
+ endpoint read the SKU as a quantity until 2026-08-12, so the axis is
7479
+ named here rather than assumed obvious.*
7480
+
7121
7481
  The `type` ↔ `key` pairing is validated **server-side**, not by this
7122
7482
  schema (the `key` enum lists all values across both types). A
7123
7483
  mismatched or unprovisioned pair returns `422` `UNPROCESSABLE_ENTITY`;
@@ -7220,15 +7580,23 @@ components:
7220
7580
  (`UserTier.maxFileSizeBytes` — the request-level tier quota the
7221
7581
  upload endpoints enforce). **Distinct** from the per-operation
7222
7582
  processing ceiling `max_input_size_bytes` in operation schemas
7223
- (different axis AND number). Tier defaults: free 10 MiB, pro 5 GiB,
7224
- enterprise 100 GiB.
7583
+ (different axis AND number).
7584
+ ⚠️ **The per-tier byte defaults are deliberately NOT restated here.**
7585
+ This line used to list them for `free` / `pro` / `enterprise` and
7586
+ **silently omitted `max`** — a tier the `UserTier` enum declares. The
7587
+ response itself carries the answer per caller (`tier_default` beside
7588
+ `effective`), which is override-aware in a way a static table can
7589
+ never be.
7225
7590
  - `max_total_input_size_bytes`: the effective merge combined-input
7226
7591
  size cap (the summed-inputs ceiling). Same key as the
7227
7592
  operation-schema merge band; the band is processing-class +
7228
- tier dependent (`short_form_concat` baseline 1 GiB; the
7229
- `long_form_re_encode` band where the tier permits it — Pro 5 GB,
7230
- Enterprise 120 GB). The server resolves the effective value for
7231
- the caller.
7593
+ tier dependent. **The server resolves the effective value for the
7594
+ caller** and returns it here — that is the point of this endpoint.
7595
+ ⚠️ **A THIRD restated per-tier table lived on this line** (it named
7596
+ two tiers' band ceilings and, like the other two, omitted `max`). The
7597
+ machine-readable source is `per_tier_constraints` on the operation
7598
+ schema's `processing_class`; it is generated, so it cannot drift from
7599
+ the schemas the way a sentence here does.
7232
7600
  required:
7233
7601
  - tier
7234
7602
  - limits
@@ -7256,133 +7624,6 @@ components:
7256
7624
  # AccountLimitEntry.
7257
7625
  $ref: '#/components/schemas/AccountLimitEntry'
7258
7626
 
7259
- MediaCategory:
7260
- type: string
7261
- enum: [image, video, audio, document]
7262
- description: |
7263
- Coarse input media family, as used by the tier-default surface.
7264
- **Not** a MIME type and **not** an operation `mime_group` — those are
7265
- finer-grained and live in the operation schemas. This vocabulary
7266
- exists so a client can filter a file picker without enumerating MIMEs.
7267
-
7268
- TierDefaults:
7269
- type: object
7270
- additionalProperties: false
7271
- description: |
7272
- The **published default limits**, readable by an ANONYMOUS caller.
7273
-
7274
- **Why this exists separately from `GET /api/v2/account/limits`:** that
7275
- endpoint is per-account and override-aware, so it requires auth and
7276
- returns `401` to an anonymous caller — **correctly**, because
7277
- `effective` / `tier_default` / `overridden` is meaningless without an
7278
- account. What a logged-out visitor needs is the **tier defaults**,
7279
- which are not per-account. This publishes AS DATA what the `UserTier`
7280
- description already publishes as prose.
7281
-
7282
- **The server is authoritative for the values.** This contract declares
7283
- the SHAPE; the numbers are computed per environment and per tier
7284
- model, and a client MUST read them here rather than hard-coding a
7285
- table (the drift this field exists to end).
7286
- required:
7287
- - media_categories
7288
- - by_audience
7289
- properties:
7290
- media_categories:
7291
- type: array
7292
- minItems: 1
7293
- uniqueItems: true
7294
- items:
7295
- $ref: '#/components/schemas/MediaCategory'
7296
- description: |
7297
- The input media families available **to every audience,
7298
- including anonymous**. Declared ONCE, not per-tier, because it
7299
- does not vary — hub decision 25 made audio universal, and there
7300
- is now no tier boundary at which the category axis changes.
7301
-
7302
- ⚠️ **Deliberately NOT a per-audience allow-list.** A structure
7303
- with one row per tier, every row identical, is a gate whose every
7304
- row is open — it reads as an entitlement mechanism while
7305
- encoding no entitlement, and the next reader maintains it as
7306
- though it did. If a future tier DOES restrict categories, this
7307
- field moves into `by_audience` in a deliberate change, and that
7308
- change is where the restriction gets argued.
7309
- by_audience:
7310
- type: object
7311
- additionalProperties: false
7312
- description: |
7313
- The limits that genuinely DO vary, keyed by audience. Contains
7314
- only axes with real variance; an axis that is uniform belongs
7315
- beside `media_categories`, not here.
7316
-
7317
- **`anonymous` is a key here but deliberately NOT a `UserTier`
7318
- value.** `UserTier` is a subscription tier and anonymous is the
7319
- ABSENCE of one — putting it in that enum would place a
7320
- non-subscription value inside the ordering that drives upgrade
7321
- prompts (`free < pro < max < enterprise`), where it has no
7322
- position.
7323
- ⚠️ **And keeping them distinct is not pedantry — the conflation
7324
- has already shipped once.** This endpoint's `user_tier`
7325
- description used to say anonymous callers "receive the `free`
7326
- tier baseline view", which became false the moment the two were
7327
- allowed to differ. **A vocabulary that cannot express the
7328
- difference invites prose asserting they are the same.**
7329
- required:
7330
- - anonymous
7331
- - free
7332
- - pro
7333
- - max
7334
- - enterprise
7335
- properties:
7336
- anonymous:
7337
- $ref: '#/components/schemas/TierDefaultLimits'
7338
- free:
7339
- $ref: '#/components/schemas/TierDefaultLimits'
7340
- pro:
7341
- $ref: '#/components/schemas/TierDefaultLimits'
7342
- max:
7343
- $ref: '#/components/schemas/TierDefaultLimits'
7344
- enterprise:
7345
- $ref: '#/components/schemas/TierDefaultLimits'
7346
-
7347
- TierDefaultLimits:
7348
- type: object
7349
- additionalProperties: false
7350
- description: |
7351
- One audience's default limits. **Defaults, not entitlements** — a
7352
- specific account may carry an override, which only
7353
- `GET /api/v2/account/limits` can report.
7354
- required:
7355
- - max_upload_size_bytes
7356
- - max_duration_seconds
7357
- properties:
7358
- max_upload_size_bytes:
7359
- type: integer
7360
- format: int64
7361
- minimum: 1
7362
- description: |
7363
- Per-FILE upload cap. Same axis as
7364
- `AccountLimits.limits.max_upload_size_bytes`.
7365
-
7366
- ⚠️ **A client MUST NOT treat this as the only size bound.** The
7367
- per-operation processing ceilings (`max_input_size_bytes` in the
7368
- operation schemas) are a **different axis and a different
7369
- number**, and can be SMALLER than this cap — an upload that
7370
- succeeds may still be rejected at operation time. A picker that
7371
- shows one number without the other will let a user pick a file
7372
- the product cannot process.
7373
- max_duration_seconds:
7374
- type: [integer, "null"]
7375
- minimum: 0
7376
- description: |
7377
- Per-upload duration cap for time-based media. `null` where the
7378
- audience has no duration cap.
7379
-
7380
- ⚠️ **DISTINCT from `processing_class.short_form.max_input_duration`
7381
- (`PT5M`) in the operation schemas, which it may numerically
7382
- equal.** That is the short-form/long-form PROCESSING boundary and
7383
- applies to every audience; this is an entitlement. Two concepts,
7384
- one integer — read this one for entitlement.
7385
-
7386
7627
  AccountLimitEntry:
7387
7628
  type: object
7388
7629
  additionalProperties: false
@@ -8255,48 +8496,138 @@ components:
8255
8496
  Subscription tier. Mirrors the API-side
8256
8497
  `App\Identity\Domain\Enums\UserTier` PHP enum.
8257
8498
 
8258
- Ordering is `free` < `pro` < `max` < `enterprise` (the
8499
+ 🔴 **`basic` IS THE BASE TIER. `free` IS DEPRECATED IN PLACE AND
8500
+ WILL BE REMOVED** (ticket [`nD8fCPDy`](https://trello.com/c/nD8fCPDy)).
8501
+ Owner decision 2026-08-19: **you can buy credits into the base tier, so
8502
+ calling it "free" is false.** Both values are accepted through the
8503
+ transition and **occupy the same ordinal position** — they are one tier
8504
+ under two names, never two tiers.
8505
+
8506
+ ⚠️ **A CONSUMER MUST TREAT THEM AS EQUAL.** Anything that compares,
8507
+ sorts or gates on tier must accept either and rank them identically;
8508
+ a `match`/`switch` that handles `free` and not `basic` will silently
8509
+ take a different branch the day the producer switches.
8510
+
8511
+ 🔴 **PRODUCERS: DO NOT EMIT `basic` YET. THE FIRST WRITE IS AN
8512
+ OUTAGE, NOT A COMPILE ERROR.** This change makes the value *legal*, not
8513
+ *live*. **Schema-additive and safe-to-send are different claims**, and
8514
+ the gap between them is measured rather than theoretical:
8515
+
8516
+ - **api (2026-08-20, from its own mapping):** `UserRecord` declares the
8517
+ column `enumType: UserTier::class`. Doctrine hydrates such a column
8518
+ through `EnumPropertyAccessor::setValue()`, which calls
8519
+ `$enumType::from($value)` — **and that THROWS on a value it does not
8520
+ know**, with no extension point. **A row persisted as `basic` makes
8521
+ every running api task 500 while hydrating that user.**
8522
+ - **And the rollout overlaps by design:** ECS runs
8523
+ `minimumHealthyPercent: 100` / `maximumPercent: 200`, so the NEW task
8524
+ starts before the OLD one drains. **The moment a new task writes a
8525
+ value the old one has never heard of, the old task 500s on that row
8526
+ for the rest of the rollout.**
8527
+ - **SDKs fail earlier and more kindly:** a generated Rust or PHP enum
8528
+ gains a variant and an exhaustive match stops compiling.
8529
+
8530
+ ⭐ **AN ADDED ENUM VALUE IS A CONTRACT CHANGE WEARING A SCHEMA CHANGE'S
8531
+ CLOTHES.** A new COLUMN is invisible to old code's `SELECT` list; a new
8532
+ enum VALUE is **not** invisible to old code's hydration. *That asymmetry
8533
+ is why expand → migrate → contract fails to get applied to enums — the
8534
+ trigger does not look like the category.* (api's own note, written
8535
+ during an earlier enum sweep and reached independently of this one.)
8536
+ Emission is gated on the tolerance evidence table
8537
+ ([`tkRA9Bim`](https://trello.com/c/tkRA9Bim)), which requires an
8538
+ artefact from each of api, both SDK packages, frontend and e2e.
8539
+
8540
+ 🔴 **`guest` IS NOT AND MUST NOT BECOME A MEMBER OF THIS ENUM.** It is
8541
+ the *absence* of a subscription, not a tier. Putting it here places a
8542
+ non-subscription value inside the ordering that drives upgrade prompts,
8543
+ where it has no position — **that conflation already shipped once as a
8544
+ bug and was deliberately removed.** The audience key lives on
8545
+ the audience axis, which is NOT a `UserTier` value. Asserted by a
8546
+ test, not left to prose.
8547
+
8548
+ Ordering is `basic`/`free` < `pro` < `max` < `enterprise` (the
8259
8549
  upgrade-resolver / `isHigherThan` ordinal in `UserTier.php`).
8260
- `max` is the top **self-serve** tier — Pro plus audio + larger
8261
- long-form bands; Enterprise remains the negotiated tier above it.
8262
-
8263
- Tier capability summary (informational; canonical limits are
8264
- enforced server-side per `UserTier.php`):
8265
- - `free`: 10 MiB max upload; image MIMEs only; 50 monthly credits;
8266
- 0 overdraft; 1× rate-limit baseline. No long-form access
8267
- (video/audio are MIME-gated away from Free).
8268
- - `pro`: 5 GiB max upload; image + video + document MIMEs; 1000
8269
- monthly credits; 200 overdraft; 5× rate-limit; up to 2 concurrent
8270
- in-flight long-form jobs.
8271
- - `max`: 50 GiB max upload; image + video + document + audio MIMEs;
8272
- 7500 monthly credits; 2500 overdraft; 15× rate-limit; up to 5
8273
- concurrent in-flight long-form jobs.
8274
- - `enterprise`: 100 GiB max upload; image + video + document + audio
8275
- MIMEs; 10000 monthly credits; 5000 overdraft; 20× rate-limit;
8276
- uncapped concurrent long-form jobs.
8277
-
8278
- **Concurrent long-form jobs** is a hard per-tier ceiling on the
8279
- number of in-flight long-form (Fargate) workflows a caller may
8280
- hold at once — exceeding it returns a typed `429`
8550
+ **The ordering is the part this contract owns** — it is what
8551
+ `TierRestrictionResponse.current_tier` / `.required_tier` and
8552
+ `FeatureViolation.required_tier` are compared with.
8553
+
8554
+ 🔴 **THIS SCHEMA DELIBERATELY DOES NOT ENUMERATE WHAT EACH TIER MAY
8555
+ DO, IN EITHER DIRECTION.** It previously carried a per-tier capability
8556
+ summary — upload caps, permitted MIME families, monthly credits,
8557
+ overdraft, rate-limit multiples, concurrent long-form jobs. **That was a
8558
+ restated SNAPSHOT of another repository's code, and it drifted, twice:**
8559
+
8560
+ - it asserted *"`free`: image MIMEs only … video/audio are MIME-gated
8561
+ away from Free"* — a per-tier media restriction this contract does not
8562
+ own and cannot keep true;
8563
+ - and the parallel table on `AccountLimits` listed tier byte defaults
8564
+ for `free` / `pro` / `enterprise` and **silently omitted `max`**, a
8565
+ tier this very enum declares. **That one was already wrong before any
8566
+ of it was reviewed.**
8567
+
8568
+ **A description ships to every SDK consumer as generated documentation**,
8569
+ so a stale sentence here is not an internal note — it is an assertion
8570
+ delivered to callers, and it outlives the code it describes. *Point at
8571
+ the gate, not at a snapshot of it.*
8572
+
8573
+ ⚠️ **No claim is made HERE about which media categories a tier permits —
8574
+ not the old restriction, and not its replacement.** That is a scoping
8575
+ statement about this description, **not a claim that the contract is
8576
+ silent on the subject**: hub decision 25 made audio universal, so
8577
+ there is no tier boundary at which the category axis changes. The
8578
+ category axis as DATA, once, uniform across audiences. **Prose that
8579
+ restates another repository's enforcement is the defect; a single
8580
+ generated declaration is the fix**, and the two must not both exist.
8581
+
8582
+ **Where the answers actually live — and they are DIFFERENT SURFACES,
8583
+ which is why naming just one was wrong:**
8584
+
8585
+ - **Which media categories are available** — the capability
8586
+ endpoint's `operations` map, per operation and mime_group
8587
+ block. Declared **once, not per audience**, because the axis does not
8588
+ vary. ⚠️ **`GET /api/v2/account/limits` cannot answer this**: it
8589
+ carries numeric limit entries only and exposes no MIME entitlement
8590
+ data at all.
8591
+ - **A caller's own numeric limits** — override-aware, and the only
8592
+ source reflecting account-level overrides:
8593
+ `GET /api/v2/account/limits` (`AccountLimits`). Its `limits` map is
8594
+ typed-open, so new limit keys arrive additively.
8595
+ - **Enforcement of record**: the API's `UserTier` enum. A `403`
8596
+ `tier_restriction` carries `TierRestrictionKind` — `mime_type` or
8597
+ `file_size` — naming which quota refused the request.
8598
+ - **Per-operation processing ceilings** (a different axis and a
8599
+ different number from the per-file upload cap):
8600
+ `processing_class.constraints` and `per_tier_constraints` in the
8601
+ operation schemas.
8602
+
8603
+ **Concurrent long-form jobs** remain a hard per-tier ceiling enforced
8604
+ server-side; exceeding it returns a typed `429`
8281
8605
  `LONG_FORM_CONCURRENCY_LIMIT_EXCEEDED` (see the `POST /api/workflows`
8282
- 429 response). Pro's 2-job cap is enforced as of the Max-tier
8283
- launch.
8284
-
8285
- The "max upload" figures are the per-file upload cap
8286
- (`UserTier.maxFileSizeBytes`) — the request-level tier quota,
8287
- surfaced override-aware via `GET /api/v2/account/limits`
8288
- (`max_upload_size_bytes`). They are DISTINCT from the per-operation
8289
- processing-class band caps (`processing_class.constraints` in the
8290
- operation schemas; e.g. the 120 GB Enterprise merge combined band).
8291
-
8292
- Used by `TierRestrictionResponse.current_tier` /
8293
- `TierRestrictionResponse.required_tier` and by
8294
- `FeatureViolation.required_tier`.
8606
+ 429 response). **The per-tier numbers are deliberately not restated
8607
+ here** — read them from the source above.
8608
+
8295
8609
  enum:
8610
+ - basic
8296
8611
  - free
8297
8612
  - pro
8298
8613
  - max
8299
8614
  - enterprise
8615
+ # 🔴 MACHINE-READABLE, BECAUSE THE PROSE ABOVE IS NOT CHECKABLE.
8616
+ # OpenAPI has no per-member enum metadata, so a deprecation stated only
8617
+ # in `description` is a judgement call at removal time — and this repo
8618
+ # has now watched prose fail to prevent the same conflation twice.
8619
+ # Requested by `compression_api` so that removing `free` is a check
8620
+ # rather than an opinion.
8621
+ x-enum-deprecated:
8622
+ free:
8623
+ superseded_by: basic
8624
+ # Owner decision 2026-08-19: you can buy credits into the base tier,
8625
+ # so "free" is false. Same ordinal — one tier under two names.
8626
+ removal_ticket: nD8fCPDy
8627
+ # ⚠️ NOT A DATE. Removal is gated on every consumer having stopped
8628
+ # EMITTING and REQUIRING the value, which is evidence rather than a
8629
+ # calendar. A date here would be overtaken and then cited.
8630
+ removal_gate: "consumer evidence table on nD8fCPDy"
8300
8631
 
8301
8632
  TierRestrictionKind:
8302
8633
  type: string
@@ -8305,10 +8636,24 @@ components:
8305
8636
  workflow-create endpoints. Mirrors the API-side
8306
8637
  `App\Identity\Domain\Enums\RestrictionKind` PHP enum.
8307
8638
 
8308
- - `mime_type`: caller's tier does not permit this MIME type
8309
- (e.g. free tier uploading a video).
8310
- - `file_size`: file exceeds caller's tier file-size cap
8311
- (e.g. pro tier uploading a 1 GB file).
8639
+ - `mime_type`: the caller's tier does not permit this MIME type.
8640
+ - `file_size`: the file exceeds the caller's tier file-size cap.
8641
+
8642
+ ⚠️ **Deliberately no worked example naming a tier and a media type.**
8643
+ Both bullets previously carried one, and an illustration of the form
8644
+ *"free tier uploading a video"* is a per-tier capability claim wearing an
8645
+ example's clothes — it reaches generated documentation exactly as an
8646
+ assertion would. **Which pairs are refused is api's to enforce**, not
8647
+ this schema's to illustrate.
8648
+
8649
+ ⚠️ **The two kinds resolve against DIFFERENT surfaces**, and an earlier
8650
+ version of this note named only the numeric one:
8651
+ - `mime_type` → the capability endpoint's `operations` map, which
8652
+ declares accepted MIMEs per operation. `GET /api/v2/account/limits`
8653
+ **cannot** answer a media question — it carries numeric limit entries
8654
+ and exposes no MIME entitlement data.
8655
+ - `file_size` → `GET /api/v2/account/limits` (`AccountLimits`), which is
8656
+ override-aware per caller.
8312
8657
  enum:
8313
8658
  - mime_type
8314
8659
  - file_size
@@ -13483,9 +13828,27 @@ components:
13483
13828
  description: |
13484
13829
  Monotonically-increasing capability matrix version. Bumps
13485
13830
  independently of `schema_version` whenever the underlying
13486
- availability matrix changes (Lambda capability flips, tier
13487
- policy updates, V2-planned op promotions). Used as part of the
13488
- cache key. Per ADR-0002.
13831
+ **availability matrix** changes — Lambda capability flips,
13832
+ V2-planned op promotions, an operation or mime_group changing
13833
+ its `availability` value. Used as part of the cache key.
13834
+ Per ADR-0002.
13835
+
13836
+ 🔴 **NEITHER VERSION IS AN ENVIRONMENT-EQUALITY PROXY, AND
13837
+ THAT IS MEASURED RATHER THAN THEORETICAL.** On 2026-08-20
13838
+ staging and production both served `schema_version 2.195.0`
13839
+ and `capabilities_version 182` **while enforcing different
13840
+ free-tier upload caps** (measured by `compression_e2e`:
13841
+ prod `10485760`, staging `157286400`). ⇒ **Two hosts
13842
+ reporting identical versions can behave differently**, and
13843
+ `capabilities_version` is an easy proxy to reach for.
13844
+
13845
+ ⚠️ **It bumps on AVAILABILITY, not on LIMITS.** A tier's caps,
13846
+ quotas and entitlements can change with no bump here, because
13847
+ they are not the availability matrix — *the gate is
13848
+ implementation, not contract.* The earlier wording said
13849
+ "tier policy updates", which reads as covering a cap change
13850
+ and does not. **Read a caller's own numbers from
13851
+ `GET /api/account/limits`, never from a version number.**
13489
13852
  example: 47
13490
13853
  generated_at:
13491
13854
  description: |
@@ -13519,11 +13882,6 @@ components:
13519
13882
  - type: string
13520
13883
  - type: 'null'
13521
13884
  example: "production"
13522
- tier_defaults:
13523
- # Anonymous-readable. Declared here rather than on
13524
- # /api/v2/account/limits because that surface is per-account and
13525
- # override-aware, so it 401s an anonymous caller — correctly.
13526
- $ref: '#/components/schemas/TierDefaults'
13527
13885
  user_tier:
13528
13886
  description: |
13529
13887
  Tier of the calling user. Anonymous (unauthenticated) callers
@@ -13536,8 +13894,17 @@ components:
13536
13894
  free limits were allowed to differ (hub decisions 22 + 25 —
13537
13895
  anonymous carries a shorter duration entitlement than a
13538
13896
  signed-in free user). **Anonymous is the ABSENCE of a tier, not
13539
- the lowest one.** Read `tier_defaults.by_audience.anonymous`
13540
- for what an unauthenticated caller may actually do.
13897
+ the lowest one.**
13898
+
13899
+ ⚠️ **AND THERE IS NOW NO DECLARED SURFACE CARRYING AN ANONYMOUS
13900
+ LIMITS ROW.** `tier_defaults.by_audience` used to hold one and was
13901
+ RETRACTED (`233A3CbV`, 2026-08-20) — it encoded per-audience SIZE
13902
+ limits, which the committed pricing model abolishes in favour of
13903
+ technical ceilings identical for everyone. It was never served, so
13904
+ nothing lost a value it had been reading. **Hub decision 27 required
13905
+ the anonymous/free distinction to be expressible; it is not
13906
+ expressible today, deliberately, and re-expressing it belongs to
13907
+ the pricing programme's tier-entitlement work.**
13541
13908
  oneOf:
13542
13909
  - $ref: '#/components/schemas/UserTier'
13543
13910
  - type: 'null'
@@ -13970,11 +14337,16 @@ components:
13970
14337
  EndpointProjection:
13971
14338
  type: object
13972
14339
  description: |
13973
- Per-endpoint projection entry per ADR-0016 §D4. Five fields;
13974
- `required_tier` and `availability` at endpoint level are
13975
- reserved/null today (operation-level `required_tier` continues
13976
- to flow via `operations.*.required_tier`; every shipped
13977
- endpoint is currently `availability: stable`).
14340
+ Per-endpoint projection entry per ADR-0016 §D4. Five required
14341
+ fields plus an OPTIONAL `servers`; `required_tier` at endpoint
14342
+ level is reserved/null today (operation-level `required_tier`
14343
+ continues to flow via `operations.*.required_tier`).
14344
+
14345
+ ⚠️ **`availability` is DERIVED from the operation's
14346
+ `x-availability` and is no longer always `stable`** — an
14347
+ earlier version of this description said every shipped endpoint
14348
+ was `stable`, which was true only because the generator
14349
+ hardcoded it.
13978
14350
  required:
13979
14351
  - auth
13980
14352
  - identity_scoped
@@ -13982,6 +14354,54 @@ components:
13982
14354
  - availability
13983
14355
  - operation_id
13984
14356
  properties:
14357
+ servers:
14358
+ type: array
14359
+ minItems: 1
14360
+ description: |
14361
+ OPTIONAL. Present **only** when the operation overrides the
14362
+ root host — today, the SSE stream endpoint alone.
14363
+
14364
+ **Absence means "inherits the root `servers`" and is not a
14365
+ gap.** Emitting a copy of the root on every entry would put
14366
+ one value on 43 rows, which conveys nothing and would invite
14367
+ a consumer to read this projection as the routing source of
14368
+ record for endpoints that have no override.
14369
+
14370
+ ⚠️ **This field exists because the declaration was
14371
+ unreachable without it.** The routing split is declared on
14372
+ the operation in `openapi/api.yaml`, but SDK consumers read
14373
+ this sidecar rather than parsing the spec at runtime — so a
14374
+ host declared only in the spec was in the same position as
14375
+ the convention it replaced.
14376
+ items:
14377
+ type: object
14378
+ additionalProperties: false
14379
+ required: [url, replaces]
14380
+ properties:
14381
+ url:
14382
+ type: string
14383
+ format: uri
14384
+ description: The host serving this operation.
14385
+ replaces:
14386
+ type: string
14387
+ minLength: 1
14388
+ description: |
14389
+ **The ROOT server URL this entry overrides.** A client
14390
+ matches its own configured base against this exactly
14391
+ and takes `url`.
14392
+
14393
+ ⚠️ **Without it the mapping has to be inferred** from
14394
+ list ordering or hostname shape — which is a
14395
+ per-client rule, and therefore the precise thing that
14396
+ declaring the split was meant to remove. An
14397
+ unmatched base is an honest *"no override for the host
14398
+ you are pointed at"* rather than a guess.
14399
+ description:
14400
+ type: string
14401
+ description: |
14402
+ Verbatim from the operation's server entry. Carries
14403
+ the caveats a URL cannot — CORS scope, whether the
14404
+ entry exercises the split-host topology at all.
13985
14405
  auth:
13986
14406
  type: string
13987
14407
  enum: [anonymous, optional, required]
@@ -14019,9 +14439,17 @@ components:
14019
14439
  type: string
14020
14440
  enum: [stable, beta, experimental, planned, deprecated]
14021
14441
  description: |
14022
- Endpoint-level availability tag. Currently always
14023
- `"stable"` for shipped endpoints. Reserved for future
14024
- `planned` / `deprecated` endpoint-level annotation.
14442
+ Endpoint-level availability, **DERIVED from the operation's
14443
+ `x-availability`** and defaulting to `stable` when the
14444
+ operation declares none.
14445
+
14446
+ ⚠️ **It is NOT always `stable`.** This description used to
14447
+ say it was, and the sidecar agreed with it — because the
14448
+ generator HARDCODED the value. Four endpoints read `planned`
14449
+ today, three of which (`probeUpload`,
14450
+ `createExternalImport`, `decodeAudioWatermark`) had declared
14451
+ `planned` in the spec all along and were silently
14452
+ contradicted.
14025
14453
  operation_id:
14026
14454
  type: string
14027
14455
  description: |