@transcodely/sdk 0.2.0 → 0.3.1

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.
package/dist/index.d.ts CHANGED
@@ -451,6 +451,12 @@ declare class APIKey extends Message<APIKey> {
451
451
  * @generated from field: string id = 1;
452
452
  */
453
453
  id: string;
454
+ /**
455
+ * Parent app this key authenticates. Server-set; ignored on requests.
456
+ *
457
+ * @generated from field: string app_id = 13;
458
+ */
459
+ appId: string;
454
460
  /**
455
461
  * Human-readable name for the key.
456
462
  *
@@ -652,6 +658,15 @@ declare class ListAPIKeysRequest extends Message<ListAPIKeysRequest> {
652
658
  * @generated from field: transcodely.v1.PaginationRequest pagination = 3;
653
659
  */
654
660
  pagination?: PaginationRequest;
661
+ /**
662
+ * Optional app filter. API-key callers may omit it (their key's app is used)
663
+ * or pass their own app; a different app is rejected with PermissionDenied.
664
+ * Portal/JWT callers pass it to list a specific app in their org; omitted
665
+ * returns keys across all apps in the org.
666
+ *
667
+ * @generated from field: optional string app_id = 4;
668
+ */
669
+ appId?: string;
655
670
  constructor(data?: PartialMessage<ListAPIKeysRequest>);
656
671
  static readonly runtime: typeof proto3;
657
672
  static readonly typeName = "transcodely.v1.ListAPIKeysRequest";
@@ -885,6 +900,15 @@ interface Service {
885
900
  }
886
901
  interface TransportConfig {
887
902
  apiKey: string;
903
+ /**
904
+ * Organization every request is made against, sent as `X-Organization-ID`.
905
+ *
906
+ * API-key callers never need this — a key is already scoped to one app, and
907
+ * therefore to one organization. It is required for the org-scoped surfaces a
908
+ * dashboard session token reaches, `client.billing` among them, which answer
909
+ * 400 invalid_argument without it.
910
+ */
911
+ organizationId?: string;
888
912
  baseUrl?: string;
889
913
  timeoutMs?: number;
890
914
  maxRetries?: number;
@@ -920,6 +944,7 @@ interface CallOptions {
920
944
  declare class Transport {
921
945
  readonly baseUrl: string;
922
946
  readonly apiKey: string;
947
+ readonly organizationId: string | undefined;
923
948
  readonly timeoutMs: number;
924
949
  readonly maxRetries: number;
925
950
  readonly apiVersion: string;
@@ -982,11 +1007,20 @@ declare enum AppStatus {
982
1007
  *
983
1008
  * @generated from enum value: APP_STATUS_ARCHIVED = 2;
984
1009
  */
985
- ARCHIVED = 2
1010
+ ARCHIVED = 2,
1011
+ /**
1012
+ * Cut off by platform admin action. API keys scoped to the app are rejected
1013
+ * with 403 until it is set back to active. Unlike archived, this is
1014
+ * reversible and preserves all of the app's resources.
1015
+ *
1016
+ * @generated from enum value: APP_STATUS_SUSPENDED = 3;
1017
+ */
1018
+ SUSPENDED = 3
986
1019
  }
987
1020
  /**
988
1021
  * An app is a project within an organization.
989
- * Each app has its own API keys, jobs, origins, and webhook configuration.
1022
+ * Each app has its own API keys, jobs, and origins. Webhook endpoints are
1023
+ * managed via WebhookService (webhook.proto).
990
1024
  *
991
1025
  * @generated from message transcodely.v1.App
992
1026
  */
@@ -1016,17 +1050,6 @@ declare class App extends Message<App> {
1016
1050
  * @generated from field: optional string description = 4;
1017
1051
  */
1018
1052
  description?: string;
1019
- /**
1020
- * Webhook configuration.
1021
- * Deprecated: Use WebhookService (webhook.proto) to manage webhook endpoints
1022
- * instead. The new WebhookEndpoint resource supports multiple endpoints per
1023
- * app, HMAC-SHA-256 signing with secret rotation, and per-event type
1024
- * subscriptions. This field is retained for backwards compatibility;
1025
- * field number 5 must never be reused.
1026
- *
1027
- * @generated from field: optional transcodely.v1.WebhookConfig webhook = 5;
1028
- */
1029
- webhook?: WebhookConfig;
1030
1053
  /**
1031
1054
  * App status.
1032
1055
  *
@@ -1083,6 +1106,18 @@ declare class App extends Message<App> {
1083
1106
  * @generated from field: string object = 14;
1084
1107
  */
1085
1108
  object: string;
1109
+ /**
1110
+ * Monthly spend limit in EUR for transcoding charges. Unset = unlimited (the
1111
+ * default). Once the app's spend for the current period reaches this limit,
1112
+ * new jobs are rejected with `limit_exceeded`; in-flight jobs are never
1113
+ * stopped. A warning webhook (`app.spend_limit_warning`) fires once at 80% of
1114
+ * the limit and `app.spend_limit_exceeded` fires once on breach. The period
1115
+ * follows the app's billing anchor day in UTC. Set or clear via
1116
+ * AppService.UpdateSpendLimit; read current spend via AppService.GetSpend.
1117
+ *
1118
+ * @generated from field: optional double monthly_spend_limit_eur = 15;
1119
+ */
1120
+ monthlySpendLimitEur?: number;
1086
1121
  constructor(data?: PartialMessage<App>);
1087
1122
  static readonly runtime: typeof proto3;
1088
1123
  static readonly typeName = "transcodely.v1.App";
@@ -1092,49 +1127,6 @@ declare class App extends Message<App> {
1092
1127
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): App;
1093
1128
  static equals(a: App | PlainMessage<App> | undefined, b: App | PlainMessage<App> | undefined): boolean;
1094
1129
  }
1095
- /**
1096
- * Webhook configuration for an app.
1097
- *
1098
- * @generated from message transcodely.v1.WebhookConfig
1099
- */
1100
- declare class WebhookConfig extends Message<WebhookConfig> {
1101
- /**
1102
- * HTTPS endpoint for receiving webhooks.
1103
- *
1104
- * @generated from field: string url = 1;
1105
- */
1106
- url: string;
1107
- /**
1108
- * Secret for HMAC-SHA256 signature verification.
1109
- * Only the last 4 characters are shown (hint).
1110
- * Full secret is only returned when first configured.
1111
- *
1112
- * @generated from field: optional string secret_hint = 2;
1113
- */
1114
- secretHint?: string;
1115
- /**
1116
- * Whether a secret is configured.
1117
- *
1118
- * @generated from field: bool has_secret = 3;
1119
- */
1120
- hasSecret: boolean;
1121
- /**
1122
- * Events to send.
1123
- * Possible values: job.completed, job.failed, job.progress, job.canceled,
1124
- * output.completed, output.failed
1125
- *
1126
- * @generated from field: repeated string events = 4;
1127
- */
1128
- events: string[];
1129
- constructor(data?: PartialMessage<WebhookConfig>);
1130
- static readonly runtime: typeof proto3;
1131
- static readonly typeName = "transcodely.v1.WebhookConfig";
1132
- static readonly fields: FieldList;
1133
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): WebhookConfig;
1134
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): WebhookConfig;
1135
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WebhookConfig;
1136
- static equals(a: WebhookConfig | PlainMessage<WebhookConfig> | undefined, b: WebhookConfig | PlainMessage<WebhookConfig> | undefined): boolean;
1137
- }
1138
1130
  /**
1139
1131
  * Request to create a new app.
1140
1132
  *
@@ -1159,12 +1151,6 @@ declare class CreateAppRequest extends Message<CreateAppRequest> {
1159
1151
  * @generated from field: optional string description = 3;
1160
1152
  */
1161
1153
  description?: string;
1162
- /**
1163
- * Optional webhook configuration.
1164
- *
1165
- * @generated from field: optional transcodely.v1.CreateWebhookConfig webhook = 4;
1166
- */
1167
- webhook?: CreateWebhookConfig;
1168
1154
  /**
1169
1155
  * Enable video hosting for this app. Provisions CDN infrastructure.
1170
1156
  * This cannot be disabled once enabled.
@@ -1181,41 +1167,6 @@ declare class CreateAppRequest extends Message<CreateAppRequest> {
1181
1167
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateAppRequest;
1182
1168
  static equals(a: CreateAppRequest | PlainMessage<CreateAppRequest> | undefined, b: CreateAppRequest | PlainMessage<CreateAppRequest> | undefined): boolean;
1183
1169
  }
1184
- /**
1185
- * Webhook configuration for app creation.
1186
- *
1187
- * @generated from message transcodely.v1.CreateWebhookConfig
1188
- */
1189
- declare class CreateWebhookConfig extends Message<CreateWebhookConfig> {
1190
- /**
1191
- * HTTPS endpoint for receiving webhooks.
1192
- *
1193
- * @generated from field: string url = 1;
1194
- */
1195
- url: string;
1196
- /**
1197
- * If true, a webhook secret will be generated.
1198
- * The secret is returned once in the response.
1199
- *
1200
- * @generated from field: bool generate_secret = 2;
1201
- */
1202
- generateSecret: boolean;
1203
- /**
1204
- * Events to send.
1205
- * Default: ["job.completed", "job.failed"] if not specified.
1206
- *
1207
- * @generated from field: repeated string events = 3;
1208
- */
1209
- events: string[];
1210
- constructor(data?: PartialMessage<CreateWebhookConfig>);
1211
- static readonly runtime: typeof proto3;
1212
- static readonly typeName = "transcodely.v1.CreateWebhookConfig";
1213
- static readonly fields: FieldList;
1214
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateWebhookConfig;
1215
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): CreateWebhookConfig;
1216
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateWebhookConfig;
1217
- static equals(a: CreateWebhookConfig | PlainMessage<CreateWebhookConfig> | undefined, b: CreateWebhookConfig | PlainMessage<CreateWebhookConfig> | undefined): boolean;
1218
- }
1219
1170
  /**
1220
1171
  * Response from creating an app.
1221
1172
  *
@@ -1228,13 +1179,6 @@ declare class CreateAppResponse extends Message<CreateAppResponse> {
1228
1179
  * @generated from field: transcodely.v1.App app = 1;
1229
1180
  */
1230
1181
  app?: App;
1231
- /**
1232
- * Webhook secret (only returned if generate_secret was true).
1233
- * WARNING: This is the only time the secret is returned.
1234
- *
1235
- * @generated from field: optional string webhook_secret = 2;
1236
- */
1237
- webhookSecret?: string;
1238
1182
  constructor(data?: PartialMessage<CreateAppResponse>);
1239
1183
  static readonly runtime: typeof proto3;
1240
1184
  static readonly typeName = "transcodely.v1.CreateAppResponse";
@@ -1310,13 +1254,6 @@ declare class UpdateAppRequest extends Message<UpdateAppRequest> {
1310
1254
  * @generated from field: optional string description = 3;
1311
1255
  */
1312
1256
  description?: string;
1313
- /**
1314
- * New webhook configuration (if provided).
1315
- * Set to empty message to clear webhook config.
1316
- *
1317
- * @generated from field: optional transcodely.v1.UpdateWebhookConfig webhook = 4;
1318
- */
1319
- webhook?: UpdateWebhookConfig;
1320
1257
  constructor(data?: PartialMessage<UpdateAppRequest>);
1321
1258
  static readonly runtime: typeof proto3;
1322
1259
  static readonly typeName = "transcodely.v1.UpdateAppRequest";
@@ -1326,42 +1263,6 @@ declare class UpdateAppRequest extends Message<UpdateAppRequest> {
1326
1263
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UpdateAppRequest;
1327
1264
  static equals(a: UpdateAppRequest | PlainMessage<UpdateAppRequest> | undefined, b: UpdateAppRequest | PlainMessage<UpdateAppRequest> | undefined): boolean;
1328
1265
  }
1329
- /**
1330
- * Webhook configuration for app update.
1331
- *
1332
- * @generated from message transcodely.v1.UpdateWebhookConfig
1333
- */
1334
- declare class UpdateWebhookConfig extends Message<UpdateWebhookConfig> {
1335
- /**
1336
- * New webhook URL. HTTPS only (same constraint as CreateWebhookConfig).
1337
- * Set to empty string to disable webhooks.
1338
- *
1339
- * @generated from field: optional string url = 1;
1340
- */
1341
- url?: string;
1342
- /**
1343
- * If true, regenerate the webhook secret.
1344
- * The new secret is returned in the response.
1345
- *
1346
- * @generated from field: bool regenerate_secret = 2;
1347
- */
1348
- regenerateSecret: boolean;
1349
- /**
1350
- * New events to send.
1351
- * Only applied if explicitly provided.
1352
- *
1353
- * @generated from field: repeated string events = 3;
1354
- */
1355
- events: string[];
1356
- constructor(data?: PartialMessage<UpdateWebhookConfig>);
1357
- static readonly runtime: typeof proto3;
1358
- static readonly typeName = "transcodely.v1.UpdateWebhookConfig";
1359
- static readonly fields: FieldList;
1360
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): UpdateWebhookConfig;
1361
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): UpdateWebhookConfig;
1362
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UpdateWebhookConfig;
1363
- static equals(a: UpdateWebhookConfig | PlainMessage<UpdateWebhookConfig> | undefined, b: UpdateWebhookConfig | PlainMessage<UpdateWebhookConfig> | undefined): boolean;
1364
- }
1365
1266
  /**
1366
1267
  * Response from updating an app.
1367
1268
  *
@@ -1374,12 +1275,6 @@ declare class UpdateAppResponse extends Message<UpdateAppResponse> {
1374
1275
  * @generated from field: transcodely.v1.App app = 1;
1375
1276
  */
1376
1277
  app?: App;
1377
- /**
1378
- * New webhook secret (only returned if regenerate_secret was true).
1379
- *
1380
- * @generated from field: optional string webhook_secret = 2;
1381
- */
1382
- webhookSecret?: string;
1383
1278
  constructor(data?: PartialMessage<UpdateAppResponse>);
1384
1279
  static readonly runtime: typeof proto3;
1385
1280
  static readonly typeName = "transcodely.v1.UpdateAppResponse";
@@ -1545,6 +1440,19 @@ declare class HostingConfig extends Message<HostingConfig> {
1545
1440
  * @generated from field: optional transcodely.v1.AutoProfileDefaults auto_profile_defaults = 4;
1546
1441
  */
1547
1442
  autoProfileDefaults?: AutoProfileDefaults;
1443
+ /**
1444
+ * Days after a hosted video becomes ready before its ORIGINAL SOURCE FILE is
1445
+ * deleted from managed storage (0 = disabled/clear). Applies ONLY to the
1446
+ * uploaded source object; renditions and playback are NEVER affected, and BYO
1447
+ * origins are out of scope. A warning webhook (video.source_scheduled_for_deletion)
1448
+ * fires at least the configured warning lead ahead of deletion. Once the source
1449
+ * is deleted, future re-processing (new codecs/renditions, retro-captions) falls
1450
+ * back to the best available rendition. Per-video source_pinned exempts an
1451
+ * individual video from this rule.
1452
+ *
1453
+ * @generated from field: optional int32 delete_source_after_days = 5;
1454
+ */
1455
+ deleteSourceAfterDays?: number;
1548
1456
  constructor(data?: PartialMessage<HostingConfig>);
1549
1457
  static readonly runtime: typeof proto3;
1550
1458
  static readonly typeName = "transcodely.v1.HostingConfig";
@@ -1649,17 +1557,613 @@ declare class UpdateHostingConfigResponse extends Message<UpdateHostingConfigRes
1649
1557
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UpdateHostingConfigResponse;
1650
1558
  static equals(a: UpdateHostingConfigResponse | PlainMessage<UpdateHostingConfigResponse> | undefined, b: UpdateHostingConfigResponse | PlainMessage<UpdateHostingConfigResponse> | undefined): boolean;
1651
1559
  }
1560
+ /**
1561
+ * Request to set or clear an app's monthly spend limit.
1562
+ *
1563
+ * @generated from message transcodely.v1.UpdateSpendLimitRequest
1564
+ */
1565
+ declare class UpdateSpendLimitRequest extends Message<UpdateSpendLimitRequest> {
1566
+ /**
1567
+ * App ID.
1568
+ *
1569
+ * @generated from field: string app_id = 1;
1570
+ */
1571
+ appId: string;
1572
+ /**
1573
+ * Monthly spend limit in EUR. When present, sets the cap (must be > 0). When
1574
+ * ABSENT, the cap is cleared and the app returns to unlimited (the default).
1575
+ * The upper bound matches the NUMERIC(12,2) storage column.
1576
+ *
1577
+ * @generated from field: optional double monthly_spend_limit_eur = 2;
1578
+ */
1579
+ monthlySpendLimitEur?: number;
1580
+ constructor(data?: PartialMessage<UpdateSpendLimitRequest>);
1581
+ static readonly runtime: typeof proto3;
1582
+ static readonly typeName = "transcodely.v1.UpdateSpendLimitRequest";
1583
+ static readonly fields: FieldList;
1584
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): UpdateSpendLimitRequest;
1585
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): UpdateSpendLimitRequest;
1586
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UpdateSpendLimitRequest;
1587
+ static equals(a: UpdateSpendLimitRequest | PlainMessage<UpdateSpendLimitRequest> | undefined, b: UpdateSpendLimitRequest | PlainMessage<UpdateSpendLimitRequest> | undefined): boolean;
1588
+ }
1589
+ /**
1590
+ * Response from updating a spend limit.
1591
+ *
1592
+ * @generated from message transcodely.v1.UpdateSpendLimitResponse
1593
+ */
1594
+ declare class UpdateSpendLimitResponse extends Message<UpdateSpendLimitResponse> {
1595
+ /**
1596
+ * The updated app (monthly_spend_limit_eur reflects the new value, or is
1597
+ * unset when the limit was cleared).
1598
+ *
1599
+ * @generated from field: transcodely.v1.App app = 1;
1600
+ */
1601
+ app?: App;
1602
+ constructor(data?: PartialMessage<UpdateSpendLimitResponse>);
1603
+ static readonly runtime: typeof proto3;
1604
+ static readonly typeName = "transcodely.v1.UpdateSpendLimitResponse";
1605
+ static readonly fields: FieldList;
1606
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): UpdateSpendLimitResponse;
1607
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): UpdateSpendLimitResponse;
1608
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UpdateSpendLimitResponse;
1609
+ static equals(a: UpdateSpendLimitResponse | PlainMessage<UpdateSpendLimitResponse> | undefined, b: UpdateSpendLimitResponse | PlainMessage<UpdateSpendLimitResponse> | undefined): boolean;
1610
+ }
1611
+ /**
1612
+ * Request to read an app's current-period transcoding spend.
1613
+ *
1614
+ * @generated from message transcodely.v1.GetSpendRequest
1615
+ */
1616
+ declare class GetSpendRequest extends Message<GetSpendRequest> {
1617
+ /**
1618
+ * App ID.
1619
+ *
1620
+ * @generated from field: string app_id = 1;
1621
+ */
1622
+ appId: string;
1623
+ constructor(data?: PartialMessage<GetSpendRequest>);
1624
+ static readonly runtime: typeof proto3;
1625
+ static readonly typeName = "transcodely.v1.GetSpendRequest";
1626
+ static readonly fields: FieldList;
1627
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSpendRequest;
1628
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSpendRequest;
1629
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSpendRequest;
1630
+ static equals(a: GetSpendRequest | PlainMessage<GetSpendRequest> | undefined, b: GetSpendRequest | PlainMessage<GetSpendRequest> | undefined): boolean;
1631
+ }
1632
+ /**
1633
+ * Response with an app's current-period transcoding spend.
1634
+ *
1635
+ * Spend is the sum of billed charges for terminal jobs plus recorded estimates
1636
+ * for in-flight jobs, and includes the per-job minimum charge where applied.
1637
+ * Jobs are attributed to the period by their creation time. All amounts are in
1638
+ * EUR.
1639
+ *
1640
+ * @generated from message transcodely.v1.GetSpendResponse
1641
+ */
1642
+ declare class GetSpendResponse extends Message<GetSpendResponse> {
1643
+ /**
1644
+ * Start of the current billing period (inclusive), UTC.
1645
+ *
1646
+ * @generated from field: google.protobuf.Timestamp period_start = 1;
1647
+ */
1648
+ periodStart?: Timestamp;
1649
+ /**
1650
+ * End of the current billing period (exclusive), UTC.
1651
+ *
1652
+ * @generated from field: google.protobuf.Timestamp period_end = 2;
1653
+ */
1654
+ periodEnd?: Timestamp;
1655
+ /**
1656
+ * Transcoding spend recorded so far this period, in EUR.
1657
+ *
1658
+ * @generated from field: double spent_eur = 3;
1659
+ */
1660
+ spentEur: number;
1661
+ /**
1662
+ * The app's monthly spend limit in EUR. Unset = unlimited.
1663
+ *
1664
+ * @generated from field: optional double monthly_spend_limit_eur = 4;
1665
+ */
1666
+ monthlySpendLimitEur?: number;
1667
+ /**
1668
+ * Currency of all amounts in this response. Always "EUR".
1669
+ *
1670
+ * @generated from field: string currency = 5;
1671
+ */
1672
+ currency: string;
1673
+ /**
1674
+ * True once the 80% warning event (`app.spend_limit_warning`) has fired this
1675
+ * period. Fire-once per period; not re-armed by a mid-period limit change.
1676
+ *
1677
+ * @generated from field: bool warning_triggered = 6;
1678
+ */
1679
+ warningTriggered: boolean;
1680
+ /**
1681
+ * True once the breach event (`app.spend_limit_exceeded`) has fired this
1682
+ * period. Fire-once per period; not re-armed by a mid-period limit change.
1683
+ *
1684
+ * @generated from field: bool limit_reached = 7;
1685
+ */
1686
+ limitReached: boolean;
1687
+ constructor(data?: PartialMessage<GetSpendResponse>);
1688
+ static readonly runtime: typeof proto3;
1689
+ static readonly typeName = "transcodely.v1.GetSpendResponse";
1690
+ static readonly fields: FieldList;
1691
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetSpendResponse;
1692
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetSpendResponse;
1693
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetSpendResponse;
1694
+ static equals(a: GetSpendResponse | PlainMessage<GetSpendResponse> | undefined, b: GetSpendResponse | PlainMessage<GetSpendResponse> | undefined): boolean;
1695
+ }
1652
1696
 
1653
1697
  declare class Apps {
1654
1698
  private readonly transport;
1655
1699
  constructor(transport: Transport);
1656
- create(req: PartialMessage<CreateAppRequest>, opts?: CallOptions): Promise<App>;
1657
- get(id: string, opts?: CallOptions): Promise<App>;
1658
- update(req: PartialMessage<UpdateAppRequest>, opts?: CallOptions): Promise<App>;
1659
- list(req?: PartialMessage<ListAppsRequest>, opts?: CallOptions): Page<App>;
1660
- archive(id: string, opts?: CallOptions): Promise<App>;
1661
- enableHosting(req: PartialMessage<EnableHostingRequest>, opts?: CallOptions): Promise<EnableHostingResponse>;
1662
- updateHostingConfig(req: PartialMessage<UpdateHostingConfigRequest>, opts?: CallOptions): Promise<UpdateHostingConfigResponse>;
1700
+ create(req: PartialMessage<CreateAppRequest>, opts?: CallOptions): Promise<App>;
1701
+ get(id: string, opts?: CallOptions): Promise<App>;
1702
+ update(req: PartialMessage<UpdateAppRequest>, opts?: CallOptions): Promise<App>;
1703
+ list(req?: PartialMessage<ListAppsRequest>, opts?: CallOptions): Page<App>;
1704
+ archive(id: string, opts?: CallOptions): Promise<App>;
1705
+ enableHosting(req: PartialMessage<EnableHostingRequest>, opts?: CallOptions): Promise<EnableHostingResponse>;
1706
+ updateHostingConfig(req: PartialMessage<UpdateHostingConfigRequest>, opts?: CallOptions): Promise<UpdateHostingConfigResponse>;
1707
+ /**
1708
+ * Set or clear an app's monthly transcoding spend cap. Provide
1709
+ * `monthlySpendLimitEur` (must be > 0) to set the cap; omit it to clear the
1710
+ * cap and return the app to unlimited. {@link setSpendLimit} and
1711
+ * {@link clearSpendLimit} are the ergonomic shorthands.
1712
+ */
1713
+ updateSpendLimit(req: PartialMessage<UpdateSpendLimitRequest>, opts?: CallOptions): Promise<App>;
1714
+ /**
1715
+ * Set the app's monthly transcoding spend cap in EUR (must be > 0). Once
1716
+ * recorded spend for the current billing period reaches the cap, new jobs are
1717
+ * rejected with the `limit_exceeded` error code; in-flight jobs are never
1718
+ * stopped. Use {@link clearSpendLimit} to return the app to unlimited.
1719
+ */
1720
+ setSpendLimit(id: string, monthlySpendLimitEur: number, opts?: CallOptions): Promise<App>;
1721
+ /**
1722
+ * Clear the app's monthly spend cap, returning it to unlimited (the default).
1723
+ * Omitting the optional limit field tells the server to clear any existing cap.
1724
+ */
1725
+ clearSpendLimit(id: string, opts?: CallOptions): Promise<App>;
1726
+ /**
1727
+ * Get the app's current-period transcoding spend against its limit: the
1728
+ * billing-period bounds, EUR spent so far, the cap (if set), and whether the
1729
+ * 80% warning and 100% breach events have fired this period.
1730
+ */
1731
+ getSpend(id: string, opts?: CallOptions): Promise<GetSpendResponse>;
1732
+ }
1733
+
1734
+ /**
1735
+ * Invoice lifecycle.
1736
+ *
1737
+ * draft -> open -> paid | void | uncollectible. Only "open" and later states
1738
+ * are ever returned by ListInvoices; "draft" appears only on the upcoming
1739
+ * invoice.
1740
+ *
1741
+ * @generated from enum transcodely.v1.InvoiceStatus
1742
+ */
1743
+ declare enum InvoiceStatus {
1744
+ /**
1745
+ * @generated from enum value: INVOICE_STATUS_UNSPECIFIED = 0;
1746
+ */
1747
+ UNSPECIFIED = 0,
1748
+ /**
1749
+ * Being generated, or the live upcoming statement. Not a bill yet.
1750
+ *
1751
+ * @generated from enum value: INVOICE_STATUS_DRAFT = 1;
1752
+ */
1753
+ DRAFT = 1,
1754
+ /**
1755
+ * Finalized and awaiting payment.
1756
+ *
1757
+ * @generated from enum value: INVOICE_STATUS_OPEN = 2;
1758
+ */
1759
+ OPEN = 2,
1760
+ /**
1761
+ * Paid in full.
1762
+ *
1763
+ * @generated from enum value: INVOICE_STATUS_PAID = 3;
1764
+ */
1765
+ PAID = 3,
1766
+ /**
1767
+ * Canceled without payment; nothing is owed.
1768
+ *
1769
+ * @generated from enum value: INVOICE_STATUS_VOID = 4;
1770
+ */
1771
+ VOID = 4,
1772
+ /**
1773
+ * Written off as unpayable after collection attempts failed.
1774
+ *
1775
+ * @generated from enum value: INVOICE_STATUS_UNCOLLECTIBLE = 5;
1776
+ */
1777
+ UNCOLLECTIBLE = 5
1778
+ }
1779
+ /**
1780
+ * What an invoice line represents.
1781
+ *
1782
+ * @generated from enum transcodely.v1.InvoiceLineType
1783
+ */
1784
+ declare enum InvoiceLineType {
1785
+ /**
1786
+ * @generated from enum value: INVOICE_LINE_TYPE_UNSPECIFIED = 0;
1787
+ */
1788
+ UNSPECIFIED = 0,
1789
+ /**
1790
+ * Encoding work, grouped by app, codec, resolution and quality tier.
1791
+ *
1792
+ * @generated from enum value: INVOICE_LINE_TYPE_USAGE = 1;
1793
+ */
1794
+ USAGE = 1,
1795
+ /**
1796
+ * A metered add-on, such as AI captions.
1797
+ *
1798
+ * @generated from enum value: INVOICE_LINE_TYPE_FEE = 2;
1799
+ */
1800
+ FEE = 2,
1801
+ /**
1802
+ * The per-job minimum charge, summed over the jobs it applied to.
1803
+ *
1804
+ * @generated from enum value: INVOICE_LINE_TYPE_MIN_CHARGE = 3;
1805
+ */
1806
+ MIN_CHARGE = 3,
1807
+ /**
1808
+ * The residue that reconciles the itemized lines with the amount charged.
1809
+ * Per-line rounding cannot always add up to the sum of per-job rounding; this
1810
+ * line carries the difference so the breakdown always matches the total.
1811
+ *
1812
+ * @generated from enum value: INVOICE_LINE_TYPE_ADJUSTMENT = 4;
1813
+ */
1814
+ ADJUSTMENT = 4
1815
+ }
1816
+ /**
1817
+ * A billing statement for one period.
1818
+ *
1819
+ * All monetary amounts are integer minor units (cents) of the invoice's
1820
+ * currency — 1250 in EUR is €12.50. Following the protobuf JSON mapping for
1821
+ * 64-bit integers, they are rendered as JSON strings ("1250"), not numbers.
1822
+ *
1823
+ * @generated from message transcodely.v1.Invoice
1824
+ */
1825
+ declare class Invoice extends Message<Invoice> {
1826
+ /**
1827
+ * Unique identifier (e.g., "inv_a1b2c3d4e5f6").
1828
+ * Empty on the upcoming invoice, which is computed and not yet stored.
1829
+ *
1830
+ * @generated from field: string id = 1;
1831
+ */
1832
+ id: string;
1833
+ /**
1834
+ * Object type, always "invoice".
1835
+ *
1836
+ * @generated from field: string object = 2;
1837
+ */
1838
+ object: string;
1839
+ /**
1840
+ * Organization this statement bills.
1841
+ *
1842
+ * @generated from field: string org_id = 3;
1843
+ */
1844
+ orgId: string;
1845
+ /**
1846
+ * Lifecycle state. The upcoming invoice reports "draft".
1847
+ *
1848
+ * @generated from field: transcodely.v1.InvoiceStatus status = 4;
1849
+ */
1850
+ status: InvoiceStatus;
1851
+ /**
1852
+ * Start of the billing period (inclusive).
1853
+ *
1854
+ * @generated from field: google.protobuf.Timestamp period_start = 5;
1855
+ */
1856
+ periodStart?: Timestamp;
1857
+ /**
1858
+ * End of the billing period (exclusive). A job that settles at or after this
1859
+ * instant belongs to the next period, even if it started before it.
1860
+ *
1861
+ * @generated from field: google.protobuf.Timestamp period_end = 6;
1862
+ */
1863
+ periodEnd?: Timestamp;
1864
+ /**
1865
+ * ISO 4217 currency code. Always "EUR" today.
1866
+ *
1867
+ * @generated from field: string currency = 7;
1868
+ */
1869
+ currency: string;
1870
+ /**
1871
+ * Sum of the itemized lines, excluding the rounding adjustment, in cents.
1872
+ *
1873
+ * @generated from field: int64 subtotal_cents = 8;
1874
+ */
1875
+ subtotalCents: bigint;
1876
+ /**
1877
+ * Amount charged, in cents. Equals the sum of every line item including the
1878
+ * rounding adjustment, and equals the sum of the settled jobs it covers.
1879
+ *
1880
+ * @generated from field: int64 total_cents = 9;
1881
+ */
1882
+ totalCents: bigint;
1883
+ /**
1884
+ * The payment provider's invoice number, once the statement has been matched
1885
+ * to the provider's own record. Absent until then; its absence never means
1886
+ * unpaid.
1887
+ *
1888
+ * @generated from field: optional string provider_invoice_number = 10;
1889
+ */
1890
+ providerInvoiceNumber?: string;
1891
+ /**
1892
+ * When the statement was finalized and became visible. Absent on the
1893
+ * upcoming invoice.
1894
+ *
1895
+ * @generated from field: google.protobuf.Timestamp finalized_at = 11;
1896
+ */
1897
+ finalizedAt?: Timestamp;
1898
+ /**
1899
+ * When payment was received. Absent unless status is "paid".
1900
+ *
1901
+ * @generated from field: google.protobuf.Timestamp paid_at = 12;
1902
+ */
1903
+ paidAt?: Timestamp;
1904
+ /**
1905
+ * The itemized breakdown, in display order.
1906
+ *
1907
+ * @generated from field: repeated transcodely.v1.InvoiceLineItem line_items = 13;
1908
+ */
1909
+ lineItems: InvoiceLineItem[];
1910
+ /**
1911
+ * When the statement row was created.
1912
+ *
1913
+ * @generated from field: google.protobuf.Timestamp created_at = 14;
1914
+ */
1915
+ createdAt?: Timestamp;
1916
+ constructor(data?: PartialMessage<Invoice>);
1917
+ static readonly runtime: typeof proto3;
1918
+ static readonly typeName = "transcodely.v1.Invoice";
1919
+ static readonly fields: FieldList;
1920
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): Invoice;
1921
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): Invoice;
1922
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Invoice;
1923
+ static equals(a: Invoice | PlainMessage<Invoice> | undefined, b: Invoice | PlainMessage<Invoice> | undefined): boolean;
1924
+ }
1925
+ /**
1926
+ * One line of an invoice's breakdown.
1927
+ *
1928
+ * Line items explain the total; they do not compute it. They are regenerated
1929
+ * wholesale whenever a statement is rebuilt before finalization, so a line item
1930
+ * id is not stable until the invoice is finalized.
1931
+ *
1932
+ * @generated from message transcodely.v1.InvoiceLineItem
1933
+ */
1934
+ declare class InvoiceLineItem extends Message<InvoiceLineItem> {
1935
+ /**
1936
+ * Unique identifier (e.g., "li_a1b2c3d4e5f6g7"). Empty on the upcoming
1937
+ * invoice, whose lines are computed rather than stored.
1938
+ *
1939
+ * @generated from field: string id = 1;
1940
+ */
1941
+ id: string;
1942
+ /**
1943
+ * What kind of charge this line represents.
1944
+ *
1945
+ * @generated from field: transcodely.v1.InvoiceLineType line_type = 2;
1946
+ */
1947
+ lineType: InvoiceLineType;
1948
+ /**
1949
+ * Human-readable description, e.g. "Encoding — h264 1080p standard".
1950
+ *
1951
+ * @generated from field: string description = 3;
1952
+ */
1953
+ description: string;
1954
+ /**
1955
+ * How many units the line covers (e.g. 12 outputs). Absent for lines that
1956
+ * are not metered, such as the rounding adjustment.
1957
+ *
1958
+ * @generated from field: optional double quantity = 4;
1959
+ */
1960
+ quantity?: number;
1961
+ /**
1962
+ * Unit that quantity is counted in, e.g. "output" or "minute".
1963
+ *
1964
+ * @generated from field: string unit = 5;
1965
+ */
1966
+ unit: string;
1967
+ /**
1968
+ * Amount for this line, in cents. Signed: the rounding adjustment is
1969
+ * routinely negative.
1970
+ *
1971
+ * @generated from field: int64 amount_cents = 6;
1972
+ */
1973
+ amountCents: bigint;
1974
+ /**
1975
+ * The grouping key that produced this line, e.g.
1976
+ * {"app_id": "app_k1l2m3n4o5", "codec": "h264", "resolution": "1080p"}.
1977
+ * Keys vary by line_type and new ones may be added.
1978
+ *
1979
+ * @generated from field: map<string, string> dimensions = 7;
1980
+ */
1981
+ dimensions: {
1982
+ [key: string]: string;
1983
+ };
1984
+ constructor(data?: PartialMessage<InvoiceLineItem>);
1985
+ static readonly runtime: typeof proto3;
1986
+ static readonly typeName = "transcodely.v1.InvoiceLineItem";
1987
+ static readonly fields: FieldList;
1988
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): InvoiceLineItem;
1989
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): InvoiceLineItem;
1990
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): InvoiceLineItem;
1991
+ static equals(a: InvoiceLineItem | PlainMessage<InvoiceLineItem> | undefined, b: InvoiceLineItem | PlainMessage<InvoiceLineItem> | undefined): boolean;
1992
+ }
1993
+ /**
1994
+ * Request to list the organization's invoices.
1995
+ *
1996
+ * @generated from message transcodely.v1.ListInvoicesRequest
1997
+ */
1998
+ declare class ListInvoicesRequest extends Message<ListInvoicesRequest> {
1999
+ /**
2000
+ * Pagination parameters.
2001
+ *
2002
+ * @generated from field: transcodely.v1.PaginationRequest pagination = 1;
2003
+ */
2004
+ pagination?: PaginationRequest;
2005
+ constructor(data?: PartialMessage<ListInvoicesRequest>);
2006
+ static readonly runtime: typeof proto3;
2007
+ static readonly typeName = "transcodely.v1.ListInvoicesRequest";
2008
+ static readonly fields: FieldList;
2009
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ListInvoicesRequest;
2010
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ListInvoicesRequest;
2011
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ListInvoicesRequest;
2012
+ static equals(a: ListInvoicesRequest | PlainMessage<ListInvoicesRequest> | undefined, b: ListInvoicesRequest | PlainMessage<ListInvoicesRequest> | undefined): boolean;
2013
+ }
2014
+ /**
2015
+ * Response from listing invoices.
2016
+ *
2017
+ * @generated from message transcodely.v1.ListInvoicesResponse
2018
+ */
2019
+ declare class ListInvoicesResponse extends Message<ListInvoicesResponse> {
2020
+ /**
2021
+ * Invoices, newest period first. Line items are omitted here; fetch a single
2022
+ * invoice to get them.
2023
+ *
2024
+ * @generated from field: repeated transcodely.v1.Invoice invoices = 1;
2025
+ */
2026
+ invoices: Invoice[];
2027
+ /**
2028
+ * Pagination metadata.
2029
+ *
2030
+ * @generated from field: transcodely.v1.PaginationResponse pagination = 2;
2031
+ */
2032
+ pagination?: PaginationResponse;
2033
+ constructor(data?: PartialMessage<ListInvoicesResponse>);
2034
+ static readonly runtime: typeof proto3;
2035
+ static readonly typeName = "transcodely.v1.ListInvoicesResponse";
2036
+ static readonly fields: FieldList;
2037
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ListInvoicesResponse;
2038
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ListInvoicesResponse;
2039
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ListInvoicesResponse;
2040
+ static equals(a: ListInvoicesResponse | PlainMessage<ListInvoicesResponse> | undefined, b: ListInvoicesResponse | PlainMessage<ListInvoicesResponse> | undefined): boolean;
2041
+ }
2042
+ /**
2043
+ * Request to retrieve one invoice.
2044
+ *
2045
+ * @generated from message transcodely.v1.GetInvoiceRequest
2046
+ */
2047
+ declare class GetInvoiceRequest extends Message<GetInvoiceRequest> {
2048
+ /**
2049
+ * Invoice ID (e.g., "inv_a1b2c3d4e5f6").
2050
+ *
2051
+ * @generated from field: string id = 1;
2052
+ */
2053
+ id: string;
2054
+ constructor(data?: PartialMessage<GetInvoiceRequest>);
2055
+ static readonly runtime: typeof proto3;
2056
+ static readonly typeName = "transcodely.v1.GetInvoiceRequest";
2057
+ static readonly fields: FieldList;
2058
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetInvoiceRequest;
2059
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetInvoiceRequest;
2060
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetInvoiceRequest;
2061
+ static equals(a: GetInvoiceRequest | PlainMessage<GetInvoiceRequest> | undefined, b: GetInvoiceRequest | PlainMessage<GetInvoiceRequest> | undefined): boolean;
2062
+ }
2063
+ /**
2064
+ * Response from retrieving an invoice.
2065
+ *
2066
+ * @generated from message transcodely.v1.GetInvoiceResponse
2067
+ */
2068
+ declare class GetInvoiceResponse extends Message<GetInvoiceResponse> {
2069
+ /**
2070
+ * The requested invoice, with its line items.
2071
+ *
2072
+ * @generated from field: transcodely.v1.Invoice invoice = 1;
2073
+ */
2074
+ invoice?: Invoice;
2075
+ constructor(data?: PartialMessage<GetInvoiceResponse>);
2076
+ static readonly runtime: typeof proto3;
2077
+ static readonly typeName = "transcodely.v1.GetInvoiceResponse";
2078
+ static readonly fields: FieldList;
2079
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetInvoiceResponse;
2080
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetInvoiceResponse;
2081
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetInvoiceResponse;
2082
+ static equals(a: GetInvoiceResponse | PlainMessage<GetInvoiceResponse> | undefined, b: GetInvoiceResponse | PlainMessage<GetInvoiceResponse> | undefined): boolean;
2083
+ }
2084
+ /**
2085
+ * Request to retrieve the statement for the period currently accruing.
2086
+ *
2087
+ * @generated from message transcodely.v1.GetUpcomingInvoiceRequest
2088
+ */
2089
+ declare class GetUpcomingInvoiceRequest extends Message<GetUpcomingInvoiceRequest> {
2090
+ constructor(data?: PartialMessage<GetUpcomingInvoiceRequest>);
2091
+ static readonly runtime: typeof proto3;
2092
+ static readonly typeName = "transcodely.v1.GetUpcomingInvoiceRequest";
2093
+ static readonly fields: FieldList;
2094
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetUpcomingInvoiceRequest;
2095
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetUpcomingInvoiceRequest;
2096
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetUpcomingInvoiceRequest;
2097
+ static equals(a: GetUpcomingInvoiceRequest | PlainMessage<GetUpcomingInvoiceRequest> | undefined, b: GetUpcomingInvoiceRequest | PlainMessage<GetUpcomingInvoiceRequest> | undefined): boolean;
2098
+ }
2099
+ /**
2100
+ * Response carrying the upcoming statement.
2101
+ *
2102
+ * @generated from message transcodely.v1.GetUpcomingInvoiceResponse
2103
+ */
2104
+ declare class GetUpcomingInvoiceResponse extends Message<GetUpcomingInvoiceResponse> {
2105
+ /**
2106
+ * The computed statement. Its id is empty and its status is "draft". Totals
2107
+ * are zero when nothing has been billed in the period yet.
2108
+ *
2109
+ * @generated from field: transcodely.v1.Invoice invoice = 1;
2110
+ */
2111
+ invoice?: Invoice;
2112
+ constructor(data?: PartialMessage<GetUpcomingInvoiceResponse>);
2113
+ static readonly runtime: typeof proto3;
2114
+ static readonly typeName = "transcodely.v1.GetUpcomingInvoiceResponse";
2115
+ static readonly fields: FieldList;
2116
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetUpcomingInvoiceResponse;
2117
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetUpcomingInvoiceResponse;
2118
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetUpcomingInvoiceResponse;
2119
+ static equals(a: GetUpcomingInvoiceResponse | PlainMessage<GetUpcomingInvoiceResponse> | undefined, b: GetUpcomingInvoiceResponse | PlainMessage<GetUpcomingInvoiceResponse> | undefined): boolean;
2120
+ }
2121
+
2122
+ /**
2123
+ * An organization's billing statements — read-only.
2124
+ *
2125
+ * Unlike every other namespace, billing settles a whole organization rather
2126
+ * than a single app, so it is **not** available to API-key callers: a key is
2127
+ * scoped to one app, and there is no app-scoped subset of an invoice worth
2128
+ * serving. An API key gets a `PermissionError`.
2129
+ *
2130
+ * Reading invoices needs a dashboard session token for an organization
2131
+ * **owner**, plus the organization the request is for:
2132
+ *
2133
+ * ```ts
2134
+ * const client = new Transcodely({
2135
+ * apiKey: sessionToken,
2136
+ * organizationId: "org_f6g7h8i9j0",
2137
+ * });
2138
+ * const upcoming = await client.billing.retrieveUpcoming();
2139
+ * ```
2140
+ *
2141
+ * Invoices are generated automatically when a period closes. There is no API to
2142
+ * create, edit, or delete one — a statement records what happened.
2143
+ */
2144
+ declare class Billing {
2145
+ private readonly transport;
2146
+ constructor(transport: Transport);
2147
+ /**
2148
+ * Page through the organization's finalized invoices, newest period first.
2149
+ *
2150
+ * Line items are omitted here; use {@link retrieve} for one invoice's
2151
+ * breakdown. A statement still being generated for a just-ended period is
2152
+ * never returned — for the period currently accruing use
2153
+ * {@link retrieveUpcoming}.
2154
+ */
2155
+ listInvoices(req?: PartialMessage<ListInvoicesRequest>, opts?: CallOptions): Page<Invoice>;
2156
+ /** Retrieve one invoice by ID (`inv_*`), including its line items. */
2157
+ retrieve(id: string, opts?: CallOptions): Promise<Invoice>;
2158
+ /**
2159
+ * Retrieve the statement for the period currently accruing.
2160
+ *
2161
+ * Computed live from settled jobs rather than stored, so its `id` is empty,
2162
+ * its status is `draft`, and its totals move as jobs finish. Jobs still
2163
+ * running are not included at any price — a job is billed only once it
2164
+ * settles.
2165
+ */
2166
+ retrieveUpcoming(opts?: CallOptions): Promise<Invoice>;
1663
2167
  }
1664
2168
 
1665
2169
  /**
@@ -1695,10 +2199,13 @@ declare class WebhookEndpoint extends Message<WebhookEndpoint> {
1695
2199
  /**
1696
2200
  * Event types this endpoint subscribes to.
1697
2201
  * Use "*" to subscribe to all event types.
1698
- * Possible values: "job.created", "job.updated", "job.succeeded",
1699
- * "job.failed", "job.canceled", "job.progress", "output.created",
1700
- * "output.ready", "output.failed", "output.progress",
1701
- * "video.uploaded", "video.deleted", "app.created", "app.updated", or "*".
2202
+ * Possible values: "job.created", "job.succeeded", "job.failed",
2203
+ * "job.canceled", "job.progress", "output.created", "output.ready",
2204
+ * "output.failed", "output.progress", "video.uploaded", "video.ready",
2205
+ * "video.failed", "video.deleted", "video.source_scheduled_for_deletion",
2206
+ * "app.created", "app.updated", "app.spend_limit_warning",
2207
+ * "app.spend_limit_exceeded", or "*".
2208
+ * Keep in sync with domain.WebhookEventTypes() ("job.updated" does not exist).
1702
2209
  *
1703
2210
  * @generated from field: repeated string enabled_events = 5;
1704
2211
  */
@@ -1749,8 +2256,9 @@ declare class WebhookEndpoint extends Message<WebhookEndpoint> {
1749
2256
  * Reason the endpoint is in `status: "disabled"`. Absent when status is "enabled".
1750
2257
  * One of:
1751
2258
  * "manual" — operator paused via UpdateWebhookEndpoint
1752
- * "auto_failures" — scheduler tripped after 10 consecutive terminal failures
1753
- * spanning ≥72 h
2259
+ * "auto_failures" — scheduler tripped after an opt-in sustained-failure
2260
+ * rule: 50+ consecutive terminal failures with zero
2261
+ * successes for at least 168 h (7 days)
1754
2262
  * Wire value is lowercase per project convention.
1755
2263
  *
1756
2264
  * @generated from field: optional string disabled_reason = 12;
@@ -1772,6 +2280,15 @@ declare class WebhookEndpoint extends Message<WebhookEndpoint> {
1772
2280
  * @generated from field: optional google.protobuf.Timestamp previous_secret_expires_at = 14;
1773
2281
  */
1774
2282
  previousSecretExpiresAt?: Timestamp;
2283
+ /**
2284
+ * Compact rolling-24h delivery-health summary. Populated ONLY by
2285
+ * ListWebhookEndpoints when the request sets include_health=true; absent on
2286
+ * every other RPC and when include_health is false. Shares the
2287
+ * GetEndpointHealth cache, so values may be up to ~30 s stale.
2288
+ *
2289
+ * @generated from field: optional transcodely.v1.EndpointHealthSummary health = 15;
2290
+ */
2291
+ health?: EndpointHealthSummary;
1775
2292
  constructor(data?: PartialMessage<WebhookEndpoint>);
1776
2293
  static readonly runtime: typeof proto3;
1777
2294
  static readonly typeName = "transcodely.v1.WebhookEndpoint";
@@ -1781,6 +2298,44 @@ declare class WebhookEndpoint extends Message<WebhookEndpoint> {
1781
2298
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WebhookEndpoint;
1782
2299
  static equals(a: WebhookEndpoint | PlainMessage<WebhookEndpoint> | undefined, b: WebhookEndpoint | PlainMessage<WebhookEndpoint> | undefined): boolean;
1783
2300
  }
2301
+ /**
2302
+ * Compact delivery-health summary attached to a WebhookEndpoint in
2303
+ * ListWebhookEndpoints responses when include_health=true. A minimal
2304
+ * rolling-24h rollup; call GetEndpointHealth for the full bucketed series,
2305
+ * pending count, and latency percentiles. Values may be up to ~30 s stale.
2306
+ *
2307
+ * @generated from message transcodely.v1.EndpointHealthSummary
2308
+ */
2309
+ declare class EndpointHealthSummary extends Message<EndpointHealthSummary> {
2310
+ /**
2311
+ * Total delivery attempts in the last 24 h.
2312
+ *
2313
+ * @generated from field: int32 total_attempts = 1;
2314
+ */
2315
+ totalAttempts: number;
2316
+ /**
2317
+ * Failed terminal attempts in the last 24 h.
2318
+ *
2319
+ * @generated from field: int32 failed = 2;
2320
+ */
2321
+ failed: number;
2322
+ /**
2323
+ * succeeded / (succeeded + failed) over the last 24 h; in-flight (pending)
2324
+ * attempts are excluded from the denominator. Zero when there were no
2325
+ * terminal attempts in the window.
2326
+ *
2327
+ * @generated from field: double success_rate = 3;
2328
+ */
2329
+ successRate: number;
2330
+ constructor(data?: PartialMessage<EndpointHealthSummary>);
2331
+ static readonly runtime: typeof proto3;
2332
+ static readonly typeName = "transcodely.v1.EndpointHealthSummary";
2333
+ static readonly fields: FieldList;
2334
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): EndpointHealthSummary;
2335
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): EndpointHealthSummary;
2336
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): EndpointHealthSummary;
2337
+ static equals(a: EndpointHealthSummary | PlainMessage<EndpointHealthSummary> | undefined, b: EndpointHealthSummary | PlainMessage<EndpointHealthSummary> | undefined): boolean;
2338
+ }
1784
2339
  /**
1785
2340
  * An immutable record of a platform event emitted for an app.
1786
2341
  *
@@ -2223,6 +2778,19 @@ declare class ListWebhookEndpointsRequest extends Message<ListWebhookEndpointsRe
2223
2778
  * @generated from field: transcodely.v1.PaginationRequest pagination = 2;
2224
2779
  */
2225
2780
  pagination?: PaginationRequest;
2781
+ /**
2782
+ * When true, populate each returned endpoint's `health` field with a compact
2783
+ * rolling-24h delivery summary (success_rate, total_attempts, failed),
2784
+ * replacing N client-side GetEndpointHealth calls with this one list call.
2785
+ * The summary is computed from the same server-side rollup as
2786
+ * GetEndpointHealth and shares its ~30 s cache, so values may be up to ~30 s
2787
+ * stale; on a cold cache the server still computes one rollup per listed
2788
+ * endpoint, so expect a slower first response on apps with many endpoints.
2789
+ * Defaults to false (health omitted).
2790
+ *
2791
+ * @generated from field: bool include_health = 3;
2792
+ */
2793
+ includeHealth: boolean;
2226
2794
  constructor(data?: PartialMessage<ListWebhookEndpointsRequest>);
2227
2795
  static readonly runtime: typeof proto3;
2228
2796
  static readonly typeName = "transcodely.v1.ListWebhookEndpointsRequest";
@@ -2338,6 +2906,18 @@ declare class ListEventsRequest extends Message<ListEventsRequest> {
2338
2906
  * @generated from field: transcodely.v1.PaginationRequest pagination = 5;
2339
2907
  */
2340
2908
  pagination?: PaginationRequest;
2909
+ /**
2910
+ * Filter to events concerning a specific resource, matched against the
2911
+ * resource id embedded in the event's data snapshot (data.id). Accepts any
2912
+ * prefixed Transcodely resource id — e.g. a job ("job_…") or a video
2913
+ * ("vid_…") — and returns every event whose snapshot carries that id. Lets a
2914
+ * dashboard resource page (e.g. a job page) load that resource's webhook
2915
+ * history in one call. Synthetic SendTestWebhook events are stored separately
2916
+ * and never match.
2917
+ *
2918
+ * @generated from field: optional string object_id = 6;
2919
+ */
2920
+ objectId?: string;
2341
2921
  constructor(data?: PartialMessage<ListEventsRequest>);
2342
2922
  static readonly runtime: typeof proto3;
2343
2923
  static readonly typeName = "transcodely.v1.ListEventsRequest";
@@ -3744,7 +4324,14 @@ declare enum SubtitleOperation {
3744
4324
  *
3745
4325
  * @generated from enum value: SUBTITLE_OPERATION_EXTRACT = 4;
3746
4326
  */
3747
- EXTRACT = 4
4327
+ EXTRACT = 4,
4328
+ /**
4329
+ * Generate captions from the audio track using automatic speech
4330
+ * recognition. Tracks produced this way carry auto_generated: true.
4331
+ *
4332
+ * @generated from enum value: SUBTITLE_OPERATION_GENERATE = 5;
4333
+ */
4334
+ GENERATE = 5
3748
4335
  }
3749
4336
  /**
3750
4337
  * Subtitle format.
@@ -3863,7 +4450,11 @@ declare class SubtitleTrack extends Message<SubtitleTrack> {
3863
4450
  */
3864
4451
  outputFormat: SubtitleFormat;
3865
4452
  /**
3866
- * ISO 639-2 language code (e.g., "eng", "spa", "fra").
4453
+ * ISO 639-2 language code (e.g., "eng", "spa", "fra"), or "auto".
4454
+ * "auto" is valid only for the generate operation and selects
4455
+ * automatic language detection; it is the default when empty on a
4456
+ * generate track. The other operations require a real ISO 639-2 code
4457
+ * (or empty) and reject "auto".
3867
4458
  *
3868
4459
  * @generated from field: optional string language = 6;
3869
4460
  */
@@ -3898,6 +4489,19 @@ declare class SubtitleTrack extends Message<SubtitleTrack> {
3898
4489
  * @generated from field: optional transcodely.v1.BurnInStyle burn_in_style = 11;
3899
4490
  */
3900
4491
  burnInStyle?: BurnInStyle;
4492
+ /**
4493
+ * Generate an AI chapters track from the transcript this track produces.
4494
+ *
4495
+ * Only meaningful together with the (upcoming) `generate` subtitle operation:
4496
+ * when enabled, an AI pass over the generated transcript produces a chapters
4497
+ * track delivered as WebVTT plus JSON. Free — no pricing impact. The
4498
+ * transcript text is processed via the Anthropic API (an external
4499
+ * subprocessor). Until the `generate` operation ships, setting this is
4500
+ * rejected at job creation.
4501
+ *
4502
+ * @generated from field: optional bool generate_chapters = 12;
4503
+ */
4504
+ generateChapters?: boolean;
3901
4505
  constructor(data?: PartialMessage<SubtitleTrack>);
3902
4506
  static readonly runtime: typeof proto3;
3903
4507
  static readonly typeName = "transcodely.v1.SubtitleTrack";
@@ -3907,6 +4511,177 @@ declare class SubtitleTrack extends Message<SubtitleTrack> {
3907
4511
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): SubtitleTrack;
3908
4512
  static equals(a: SubtitleTrack | PlainMessage<SubtitleTrack> | undefined, b: SubtitleTrack | PlainMessage<SubtitleTrack> | undefined): boolean;
3909
4513
  }
4514
+ /**
4515
+ * ChapterPoint is one chapter marker. Times are seconds from the start of the
4516
+ * video.
4517
+ *
4518
+ * @generated from message transcodely.v1.ChapterPoint
4519
+ */
4520
+ declare class ChapterPoint extends Message<ChapterPoint> {
4521
+ /**
4522
+ * Chapter start, in seconds from the start of the video.
4523
+ *
4524
+ * @generated from field: double start_seconds = 1;
4525
+ */
4526
+ startSeconds: number;
4527
+ /**
4528
+ * Chapter end, in seconds from the start of the video.
4529
+ *
4530
+ * @generated from field: double end_seconds = 2;
4531
+ */
4532
+ endSeconds: number;
4533
+ /**
4534
+ * Short, human-readable chapter title, in the caption track's language.
4535
+ *
4536
+ * @generated from field: string title = 3;
4537
+ */
4538
+ title: string;
4539
+ constructor(data?: PartialMessage<ChapterPoint>);
4540
+ static readonly runtime: typeof proto3;
4541
+ static readonly typeName = "transcodely.v1.ChapterPoint";
4542
+ static readonly fields: FieldList;
4543
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ChapterPoint;
4544
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ChapterPoint;
4545
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ChapterPoint;
4546
+ static equals(a: ChapterPoint | PlainMessage<ChapterPoint> | undefined, b: ChapterPoint | PlainMessage<ChapterPoint> | undefined): boolean;
4547
+ }
4548
+ /**
4549
+ * ChapterResult reports an auto-generated chapters track (read-only on Job
4550
+ * responses). It is produced by the opt-in auto-chapters pass over generated
4551
+ * captions (SubtitleTrack.generate_chapters).
4552
+ *
4553
+ * Not yet populated: the auto-chapters feature is rolling out together with
4554
+ * generated captions. Fields are documented here so consumers can code against
4555
+ * the shape ahead of the rollout.
4556
+ *
4557
+ * @generated from message transcodely.v1.ChapterResult
4558
+ */
4559
+ declare class ChapterResult extends Message<ChapterResult> {
4560
+ /**
4561
+ * The out_… output the generate track was configured on.
4562
+ *
4563
+ * @generated from field: string output_id = 1;
4564
+ */
4565
+ outputId: string;
4566
+ /**
4567
+ * ISO 639-2 language code, matching the caption track's language.
4568
+ *
4569
+ * @generated from field: string language = 2;
4570
+ */
4571
+ language: string;
4572
+ /**
4573
+ * Storage key of the WebVTT chapters file in the output destination.
4574
+ *
4575
+ * @generated from field: string storage_key = 3;
4576
+ */
4577
+ storageKey: string;
4578
+ /**
4579
+ * Resolved URL for the chapters file (same resolution rules as the caption
4580
+ * artifact URL).
4581
+ *
4582
+ * @generated from field: string url = 4;
4583
+ */
4584
+ url: string;
4585
+ /**
4586
+ * The chapter markers, ordered by start time.
4587
+ *
4588
+ * @generated from field: repeated transcodely.v1.ChapterPoint chapters = 5;
4589
+ */
4590
+ chapters: ChapterPoint[];
4591
+ constructor(data?: PartialMessage<ChapterResult>);
4592
+ static readonly runtime: typeof proto3;
4593
+ static readonly typeName = "transcodely.v1.ChapterResult";
4594
+ static readonly fields: FieldList;
4595
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ChapterResult;
4596
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ChapterResult;
4597
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ChapterResult;
4598
+ static equals(a: ChapterResult | PlainMessage<ChapterResult> | undefined, b: ChapterResult | PlainMessage<ChapterResult> | undefined): boolean;
4599
+ }
4600
+ /**
4601
+ * A generated or processed subtitle artifact, reported by the worker on job
4602
+ * completion and surfaced on the Job response. Mirrors the rendition pattern:
4603
+ * the worker computes both the storage key and the storage URL, and the API
4604
+ * persists them verbatim (the same way JobOutput.output_url works). Read-only
4605
+ * on Job responses.
4606
+ *
4607
+ * @generated from message transcodely.v1.SubtitleResult
4608
+ */
4609
+ declare class SubtitleResult extends Message<SubtitleResult> {
4610
+ /**
4611
+ * Output ID (out_…) the subtitle track was configured on.
4612
+ *
4613
+ * @generated from field: string output_id = 1;
4614
+ */
4615
+ outputId: string;
4616
+ /**
4617
+ * Processing operation that produced this artifact
4618
+ * (generate | extract | convert). Lowercase string on the wire.
4619
+ *
4620
+ * @generated from field: transcodely.v1.SubtitleOperation operation = 2;
4621
+ */
4622
+ operation: SubtitleOperation;
4623
+ /**
4624
+ * Subtitle file format: webvtt | srt | ttml | ass.
4625
+ *
4626
+ * @generated from field: transcodely.v1.SubtitleFormat format = 3;
4627
+ */
4628
+ format: SubtitleFormat;
4629
+ /**
4630
+ * Detected language (generate with auto-detect) or the configured
4631
+ * ISO 639-2 language code.
4632
+ *
4633
+ * @generated from field: string language = 4;
4634
+ */
4635
+ language: string;
4636
+ /**
4637
+ * Human-readable label (e.g., "English", "Spanish (CC)").
4638
+ *
4639
+ * @generated from field: string label = 5;
4640
+ */
4641
+ label: string;
4642
+ /**
4643
+ * True iff this track was produced by the generate operation
4644
+ * (automatic speech recognition).
4645
+ *
4646
+ * @generated from field: bool auto_generated = 6;
4647
+ */
4648
+ autoGenerated: boolean;
4649
+ /**
4650
+ * Caption file storage key in the output destination
4651
+ * (e.g. "job_xxx/subtitles/out_yyy_eng.vtt").
4652
+ *
4653
+ * @generated from field: string storage_key = 7;
4654
+ */
4655
+ storageKey: string;
4656
+ /**
4657
+ * Fully-qualified storage URL as built by the worker, stored as-is and
4658
+ * echoed on the Job response, exactly like JobOutput.output_url.
4659
+ *
4660
+ * @generated from field: string url = 8;
4661
+ */
4662
+ url: string;
4663
+ /**
4664
+ * Segment-level transcript JSON storage key. Set only for generate
4665
+ * tracks (the machine-readable transcript consumed by auto-chapters).
4666
+ *
4667
+ * @generated from field: string transcript_storage_key = 9;
4668
+ */
4669
+ transcriptStorageKey: string;
4670
+ /**
4671
+ * Fully-qualified transcript URL. Set only for generate tracks.
4672
+ *
4673
+ * @generated from field: string transcript_url = 10;
4674
+ */
4675
+ transcriptUrl: string;
4676
+ constructor(data?: PartialMessage<SubtitleResult>);
4677
+ static readonly runtime: typeof proto3;
4678
+ static readonly typeName = "transcodely.v1.SubtitleResult";
4679
+ static readonly fields: FieldList;
4680
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): SubtitleResult;
4681
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): SubtitleResult;
4682
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): SubtitleResult;
4683
+ static equals(a: SubtitleResult | PlainMessage<SubtitleResult> | undefined, b: SubtitleResult | PlainMessage<SubtitleResult> | undefined): boolean;
4684
+ }
3910
4685
 
3911
4686
  /**
3912
4687
  * DRM system.
@@ -4097,6 +4872,11 @@ declare class DRMConfig extends Message<DRMConfig> {
4097
4872
  /**
4098
4873
  * Content-aware encoding mode.
4099
4874
  *
4875
+ * NOT YET SUPPORTED. The worker pipeline does not yet act on content-aware
4876
+ * encoding, so any output carrying a ContentAwareConfig is rejected at CreateJob
4877
+ * with error code `parameter_unsupported` (see issue #167). The enum values are
4878
+ * retained for wire compatibility and will become active when the feature ships.
4879
+ *
4100
4880
  * @generated from enum transcodely.v1.ContentAwareMode
4101
4881
  */
4102
4882
  declare enum ContentAwareMode {
@@ -4105,13 +4885,15 @@ declare enum ContentAwareMode {
4105
4885
  */
4106
4886
  UNSPECIFIED = 0,
4107
4887
  /**
4108
- * Optimize CRF for target VMAF on specific content.
4888
+ * Optimize CRF for target VMAF on specific content. NOT YET SUPPORTED —
4889
+ * rejected at create.
4109
4890
  *
4110
4891
  * @generated from enum value: CONTENT_AWARE_MODE_PER_TITLE = 1;
4111
4892
  */
4112
4893
  PER_TITLE = 1,
4113
4894
  /**
4114
- * Generate optimal bitrate ladder automatically.
4895
+ * Generate optimal bitrate ladder automatically. NOT YET SUPPORTED —
4896
+ * rejected at create.
4115
4897
  *
4116
4898
  * @generated from enum value: CONTENT_AWARE_MODE_AUTO_ABR = 2;
4117
4899
  */
@@ -4120,6 +4902,10 @@ declare enum ContentAwareMode {
4120
4902
  /**
4121
4903
  * Auto ABR ladder generation constraints.
4122
4904
  *
4905
+ * NOT YET SUPPORTED — see ContentAwareConfig. These constraints are validated
4906
+ * for shape but never applied, because a request carrying content_aware is
4907
+ * rejected at create.
4908
+ *
4123
4909
  * @generated from message transcodely.v1.AutoABRConfig
4124
4910
  */
4125
4911
  declare class AutoABRConfig extends Message<AutoABRConfig> {
@@ -4131,105 +4917,282 @@ declare class AutoABRConfig extends Message<AutoABRConfig> {
4131
4917
  */
4132
4918
  minVariants?: number;
4133
4919
  /**
4134
- * Maximum number of variants in the ladder.
4135
- * Default: 8.
4136
- *
4137
- * @generated from field: optional int32 max_variants = 2;
4920
+ * Maximum number of variants in the ladder.
4921
+ * Default: 8.
4922
+ *
4923
+ * @generated from field: optional int32 max_variants = 2;
4924
+ */
4925
+ maxVariants?: number;
4926
+ /**
4927
+ * Lowest resolution in the generated ladder.
4928
+ *
4929
+ * @generated from field: transcodely.v1.Resolution min_resolution = 3;
4930
+ */
4931
+ minResolution: Resolution;
4932
+ /**
4933
+ * Highest resolution in the generated ladder.
4934
+ *
4935
+ * @generated from field: transcodely.v1.Resolution max_resolution = 4;
4936
+ */
4937
+ maxResolution: Resolution;
4938
+ constructor(data?: PartialMessage<AutoABRConfig>);
4939
+ static readonly runtime: typeof proto3;
4940
+ static readonly typeName = "transcodely.v1.AutoABRConfig";
4941
+ static readonly fields: FieldList;
4942
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): AutoABRConfig;
4943
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): AutoABRConfig;
4944
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): AutoABRConfig;
4945
+ static equals(a: AutoABRConfig | PlainMessage<AutoABRConfig> | undefined, b: AutoABRConfig | PlainMessage<AutoABRConfig> | undefined): boolean;
4946
+ }
4947
+ /**
4948
+ * Content-aware encoding configuration for an output.
4949
+ *
4950
+ * NOT YET SUPPORTED. Setting content_aware on any output causes CreateJob to
4951
+ * fail with error code `parameter_unsupported` and the message "content-aware
4952
+ * encoding (per_title/auto_abr) is not yet supported". The worker does not yet
4953
+ * implement per-title CRF optimization or auto-ABR ladder generation — both
4954
+ * modes would run the identical plain-encode path — so the API rejects the
4955
+ * request rather than silently no-op it while charging the content-aware
4956
+ * multiplier (issue #167 / transcodely/worker#90). The message and fields are
4957
+ * retained for wire compatibility and forward-planning.
4958
+ *
4959
+ * @generated from message transcodely.v1.ContentAwareConfig
4960
+ */
4961
+ declare class ContentAwareConfig extends Message<ContentAwareConfig> {
4962
+ /**
4963
+ * Encoding mode (required). NOT YET SUPPORTED — any value here causes the
4964
+ * request to be rejected at create.
4965
+ *
4966
+ * @generated from field: transcodely.v1.ContentAwareMode mode = 1;
4967
+ */
4968
+ mode: ContentAwareMode;
4969
+ /**
4970
+ * Override VMAF target (70-99). NOT YET SUPPORTED — content-aware encoding is
4971
+ * rejected at create, so this value is never applied.
4972
+ *
4973
+ * @generated from field: optional double vmaf_target = 2;
4974
+ */
4975
+ vmafTarget?: number;
4976
+ /**
4977
+ * Auto ABR constraints (only for auto_abr mode). NOT YET SUPPORTED — rejected
4978
+ * at create.
4979
+ *
4980
+ * @generated from field: optional transcodely.v1.AutoABRConfig auto_abr = 3;
4981
+ */
4982
+ autoAbr?: AutoABRConfig;
4983
+ constructor(data?: PartialMessage<ContentAwareConfig>);
4984
+ static readonly runtime: typeof proto3;
4985
+ static readonly typeName = "transcodely.v1.ContentAwareConfig";
4986
+ static readonly fields: FieldList;
4987
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ContentAwareConfig;
4988
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ContentAwareConfig;
4989
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ContentAwareConfig;
4990
+ static equals(a: ContentAwareConfig | PlainMessage<ContentAwareConfig> | undefined, b: ContentAwareConfig | PlainMessage<ContentAwareConfig> | undefined): boolean;
4991
+ }
4992
+ /**
4993
+ * Content analysis results from extended probe.
4994
+ *
4995
+ * NOT YET POPULATED. Produced only when content-aware analysis is wired in the
4996
+ * worker; today no job carries it, because content_aware requests are rejected
4997
+ * at create (see ContentAwareConfig).
4998
+ *
4999
+ * @generated from message transcodely.v1.ContentAnalysis
5000
+ */
5001
+ declare class ContentAnalysis extends Message<ContentAnalysis> {
5002
+ /**
5003
+ * Overall encoding complexity (0-1).
5004
+ *
5005
+ * @generated from field: double complexity_score = 1;
5006
+ */
5007
+ complexityScore: number;
5008
+ /**
5009
+ * Temporal complexity - amount of motion (0-1).
5010
+ *
5011
+ * @generated from field: double motion_score = 2;
5012
+ */
5013
+ motionScore: number;
5014
+ /**
5015
+ * Spatial detail complexity (0-1).
5016
+ *
5017
+ * @generated from field: double texture_score = 3;
5018
+ */
5019
+ textureScore: number;
5020
+ /**
5021
+ * Detected content type.
5022
+ *
5023
+ * @generated from field: string content_type = 4;
5024
+ */
5025
+ contentType: string;
5026
+ constructor(data?: PartialMessage<ContentAnalysis>);
5027
+ static readonly runtime: typeof proto3;
5028
+ static readonly typeName = "transcodely.v1.ContentAnalysis";
5029
+ static readonly fields: FieldList;
5030
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ContentAnalysis;
5031
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ContentAnalysis;
5032
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ContentAnalysis;
5033
+ static equals(a: ContentAnalysis | PlainMessage<ContentAnalysis> | undefined, b: ContentAnalysis | PlainMessage<ContentAnalysis> | undefined): boolean;
5034
+ }
5035
+
5036
+ /**
5037
+ * Anchor position for a relatively-placed watermark. The watermark is aligned
5038
+ * to the named region of each rendition's frame, so a single config places the
5039
+ * overlay consistently across every ABR rung regardless of output resolution.
5040
+ * Wire form is lowercase (e.g. "bottom_right") via the codec.
5041
+ *
5042
+ * @generated from enum transcodely.v1.WatermarkAnchor
5043
+ */
5044
+ declare enum WatermarkAnchor {
5045
+ /**
5046
+ * Default value; treated as bottom_right when unset.
5047
+ *
5048
+ * @generated from enum value: WATERMARK_ANCHOR_UNSPECIFIED = 0;
5049
+ */
5050
+ UNSPECIFIED = 0,
5051
+ /**
5052
+ * @generated from enum value: WATERMARK_ANCHOR_TOP_LEFT = 1;
5053
+ */
5054
+ TOP_LEFT = 1,
5055
+ /**
5056
+ * @generated from enum value: WATERMARK_ANCHOR_TOP_CENTER = 2;
5057
+ */
5058
+ TOP_CENTER = 2,
5059
+ /**
5060
+ * @generated from enum value: WATERMARK_ANCHOR_TOP_RIGHT = 3;
5061
+ */
5062
+ TOP_RIGHT = 3,
5063
+ /**
5064
+ * @generated from enum value: WATERMARK_ANCHOR_MIDDLE_LEFT = 4;
5065
+ */
5066
+ MIDDLE_LEFT = 4,
5067
+ /**
5068
+ * @generated from enum value: WATERMARK_ANCHOR_MIDDLE_CENTER = 5;
5069
+ */
5070
+ MIDDLE_CENTER = 5,
5071
+ /**
5072
+ * @generated from enum value: WATERMARK_ANCHOR_MIDDLE_RIGHT = 6;
5073
+ */
5074
+ MIDDLE_RIGHT = 6,
5075
+ /**
5076
+ * @generated from enum value: WATERMARK_ANCHOR_BOTTOM_LEFT = 7;
4138
5077
  */
4139
- maxVariants?: number;
5078
+ BOTTOM_LEFT = 7,
4140
5079
  /**
4141
- * Lowest resolution in the generated ladder.
4142
- *
4143
- * @generated from field: transcodely.v1.Resolution min_resolution = 3;
5080
+ * @generated from enum value: WATERMARK_ANCHOR_BOTTOM_CENTER = 8;
4144
5081
  */
4145
- minResolution: Resolution;
5082
+ BOTTOM_CENTER = 8,
4146
5083
  /**
4147
- * Highest resolution in the generated ladder.
4148
- *
4149
- * @generated from field: transcodely.v1.Resolution max_resolution = 4;
5084
+ * @generated from enum value: WATERMARK_ANCHOR_BOTTOM_RIGHT = 9;
4150
5085
  */
4151
- maxResolution: Resolution;
4152
- constructor(data?: PartialMessage<AutoABRConfig>);
4153
- static readonly runtime: typeof proto3;
4154
- static readonly typeName = "transcodely.v1.AutoABRConfig";
4155
- static readonly fields: FieldList;
4156
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): AutoABRConfig;
4157
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): AutoABRConfig;
4158
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): AutoABRConfig;
4159
- static equals(a: AutoABRConfig | PlainMessage<AutoABRConfig> | undefined, b: AutoABRConfig | PlainMessage<AutoABRConfig> | undefined): boolean;
5086
+ BOTTOM_RIGHT = 9
4160
5087
  }
4161
5088
  /**
4162
- * Content-aware encoding configuration for an output.
5089
+ * Absolute pixel placement for a watermark (advanced / "hacker mode"). The
5090
+ * overlay is drawn at an exact pixel offset and scaled to an exact pixel width;
5091
+ * unlike the relative anchor/width_pct fields, these coordinates do NOT adapt
5092
+ * across ABR rungs — a placement tuned for a 1080p rung will sit at the same
5093
+ * pixel offset on a 360p rung, so this is intended for single-rendition outputs
5094
+ * or advanced users who accept that trade-off.
4163
5095
  *
4164
- * @generated from message transcodely.v1.ContentAwareConfig
5096
+ * @generated from message transcodely.v1.WatermarkPixelPlacement
4165
5097
  */
4166
- declare class ContentAwareConfig extends Message<ContentAwareConfig> {
5098
+ declare class WatermarkPixelPlacement extends Message<WatermarkPixelPlacement> {
4167
5099
  /**
4168
- * Encoding mode (required).
5100
+ * Horizontal offset in pixels from the top-left origin of the frame.
4169
5101
  *
4170
- * @generated from field: transcodely.v1.ContentAwareMode mode = 1;
5102
+ * @generated from field: int32 x = 1;
4171
5103
  */
4172
- mode: ContentAwareMode;
5104
+ x: number;
4173
5105
  /**
4174
- * Override VMAF target (70-99).
4175
- * Defaults from quality tier: economy=88, standard=93, premium=97.
5106
+ * Vertical offset in pixels from the top-left origin of the frame.
4176
5107
  *
4177
- * @generated from field: optional double vmaf_target = 2;
5108
+ * @generated from field: int32 y = 2;
4178
5109
  */
4179
- vmafTarget?: number;
5110
+ y: number;
4180
5111
  /**
4181
- * Auto ABR constraints (only for auto_abr mode).
5112
+ * Watermark width in pixels. The overlay image is scaled to this width and
5113
+ * its height is derived automatically from the source aspect ratio.
4182
5114
  *
4183
- * @generated from field: optional transcodely.v1.AutoABRConfig auto_abr = 3;
5115
+ * @generated from field: int32 width = 3;
4184
5116
  */
4185
- autoAbr?: AutoABRConfig;
4186
- constructor(data?: PartialMessage<ContentAwareConfig>);
5117
+ width: number;
5118
+ constructor(data?: PartialMessage<WatermarkPixelPlacement>);
4187
5119
  static readonly runtime: typeof proto3;
4188
- static readonly typeName = "transcodely.v1.ContentAwareConfig";
5120
+ static readonly typeName = "transcodely.v1.WatermarkPixelPlacement";
4189
5121
  static readonly fields: FieldList;
4190
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ContentAwareConfig;
4191
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ContentAwareConfig;
4192
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ContentAwareConfig;
4193
- static equals(a: ContentAwareConfig | PlainMessage<ContentAwareConfig> | undefined, b: ContentAwareConfig | PlainMessage<ContentAwareConfig> | undefined): boolean;
5122
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): WatermarkPixelPlacement;
5123
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): WatermarkPixelPlacement;
5124
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WatermarkPixelPlacement;
5125
+ static equals(a: WatermarkPixelPlacement | PlainMessage<WatermarkPixelPlacement> | undefined, b: WatermarkPixelPlacement | PlainMessage<WatermarkPixelPlacement> | undefined): boolean;
4194
5126
  }
4195
5127
  /**
4196
- * Content analysis results from extended probe.
5128
+ * Watermark / logo overlay baked into the encoded video of an output.
4197
5129
  *
4198
- * @generated from message transcodely.v1.ContentAnalysis
5130
+ * Two placement modes exist and are mutually exclusive:
5131
+ * * Relative (default): anchor + width_pct + margin_pct scale the overlay
5132
+ * consistently across every ABR rung.
5133
+ * * Pixel (advanced): the `pixel` submessage places the overlay at an exact
5134
+ * pixel offset and width (does not adapt across rungs).
5135
+ * `image_url` and `opacity` apply in both modes. The mutual exclusivity of
5136
+ * `pixel` with the relative fields is enforced server-side by the feature
5137
+ * validator.
5138
+ *
5139
+ * @generated from message transcodely.v1.WatermarkConfig
4199
5140
  */
4200
- declare class ContentAnalysis extends Message<ContentAnalysis> {
5141
+ declare class WatermarkConfig extends Message<WatermarkConfig> {
4201
5142
  /**
4202
- * Overall encoding complexity (0-1).
5143
+ * Public http(s) URL of the overlay image. Must be a PNG or WebP image
5144
+ * (alpha-capable formats only). Validated server-side at job creation: the
5145
+ * image is fetched through the SSRF-guarded transport, its format is checked
5146
+ * by magic bytes + decode, and size/dimension caps are enforced.
4203
5147
  *
4204
- * @generated from field: double complexity_score = 1;
5148
+ * @generated from field: string image_url = 1;
4205
5149
  */
4206
- complexityScore: number;
5150
+ imageUrl: string;
4207
5151
  /**
4208
- * Temporal complexity - amount of motion (0-1).
5152
+ * Anchor region the overlay is aligned to (relative mode). Defaults to
5153
+ * bottom_right when unset. Ignored when `pixel` is set.
4209
5154
  *
4210
- * @generated from field: double motion_score = 2;
5155
+ * @generated from field: optional transcodely.v1.WatermarkAnchor anchor = 2;
4211
5156
  */
4212
- motionScore: number;
5157
+ anchor?: WatermarkAnchor;
4213
5158
  /**
4214
- * Spatial detail complexity (0-1).
5159
+ * Watermark width as a percentage of each rendition's output width (relative
5160
+ * mode). Scales consistently across every ABR rung. Range (0, 100].
5161
+ * Defaults to 15 when unset. Ignored when `pixel` is set.
4215
5162
  *
4216
- * @generated from field: double texture_score = 3;
5163
+ * @generated from field: optional double width_pct = 3;
4217
5164
  */
4218
- textureScore: number;
5165
+ widthPct?: number;
4219
5166
  /**
4220
- * Detected content type.
5167
+ * Margin from the anchored edges as a percentage of output width (relative
5168
+ * mode). Range [0, 40]. Defaults to 2 when unset. Ignored when `pixel` is set.
4221
5169
  *
4222
- * @generated from field: string content_type = 4;
5170
+ * @generated from field: optional double margin_pct = 4;
4223
5171
  */
4224
- contentType: string;
4225
- constructor(data?: PartialMessage<ContentAnalysis>);
5172
+ marginPct?: number;
5173
+ /**
5174
+ * Overlay opacity. Range (0, 1]. Defaults to 1.0 (fully opaque) when unset.
5175
+ * Applies in both relative and pixel modes.
5176
+ *
5177
+ * @generated from field: optional double opacity = 5;
5178
+ */
5179
+ opacity?: number;
5180
+ /**
5181
+ * Absolute pixel placement (advanced mode). Mutually exclusive with anchor,
5182
+ * width_pct, and margin_pct — supplying `pixel` together with any of those is
5183
+ * rejected at job creation.
5184
+ *
5185
+ * @generated from field: optional transcodely.v1.WatermarkPixelPlacement pixel = 6;
5186
+ */
5187
+ pixel?: WatermarkPixelPlacement;
5188
+ constructor(data?: PartialMessage<WatermarkConfig>);
4226
5189
  static readonly runtime: typeof proto3;
4227
- static readonly typeName = "transcodely.v1.ContentAnalysis";
5190
+ static readonly typeName = "transcodely.v1.WatermarkConfig";
4228
5191
  static readonly fields: FieldList;
4229
- static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ContentAnalysis;
4230
- static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ContentAnalysis;
4231
- static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ContentAnalysis;
4232
- static equals(a: ContentAnalysis | PlainMessage<ContentAnalysis> | undefined, b: ContentAnalysis | PlainMessage<ContentAnalysis> | undefined): boolean;
5192
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): WatermarkConfig;
5193
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): WatermarkConfig;
5194
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WatermarkConfig;
5195
+ static equals(a: WatermarkConfig | PlainMessage<WatermarkConfig> | undefined, b: WatermarkConfig | PlainMessage<WatermarkConfig> | undefined): boolean;
4233
5196
  }
4234
5197
 
4235
5198
  /**
@@ -4652,6 +5615,12 @@ declare class Origin extends Message<Origin> {
4652
5615
  * @generated from field: string id = 1;
4653
5616
  */
4654
5617
  id: string;
5618
+ /**
5619
+ * Parent app that owns this origin. Server-set; ignored on requests.
5620
+ *
5621
+ * @generated from field: string app_id = 19;
5622
+ */
5623
+ appId: string;
4655
5624
  /**
4656
5625
  * Human-readable name for the origin.
4657
5626
  *
@@ -4843,6 +5812,15 @@ declare class CreateOriginRequest extends Message<CreateOriginRequest> {
4843
5812
  * @generated from field: transcodely.v1.R2OriginConfig r2 = 9;
4844
5813
  */
4845
5814
  r2?: R2OriginConfig;
5815
+ /**
5816
+ * Optional target app. API-key callers may omit it (their key's app is used)
5817
+ * or pass their own app; a different app is rejected with PermissionDenied.
5818
+ * Portal/JWT callers pass it to create in a specific app in their org;
5819
+ * omitted selects the org's first active app.
5820
+ *
5821
+ * @generated from field: optional string app_id = 10;
5822
+ */
5823
+ appId?: string;
4846
5824
  constructor(data?: PartialMessage<CreateOriginRequest>);
4847
5825
  static readonly runtime: typeof proto3;
4848
5826
  static readonly typeName = "transcodely.v1.CreateOriginRequest";
@@ -5008,6 +5986,15 @@ declare class ListOriginsRequest extends Message<ListOriginsRequest> {
5008
5986
  * @generated from field: transcodely.v1.PaginationRequest pagination = 5;
5009
5987
  */
5010
5988
  pagination?: PaginationRequest;
5989
+ /**
5990
+ * Optional app filter. API-key callers may omit it (their key's app is used)
5991
+ * or pass their own app; a different app is rejected with PermissionDenied.
5992
+ * Portal/JWT callers pass it to list a specific app in their org; omitted
5993
+ * returns origins across all apps in the org.
5994
+ *
5995
+ * @generated from field: optional string app_id = 6;
5996
+ */
5997
+ appId?: string;
5011
5998
  constructor(data?: PartialMessage<ListOriginsRequest>);
5012
5999
  static readonly runtime: typeof proto3;
5013
6000
  static readonly typeName = "transcodely.v1.ListOriginsRequest";
@@ -5554,7 +6541,33 @@ declare enum ThumbnailMode {
5554
6541
  *
5555
6542
  * @generated from enum value: THUMBNAIL_MODE_TIMESTAMPS = 4;
5556
6543
  */
5557
- TIMESTAMPS = 4
6544
+ TIMESTAMPS = 4,
6545
+ /**
6546
+ * Generate short animated hover-preview loops for card/grid previews.
6547
+ *
6548
+ * Free and bundled — animated previews add NO cost to a job (thumbnails are
6549
+ * priced at 0). By default the worker produces BOTH an animated WebP and a
6550
+ * muted MP4 loop from the same samples, so a consumer can pick whichever its
6551
+ * surface supports. Set `format = webp` to emit only the WebP.
6552
+ *
6553
+ * Sampling is deterministic: unless `start_offsets` is set, clips are taken at
6554
+ * fixed 25% / 50% / 75% marks of the source duration (no scene detection).
6555
+ * Smart defaults (applied worker-side; the API stores exactly what was sent):
6556
+ * ~4 s total duration, 12 fps, 320 px wide.
6557
+ *
6558
+ * The animated WebP is hard-capped at 10 s: when `duration_seconds` exceeds
6559
+ * 10 the WebP is skipped and the output is MP4-only (documented, not an
6560
+ * error) — unless `format = webp` is set explicitly, in which case a
6561
+ * `duration_seconds` above 10 is rejected at job creation.
6562
+ *
6563
+ * Valid config for this mode: `width`, `height`, `quality` (maps to WebP
6564
+ * encode quality), `duration_seconds`, `fps`, `start_offsets`, `path_template`.
6565
+ * The single/interval/sprite/timestamps fields (`timestamp`,
6566
+ * `interval_seconds`, `timestamps`, `sprite_columns`) are not valid here.
6567
+ *
6568
+ * @generated from enum value: THUMBNAIL_MODE_ANIMATED = 5;
6569
+ */
6570
+ ANIMATED = 5
5558
6571
  }
5559
6572
  /**
5560
6573
  * Thumbnail output format.
@@ -5617,7 +6630,10 @@ declare class ThumbnailSpec extends Message<ThumbnailSpec> {
5617
6630
  */
5618
6631
  quality?: number;
5619
6632
  /**
5620
- * Timestamp in seconds for single mode.
6633
+ * Timestamp in seconds for single mode. When omitted, the worker
6634
+ * smart-selects a representative non-black frame from the opening of the
6635
+ * video (deterministic per input) instead of extracting the frame at t=0.
6636
+ * An explicit value — including 0 — extracts exactly that frame.
5621
6637
  *
5622
6638
  * @generated from field: optional double timestamp = 6;
5623
6639
  */
@@ -5653,6 +6669,13 @@ declare class ThumbnailSpec extends Message<ThumbnailSpec> {
5653
6669
  * {format} (image format: jpeg|png|webp), {thumb_index} (0-based),
5654
6670
  * {thumb_time} (seconds, file-safe), {thumb_time_ms} (milliseconds).
5655
6671
  *
6672
+ * Output-only variables ({output_id}, {codec}, {resolution}, {bitrate},
6673
+ * {quality}, {preset_id}, {output_index}, {segment_*}) are NOT valid here — a
6674
+ * thumbnail is not a rendition, so a thumbnail render context can't resolve
6675
+ * them and the literal token would land in the storage key. Setting one is a
6676
+ * validation error. (When a thumbnail INHERITS the output origin's template
6677
+ * instead, those variables are stripped automatically.)
6678
+ *
5656
6679
  * Example: "video/{video_id}/poster/{thumb_index}".
5657
6680
  *
5658
6681
  * Must not start with `/` or contain `..` (no path traversal). When set, it
@@ -5663,6 +6686,34 @@ declare class ThumbnailSpec extends Message<ThumbnailSpec> {
5663
6686
  * @generated from field: optional string path_template = 10;
5664
6687
  */
5665
6688
  pathTemplate?: string;
6689
+ /**
6690
+ * Total length of each animated preview clip, in seconds (animated mode only).
6691
+ * Range: 2-30. Default (unset): ~4 s, applied worker-side. The animated WebP
6692
+ * is hard-capped at 10 s: above 10 s the WebP is skipped and only the MP4 loop
6693
+ * is produced (unless format=webp is set explicitly, which then rejects
6694
+ * duration_seconds > 10). Only valid for animated mode.
6695
+ *
6696
+ * @generated from field: optional double duration_seconds = 11;
6697
+ */
6698
+ durationSeconds?: number;
6699
+ /**
6700
+ * Frames per second of the animated preview (animated mode only).
6701
+ * Range: 8-15. Default (unset): 12, applied worker-side. Only valid for
6702
+ * animated mode.
6703
+ *
6704
+ * @generated from field: optional int32 fps = 12;
6705
+ */
6706
+ fps?: number;
6707
+ /**
6708
+ * Explicit clip start offsets in seconds from the source start (animated mode
6709
+ * only). When set (max 3 entries, each >= 0), these replace the default
6710
+ * 25%/50%/75% sampling marks; the worker clamps each offset to the source
6711
+ * duration. Unset → the deterministic 25%/50%/75% marks. Only valid for
6712
+ * animated mode.
6713
+ *
6714
+ * @generated from field: repeated double start_offsets = 13;
6715
+ */
6716
+ startOffsets: number[];
5666
6717
  constructor(data?: PartialMessage<ThumbnailSpec>);
5667
6718
  static readonly runtime: typeof proto3;
5668
6719
  static readonly typeName = "transcodely.v1.ThumbnailSpec";
@@ -5700,14 +6751,16 @@ declare class ThumbnailResult extends Message<ThumbnailResult> {
5700
6751
  url: string;
5701
6752
  /**
5702
6753
  * Generation mode that produced this file: single | interval | sprite |
5703
- * timestamps. Lowercase string on the wire.
6754
+ * timestamps | animated. Lowercase string on the wire.
5704
6755
  *
5705
6756
  * @generated from field: string mode = 3;
5706
6757
  */
5707
6758
  mode: string;
5708
6759
  /**
5709
6760
  * File format: jpeg | png | webp. The sprite mode's WebVTT sidecar uses
5710
- * "vtt".
6761
+ * "vtt". Animated mode yields "webp" (the animated WebP) and "mp4" (the muted
6762
+ * MP4 loop) — "mp4" rides this free-form string; it is not a ThumbnailFormat
6763
+ * enum value.
5711
6764
  *
5712
6765
  * @generated from field: string format = 4;
5713
6766
  */
@@ -6275,6 +7328,16 @@ declare class OutputSpec extends Message<OutputSpec> {
6275
7328
  * @generated from field: optional bool disable_audio = 16;
6276
7329
  */
6277
7330
  disableAudio?: boolean;
7331
+ /**
7332
+ * Watermark / logo overlay for this output. When set, the overlay is baked
7333
+ * into the encoded video of this output (like subtitle burn-in). Billed under
7334
+ * the unified overlay multiplier class: 1.1x once per output regardless of how
7335
+ * many pixel-burning overlays are enabled (a watermark and burned-in subtitles
7336
+ * together are still a single 1.1x, never 1.21x).
7337
+ *
7338
+ * @generated from field: optional transcodely.v1.WatermarkConfig watermark = 17;
7339
+ */
7340
+ watermark?: WatermarkConfig;
6278
7341
  constructor(data?: PartialMessage<OutputSpec>);
6279
7342
  static readonly runtime: typeof proto3;
6280
7343
  static readonly typeName = "transcodely.v1.OutputSpec";
@@ -6564,8 +7627,9 @@ declare class JobOutput extends Message<JobOutput> {
6564
7627
  estimatedCost?: number;
6565
7628
  /**
6566
7629
  * Actual cost (calculated after encoding using locked pricing and actual duration).
6567
- * For canceled outputs, this reflects cost of encoded portion.
6568
- * For failed outputs, this is zero.
7630
+ * Only a completed output is billable, so this is zero for both canceled and
7631
+ * failed outputs — a canceled output produced nothing usable, no matter how
7632
+ * far its encode got.
6569
7633
  *
6570
7634
  * @generated from field: optional double actual_cost = 11;
6571
7635
  */
@@ -6896,6 +7960,12 @@ declare class Job extends Message<Job> {
6896
7960
  * @generated from field: string id = 1;
6897
7961
  */
6898
7962
  id: string;
7963
+ /**
7964
+ * Parent app that owns this job. Server-set; ignored on requests.
7965
+ *
7966
+ * @generated from field: string app_id = 29;
7967
+ */
7968
+ appId: string;
6899
7969
  /**
6900
7970
  * URL of the input video file (direct URL mode).
6901
7971
  * Set if the job was created with input_url.
@@ -6956,8 +8026,21 @@ declare class Job extends Message<Job> {
6956
8026
  */
6957
8027
  totalEstimatedCost?: number;
6958
8028
  /**
6959
- * Total actual cost (sum of completed/canceled outputs).
6960
- * Failed outputs contribute zero to this total.
8029
+ * Total actual cost — what the job is billed, in the job's currency.
8030
+ *
8031
+ * Only completed outputs are billable, and what happened to the job as a
8032
+ * whole decides whether they are billed at all:
8033
+ * - completed: the sum of its outputs' actual costs, raised to
8034
+ * minimum_charge_eur if that minimum is in effect.
8035
+ * - canceled: the sum of the outputs that had already completed and been
8036
+ * delivered when the cancel landed. Identical whether the job was
8037
+ * canceled through CancelJob or observed as canceled by the worker. The
8038
+ * minimum charge never applies.
8039
+ * - failed: zero. A job that ends failed is not billed, even if some of
8040
+ * its outputs completed before the failure.
8041
+ * - partial: the sum of the outputs that completed, un-floored.
8042
+ * Additive fees (see fees) are included on top, and are charged only on jobs
8043
+ * that ended completed or partial.
6961
8044
  *
6962
8045
  * @generated from field: optional double total_actual_cost = 9;
6963
8046
  */
@@ -7059,6 +8142,16 @@ declare class Job extends Message<Job> {
7059
8142
  * @generated from field: repeated transcodely.v1.ThumbnailResult thumbnail_results = 28;
7060
8143
  */
7061
8144
  thumbnailResults: ThumbnailResult[];
8145
+ /**
8146
+ * Generated/processed subtitle artifacts (populated after the job
8147
+ * completes). Each entry carries the worker-built storage `url` plus the
8148
+ * `output_id` it was configured on. Auto-generated captions (operation
8149
+ * generate) additionally expose a segment-level transcript. Mirrors how
8150
+ * JobOutput.output_url surfaces rendition results.
8151
+ *
8152
+ * @generated from field: repeated transcodely.v1.SubtitleResult subtitle_results = 32;
8153
+ */
8154
+ subtitleResults: SubtitleResult[];
7062
8155
  /**
7063
8156
  * Job-level output path template (echoed from request).
7064
8157
  * Variables: {job_id}, {output_id}, {date}, {timestamp}, {codec}, {resolution}, {format}, {quality}, {output_index}, {uuid}
@@ -7077,6 +8170,72 @@ declare class Job extends Message<Job> {
7077
8170
  * @generated from field: string object = 27;
7078
8171
  */
7079
8172
  object: string;
8173
+ /**
8174
+ * Minimum charge for this job in EUR, locked at creation and never changed
8175
+ * retroactively. It is derived from the job's assigned billing class — a size
8176
+ * band (small/medium/large/extra-large) reflecting the compute the job is
8177
+ * guaranteed to cover — or, in legacy configurations, from the recommended
8178
+ * machine size; either way it is a stable quote, not re-derived from the
8179
+ * machine the job ultimately runs on. When the minimum charge is in effect,
8180
+ * the billed total for a successfully completed job is
8181
+ * max(sum of output costs, minimum_charge_eur) — see minimum_charge_applied
8182
+ * for whether it determined this job's total. The minimum applies only to
8183
+ * jobs that reach completed: a failed job is billed zero, and a canceled or
8184
+ * partial job is billed the un-floored sum of the outputs it did complete.
8185
+ * Absent when no minimum was computed for this job.
8186
+ *
8187
+ * @generated from field: optional double minimum_charge_eur = 30;
8188
+ */
8189
+ minimumChargeEur?: number;
8190
+ /**
8191
+ * Whether minimum_charge_eur determined the job's most recently computed
8192
+ * total — true when the sum of output costs came in below the minimum and
8193
+ * the total was raised to it (estimated total after probe; actual total
8194
+ * after successful completion). When true, total_estimated_cost or
8195
+ * total_actual_cost exceeds the sum of the per-output cost fields, which
8196
+ * are never raised themselves. The minimum is a stable quote locked at
8197
+ * creation (from the job's billing class, or the recommended machine size in
8198
+ * legacy configurations); it is never re-derived from the machine the job
8199
+ * ultimately runs on.
8200
+ *
8201
+ * @generated from field: bool minimum_charge_applied = 31;
8202
+ */
8203
+ minimumChargeApplied: boolean;
8204
+ /**
8205
+ * Additive fee line items (v1: AI caption generation). Fees are charged ON
8206
+ * TOP of the encode bill and sit OUTSIDE the minimum-charge floor:
8207
+ * billed total = max(sum of output costs, minimum_charge_eur) + sum of fees.
8208
+ * total_estimated_cost / total_actual_cost INCLUDE fees; this list exposes
8209
+ * the decomposition. Only live fees are listed — a fee that was voided
8210
+ * (job failed/canceled, or the artifact was never produced) is dropped
8211
+ * from the list and never charged. Server-set; read-only.
8212
+ *
8213
+ * @generated from field: repeated transcodely.v1.JobFee fees = 33;
8214
+ */
8215
+ fees: JobFee[];
8216
+ /**
8217
+ * Hosted video ID used as the input source (video mode), echoed from the
8218
+ * request. Empty when the job was created with input_url or
8219
+ * input_origin_id. Server-set; read-only.
8220
+ *
8221
+ * @generated from field: string input_video_id = 34;
8222
+ */
8223
+ inputVideoId: string;
8224
+ /**
8225
+ * Auto-generated chapter tracks, one per output whose generated caption track
8226
+ * had chapters enabled (SubtitleTrack.generate_chapters). Not yet populated:
8227
+ * the auto-chapters feature is rolling out together with generated captions.
8228
+ *
8229
+ * @generated from field: repeated transcodely.v1.ChapterResult chapter_results = 35;
8230
+ */
8231
+ chapterResults: ChapterResult[];
8232
+ /**
8233
+ * Clip range this job encodes (echoed from request). Absent when the job
8234
+ * encodes the full input.
8235
+ *
8236
+ * @generated from field: optional transcodely.v1.ClipConfig clip = 36;
8237
+ */
8238
+ clip?: ClipConfig;
7080
8239
  constructor(data?: PartialMessage<Job>);
7081
8240
  static readonly runtime: typeof proto3;
7082
8241
  static readonly typeName = "transcodely.v1.Job";
@@ -7086,6 +8245,120 @@ declare class Job extends Message<Job> {
7086
8245
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): Job;
7087
8246
  static equals(a: Job | PlainMessage<Job> | undefined, b: Job | PlainMessage<Job> | undefined): boolean;
7088
8247
  }
8248
+ /**
8249
+ * A single additive fee line item on a job (see Job.fees). Fees are metered
8250
+ * charges for services performed alongside the encode (v1: AI caption
8251
+ * generation at EUR 0.05 per source minute). A fee is charged once per job,
8252
+ * estimated when the input probe supplies the source duration, and only
8253
+ * billed when the completion report shows the fee's artifact was actually
8254
+ * produced (no artifact, no fee). Fees are never absorbed by the per-job
8255
+ * minimum charge: billed total = max(sum of output costs, minimum_charge_eur)
8256
+ * + sum of fees. Read-only.
8257
+ *
8258
+ * @generated from message transcodely.v1.JobFee
8259
+ */
8260
+ declare class JobFee extends Message<JobFee> {
8261
+ /**
8262
+ * Fee discriminator — the fee pricing rule's key. v1: "captions".
8263
+ *
8264
+ * @generated from field: string fee_type = 1;
8265
+ */
8266
+ feeType: string;
8267
+ /**
8268
+ * Human-readable description of what the fee is for
8269
+ * (e.g., "AI Caption Generation").
8270
+ *
8271
+ * @generated from field: string description = 2;
8272
+ */
8273
+ description: string;
8274
+ /**
8275
+ * Metering unit. v1: "source_minute" (input duration in minutes).
8276
+ *
8277
+ * @generated from field: string unit = 3;
8278
+ */
8279
+ unit: string;
8280
+ /**
8281
+ * Metered quantity in `unit`s — the exact fraction, e.g. a 90-second
8282
+ * source is 1.5 source minutes. 0 until the input probe completes.
8283
+ *
8284
+ * @generated from field: double quantity = 4;
8285
+ */
8286
+ quantity: number;
8287
+ /**
8288
+ * Price per unit in `currency`, locked at job creation from the
8289
+ * then-effective fee pricing rule (e.g., 0.05).
8290
+ *
8291
+ * @generated from field: double rate = 5;
8292
+ */
8293
+ rate: number;
8294
+ /**
8295
+ * quantity x rate, in `currency`. 0 until the input probe completes.
8296
+ *
8297
+ * @generated from field: double amount = 6;
8298
+ */
8299
+ amount: number;
8300
+ /**
8301
+ * Currency for rate/amount (ISO 4217 code, e.g., "EUR"). Matches the
8302
+ * job-level currency field.
8303
+ *
8304
+ * @generated from field: string currency = 7;
8305
+ */
8306
+ currency: string;
8307
+ constructor(data?: PartialMessage<JobFee>);
8308
+ static readonly runtime: typeof proto3;
8309
+ static readonly typeName = "transcodely.v1.JobFee";
8310
+ static readonly fields: FieldList;
8311
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): JobFee;
8312
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): JobFee;
8313
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): JobFee;
8314
+ static equals(a: JobFee | PlainMessage<JobFee> | undefined, b: JobFee | PlainMessage<JobFee> | undefined): boolean;
8315
+ }
8316
+ /**
8317
+ * ClipConfig selects a sub-range of the input to encode instead of the full
8318
+ * duration. Applies to the whole job: every output is encoded from the
8319
+ * clipped range, and thumbnails/sprites are computed within it. Cuts are
8320
+ * frame-accurate (outputs are always re-encoded). Billing keys off the
8321
+ * produced output duration, so clipping reduces cost accordingly (the
8322
+ * per-job minimum charge, when in effect, still applies).
8323
+ *
8324
+ * Bounds are stored with 0.1ms (4-decimal) precision; finer-grained values
8325
+ * are rounded. The minimum clip length is 1ms. A clip of {0, 0} is treated
8326
+ * as no clip (encode the full input).
8327
+ *
8328
+ * @generated from message transcodely.v1.ClipConfig
8329
+ */
8330
+ declare class ClipConfig extends Message<ClipConfig> {
8331
+ /**
8332
+ * Where the clip starts, in seconds from the beginning of the input.
8333
+ * Default 0 (start of input). Must be within the input's duration:
8334
+ * validated against the probed duration, failing the job with error code
8335
+ * `input_clip_out_of_range` when out of range.
8336
+ * The upper bound is a CEL expression rather than double.lte: combining
8337
+ * gte+lte trips a broken double.gte_lte composite rule in the pinned
8338
+ * protovalidate-go ("no such attribute(s): rules").
8339
+ *
8340
+ * @generated from field: double start_seconds = 1;
8341
+ */
8342
+ startSeconds: number;
8343
+ /**
8344
+ * Where the clip ends, in seconds from the beginning of the input.
8345
+ * 0 (or unset) means end of input. When set, must be at least 0.001s
8346
+ * greater than start_seconds and no greater than the probed input
8347
+ * duration; otherwise the job fails at probe time with error code
8348
+ * `input_clip_out_of_range`.
8349
+ *
8350
+ * @generated from field: double end_seconds = 2;
8351
+ */
8352
+ endSeconds: number;
8353
+ constructor(data?: PartialMessage<ClipConfig>);
8354
+ static readonly runtime: typeof proto3;
8355
+ static readonly typeName = "transcodely.v1.ClipConfig";
8356
+ static readonly fields: FieldList;
8357
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ClipConfig;
8358
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ClipConfig;
8359
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ClipConfig;
8360
+ static equals(a: ClipConfig | PlainMessage<ClipConfig> | undefined, b: ClipConfig | PlainMessage<ClipConfig> | undefined): boolean;
8361
+ }
7089
8362
  /**
7090
8363
  * Request to create a new job.
7091
8364
  *
@@ -7116,6 +8389,18 @@ declare class CreateJobRequest extends Message<CreateJobRequest> {
7116
8389
  * @generated from field: optional string input_path = 10;
7117
8390
  */
7118
8391
  inputPath?: string;
8392
+ /**
8393
+ * Hosted video ID to use as the input source (video mode).
8394
+ * The job's input is resolved server-side from the referenced video's
8395
+ * original source (falling back to its highest-bitrate rendition if the
8396
+ * ingest source is gone). Outputs are written to the video's managed
8397
+ * storage and linked to it. Use this OR input_url OR input_origin_id.
8398
+ * Primarily for retro-captioning an existing hosted video with a
8399
+ * captions-only output.
8400
+ *
8401
+ * @generated from field: optional string input_video_id = 13;
8402
+ */
8403
+ inputVideoId?: string;
7119
8404
  /**
7120
8405
  * Origin ID for outputs (origin mode).
7121
8406
  * If specified, all outputs will be written to this origin.
@@ -7131,7 +8416,8 @@ declare class CreateJobRequest extends Message<CreateJobRequest> {
7131
8416
  */
7132
8417
  outputs: OutputSpec[];
7133
8418
  /**
7134
- * Job priority (affects processing order and cost).
8419
+ * Job priority (affects worker selection and scheduling order; has no
8420
+ * effect on cost — pricing is driven by codec/resolution/framerate/quality).
7135
8421
  *
7136
8422
  * @generated from field: transcodely.v1.JobPriority priority = 3;
7137
8423
  */
@@ -7201,6 +8487,23 @@ declare class CreateJobRequest extends Message<CreateJobRequest> {
7201
8487
  * @generated from field: optional bool managed = 20;
7202
8488
  */
7203
8489
  managed?: boolean;
8490
+ /**
8491
+ * Optional target app. API-key callers may omit it (their key's app is used)
8492
+ * or pass their own app; a different app is rejected with PermissionDenied.
8493
+ * Portal/JWT callers pass it to create in a specific app in their org;
8494
+ * omitted selects the org's first active app.
8495
+ *
8496
+ * @generated from field: optional string app_id = 21;
8497
+ */
8498
+ appId?: string;
8499
+ /**
8500
+ * Encode only a sub-range of the input (job-level; applies to all outputs).
8501
+ * Omit to encode the full input. See ClipConfig for range semantics and
8502
+ * probe-time validation.
8503
+ *
8504
+ * @generated from field: optional transcodely.v1.ClipConfig clip = 22;
8505
+ */
8506
+ clip?: ClipConfig;
7204
8507
  constructor(data?: PartialMessage<CreateJobRequest>);
7205
8508
  static readonly runtime: typeof proto3;
7206
8509
  static readonly typeName = "transcodely.v1.CreateJobRequest";
@@ -7282,11 +8585,14 @@ declare class GetJobResponse extends Message<GetJobResponse> {
7282
8585
  /**
7283
8586
  * Request to list jobs.
7284
8587
  *
8588
+ * Filters combine with AND: a job is returned only if it satisfies every filter
8589
+ * supplied on the request. Omitted filters are not applied.
8590
+ *
7285
8591
  * @generated from message transcodely.v1.ListJobsRequest
7286
8592
  */
7287
8593
  declare class ListJobsRequest extends Message<ListJobsRequest> {
7288
8594
  /**
7289
- * Optional status filter.
8595
+ * Optional status filter. Superseded by `statuses` — see that field.
7290
8596
  *
7291
8597
  * @generated from field: optional transcodely.v1.JobStatus status = 1;
7292
8598
  */
@@ -7297,6 +8603,54 @@ declare class ListJobsRequest extends Message<ListJobsRequest> {
7297
8603
  * @generated from field: transcodely.v1.PaginationRequest pagination = 2;
7298
8604
  */
7299
8605
  pagination?: PaginationRequest;
8606
+ /**
8607
+ * Optional app filter. API-key callers may omit it (their key's app is used)
8608
+ * or pass their own app; a different app is rejected with PermissionDenied.
8609
+ * Portal/JWT callers pass it to list a specific app in their org; omitted
8610
+ * returns jobs across all apps in the org.
8611
+ *
8612
+ * @generated from field: optional string app_id = 3;
8613
+ */
8614
+ appId?: string;
8615
+ /**
8616
+ * Only include jobs created at or after this timestamp (RFC 3339). Inclusive.
8617
+ *
8618
+ * @generated from field: optional google.protobuf.Timestamp created_after = 4;
8619
+ */
8620
+ createdAfter?: Timestamp;
8621
+ /**
8622
+ * Only include jobs created at or before this timestamp (RFC 3339). Inclusive.
8623
+ *
8624
+ * @generated from field: optional google.protobuf.Timestamp created_before = 5;
8625
+ */
8626
+ createdBefore?: Timestamp;
8627
+ /**
8628
+ * Filter by several statuses at once: a job matches if its status is any one
8629
+ * of the listed values (OR within the field), e.g. [failed, canceled] to list
8630
+ * everything that did not finish.
8631
+ *
8632
+ * Precedence: when this field is non-empty it replaces `status` entirely and
8633
+ * `status` is ignored — the two are never intersected. Send one or the other.
8634
+ * `status` remains supported for existing clients.
8635
+ *
8636
+ * @generated from field: repeated transcodely.v1.JobStatus statuses = 6;
8637
+ */
8638
+ statuses: JobStatus[];
8639
+ /**
8640
+ * Filter on the job's user-provided metadata (the `metadata` map supplied at
8641
+ * create time). Every pair must be present on the job with exactly that value
8642
+ * (AND across pairs); a job carrying additional metadata keys still matches.
8643
+ * Values are compared as exact strings — no prefix, range, or wildcard match.
8644
+ * Jobs created without metadata never match a non-empty filter.
8645
+ *
8646
+ * Example: {"batch": "2026-07", "tenant": "acme"} returns only jobs tagged
8647
+ * with both.
8648
+ *
8649
+ * @generated from field: map<string, string> metadata = 7;
8650
+ */
8651
+ metadata: {
8652
+ [key: string]: string;
8653
+ };
7300
8654
  constructor(data?: PartialMessage<ListJobsRequest>);
7301
8655
  static readonly runtime: typeof proto3;
7302
8656
  static readonly typeName = "transcodely.v1.ListJobsRequest";
@@ -7546,7 +8900,11 @@ declare enum VideoVisibility {
7546
8900
  */
7547
8901
  UNLISTED = 2,
7548
8902
  /**
7549
- * Requires authentication to view.
8903
+ * Not playable via the public player or embed: the player page returns 404 and
8904
+ * embed_url/embed_code are never populated. Authenticated API reads
8905
+ * (VideoService.Get/List/Watch) for the owning app DO return signed, expiring
8906
+ * playback_url/poster_url once the video is "ready", so the owner can watch a
8907
+ * private video via the API even though it stays off the public player.
7550
8908
  *
7551
8909
  * @generated from enum value: VIDEO_VISIBILITY_PRIVATE = 3;
7552
8910
  */
@@ -7571,7 +8929,8 @@ declare class Video extends Message<Video> {
7571
8929
  */
7572
8930
  appId: string;
7573
8931
  /**
7574
- * How the video was created: "upload" (direct upload) or "job" (from transcoding job).
8932
+ * How the video was created: "upload" (direct upload or CreateFromUrl ingest)
8933
+ * or "job" (from a managed transcoding job created via JobService.Create).
7575
8934
  *
7576
8935
  * @generated from field: string source = 3;
7577
8936
  */
@@ -7627,20 +8986,38 @@ declare class Video extends Message<Video> {
7627
8986
  */
7628
8987
  preset?: string;
7629
8988
  /**
7630
- * Playback (computed per-request, not stored — signed CDN tokens).
8989
+ * Playback surface — all computed per-request and never stored. Populated for
8990
+ * "ready" videos of any visibility (public, unlisted, and — on authenticated
8991
+ * owner reads — private); absent otherwise. On apps with CDN token auth
8992
+ * enabled the URL is signed and expiring (HMAC token + expiry query params);
8993
+ * it is re-issued on every read, so clients should use the value from the
8994
+ * latest response rather than caching it. On apps not yet migrated to token
8995
+ * auth the URL is unsigned and access control comes from the managed-storage
8996
+ * bucket policy; unsigned URLs are never issued for private videos.
7631
8997
  *
7632
8998
  * @generated from field: optional string playback_url = 20;
7633
8999
  */
7634
9000
  playbackUrl?: string;
7635
9001
  /**
9002
+ * Public embed surface — populated only for playable videos (status "ready"
9003
+ * and NOT private). Always absent for private videos.
9004
+ *
7636
9005
  * @generated from field: optional string embed_url = 21;
7637
9006
  */
7638
9007
  embedUrl?: string;
7639
9008
  /**
9009
+ * Ready-to-paste responsive HTML embed snippet: a 16:9 aspect-ratio wrapper
9010
+ * div containing a lazy-loaded, borderless <iframe src=embed_url> that fills
9011
+ * its container (no fixed width/height). Same population rules as embed_url.
9012
+ *
7640
9013
  * @generated from field: optional string embed_code = 22;
7641
9014
  */
7642
9015
  embedCode?: string;
7643
9016
  /**
9017
+ * Poster image URL, resolved from the worker-reported poster key. Signed and
9018
+ * expiring on token-auth apps, unsigned otherwise — same rules and per-request
9019
+ * re-issuance as playback_url. Absent when the video has no generated poster.
9020
+ *
7644
9021
  * @generated from field: optional string poster_url = 23;
7645
9022
  */
7646
9023
  posterUrl?: string;
@@ -7648,12 +9025,36 @@ declare class Video extends Message<Video> {
7648
9025
  * @generated from field: optional double duration_seconds = 24;
7649
9026
  */
7650
9027
  durationSeconds?: number;
9028
+ /**
9029
+ * Animated hover-preview URLs, populated when the video was created with
9030
+ * hover_previews enabled and its transcode produced the animated artifacts.
9031
+ * Same resolution and per-request re-issuance rules as poster_url: signed and
9032
+ * expiring on token-auth apps, unsigned otherwise, absent for private videos
9033
+ * without a signable key. hover_preview_url is the animated WebP; the muted
9034
+ * MP4 loop rides hover_preview_mp4_url. Either may be absent (e.g. the WebP is
9035
+ * skipped for previews longer than 10 s). Field numbers 44/45.
9036
+ *
9037
+ * @generated from field: optional string hover_preview_url = 44;
9038
+ */
9039
+ hoverPreviewUrl?: string;
9040
+ /**
9041
+ * @generated from field: optional string hover_preview_mp4_url = 45;
9042
+ */
9043
+ hoverPreviewMp4Url?: string;
7651
9044
  /**
7652
9045
  * Renditions available for playback.
7653
9046
  *
7654
9047
  * @generated from field: repeated transcodely.v1.VideoRendition renditions = 25;
7655
9048
  */
7656
9049
  renditions: VideoRendition[];
9050
+ /**
9051
+ * Caption/subtitle tracks attached to this video, in the order they were
9052
+ * attached. Populated for videos whose transcode produced caption files —
9053
+ * either in the same job or by a later captions-only job. Empty otherwise.
9054
+ *
9055
+ * @generated from field: repeated transcodely.v1.VideoTextTrack text_tracks = 49;
9056
+ */
9057
+ textTracks: VideoTextTrack[];
7657
9058
  /**
7658
9059
  * Storage and cost transparency.
7659
9060
  *
@@ -7678,6 +9079,31 @@ declare class Video extends Message<Video> {
7678
9079
  * @generated from field: optional google.protobuf.Timestamp ready_at = 42;
7679
9080
  */
7680
9081
  readyAt?: Timestamp;
9082
+ /**
9083
+ * Source lifecycle (managed hosting only). These concern ONLY the original
9084
+ * uploaded source file; renditions and playback are never affected.
9085
+ *
9086
+ * Whether this video's source file is exempt from the app's
9087
+ * delete_source_after_days lifecycle rule. Set via UpdateVideo.
9088
+ *
9089
+ * @generated from field: bool source_pinned = 46;
9090
+ */
9091
+ sourcePinned: boolean;
9092
+ /**
9093
+ * When the source file is scheduled to be deleted by the app's
9094
+ * delete_source_after_days rule. Server-set, read-only; present only while a
9095
+ * deletion is scheduled (cleared on pin, on setting change, and on delete).
9096
+ *
9097
+ * @generated from field: optional google.protobuf.Timestamp source_scheduled_for_deletion_at = 47;
9098
+ */
9099
+ sourceScheduledForDeletionAt?: Timestamp;
9100
+ /**
9101
+ * When the source file was deleted by the lifecycle rule. Server-set,
9102
+ * read-only. Once set, re-processing falls back to the best rendition.
9103
+ *
9104
+ * @generated from field: optional google.protobuf.Timestamp source_deleted_at = 48;
9105
+ */
9106
+ sourceDeletedAt?: Timestamp;
7681
9107
  /**
7682
9108
  * Resource type discriminator. Always "video" for this message.
7683
9109
  * Lets webhook consumers and polyglot SDKs identify the resource without
@@ -7752,6 +9178,90 @@ declare class VideoRendition extends Message<VideoRendition> {
7752
9178
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): VideoRendition;
7753
9179
  static equals(a: VideoRendition | PlainMessage<VideoRendition> | undefined, b: VideoRendition | PlainMessage<VideoRendition> | undefined): boolean;
7754
9180
  }
9181
+ /**
9182
+ * A caption/subtitle track attached to a video for playback.
9183
+ *
9184
+ * @generated from message transcodely.v1.VideoTextTrack
9185
+ */
9186
+ declare class VideoTextTrack extends Message<VideoTextTrack> {
9187
+ /**
9188
+ * Unique text track identifier (e.g., "trk_a1b2c3d4e5f6g7").
9189
+ *
9190
+ * @generated from field: string id = 1;
9191
+ */
9192
+ id: string;
9193
+ /**
9194
+ * Track role, as understood by players: "subtitles", "captions", "chapters",
9195
+ * or "descriptions".
9196
+ *
9197
+ * @generated from field: string kind = 2;
9198
+ */
9199
+ kind: string;
9200
+ /**
9201
+ * Language of the track: the ISO 639-2 code that was requested, or the code
9202
+ * detected by speech recognition when the track was generated with "auto".
9203
+ * Empty when the producing job recorded no language.
9204
+ *
9205
+ * @generated from field: string language = 3;
9206
+ */
9207
+ language: string;
9208
+ /**
9209
+ * Human-readable track label shown in the player's caption menu (e.g.
9210
+ * "English"). Empty when none was supplied.
9211
+ *
9212
+ * @generated from field: string label = 4;
9213
+ */
9214
+ label: string;
9215
+ /**
9216
+ * Subtitle file format: "webvtt", "srt", "ttml", or "ass".
9217
+ *
9218
+ * @generated from field: string format = 5;
9219
+ */
9220
+ format: string;
9221
+ /**
9222
+ * Whether the track was produced by speech recognition (a subtitle track with
9223
+ * the "generate" operation) rather than supplied or extracted from the source.
9224
+ *
9225
+ * @generated from field: bool auto_generated = 6;
9226
+ */
9227
+ autoGenerated: boolean;
9228
+ /**
9229
+ * Whether the track is already listed inside the video's HLS/DASH manifest.
9230
+ * When true, players discover it from the manifest during normal playback and
9231
+ * must NOT also attach it as a separate track — doing so lists the language
9232
+ * twice. False for tracks produced by a captions-only job that ran after the
9233
+ * transcode, which are attached as sidecar files instead.
9234
+ *
9235
+ * @generated from field: bool in_manifest = 7;
9236
+ */
9237
+ inManifest: boolean;
9238
+ /**
9239
+ * URL of the caption file. Computed per-request and never stored: on apps with
9240
+ * CDN token auth enabled it is signed and expiring, and it is re-issued on
9241
+ * every read, so clients should use the value from the latest response rather
9242
+ * than caching it. On apps not yet migrated to token auth it is unsigned and
9243
+ * access control comes from the managed-storage bucket policy; unsigned URLs
9244
+ * are never issued for private videos. Absent when no URL may be issued —
9245
+ * same rules as poster_url.
9246
+ *
9247
+ * @generated from field: optional string url = 8;
9248
+ */
9249
+ url?: string;
9250
+ /**
9251
+ * When the track was attached to the video.
9252
+ *
9253
+ * @generated from field: google.protobuf.Timestamp created_at = 9;
9254
+ */
9255
+ createdAt?: Timestamp;
9256
+ constructor(data?: PartialMessage<VideoTextTrack>);
9257
+ static readonly runtime: typeof proto3;
9258
+ static readonly typeName = "transcodely.v1.VideoTextTrack";
9259
+ static readonly fields: FieldList;
9260
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): VideoTextTrack;
9261
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): VideoTextTrack;
9262
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): VideoTextTrack;
9263
+ static equals(a: VideoTextTrack | PlainMessage<VideoTextTrack> | undefined, b: VideoTextTrack | PlainMessage<VideoTextTrack> | undefined): boolean;
9264
+ }
7755
9265
  /**
7756
9266
  * Request to create a presigned upload URL for direct client upload.
7757
9267
  *
@@ -7759,7 +9269,8 @@ declare class VideoRendition extends Message<VideoRendition> {
7759
9269
  */
7760
9270
  declare class CreateUploadRequest extends Message<CreateUploadRequest> {
7761
9271
  /**
7762
- * App to create the video under. Required — must have hosting enabled.
9272
+ * App to create the video under. Required. The app must have managed hosting
9273
+ * enabled (AppService.EnableHosting) or the call fails with FailedPrecondition.
7763
9274
  *
7764
9275
  * @generated from field: string app_id = 8;
7765
9276
  */
@@ -7801,7 +9312,7 @@ declare class CreateUploadRequest extends Message<CreateUploadRequest> {
7801
9312
  */
7802
9313
  tags: string[];
7803
9314
  /**
7804
- * Visibility setting. Defaults to "private" if not specified.
9315
+ * Visibility setting. Defaults to "unlisted" if not specified.
7805
9316
  *
7806
9317
  * @generated from field: optional string visibility = 7;
7807
9318
  */
@@ -7816,6 +9327,15 @@ declare class CreateUploadRequest extends Message<CreateUploadRequest> {
7816
9327
  * @generated from field: optional string preset = 9;
7817
9328
  */
7818
9329
  preset?: string;
9330
+ /**
9331
+ * When true, attach an animated hover-preview (mode=animated, worker smart
9332
+ * defaults: ~4 s, 12 fps, 320 px) to the managed transcode, in addition to the
9333
+ * poster. Free — animated previews add no cost. The produced WebP/MP4 loop
9334
+ * surface as Video.hover_preview_url / hover_preview_mp4_url once ready.
9335
+ *
9336
+ * @generated from field: bool hover_previews = 10;
9337
+ */
9338
+ hoverPreviews: boolean;
7819
9339
  constructor(data?: PartialMessage<CreateUploadRequest>);
7820
9340
  static readonly runtime: typeof proto3;
7821
9341
  static readonly typeName = "transcodely.v1.CreateUploadRequest";
@@ -7900,6 +9420,102 @@ declare class CompleteUploadResponse extends Message<CompleteUploadResponse> {
7900
9420
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CompleteUploadResponse;
7901
9421
  static equals(a: CompleteUploadResponse | PlainMessage<CompleteUploadResponse> | undefined, b: CompleteUploadResponse | PlainMessage<CompleteUploadResponse> | undefined): boolean;
7902
9422
  }
9423
+ /**
9424
+ * Request to create a hosted video from a remote URL (one-call ingest).
9425
+ *
9426
+ * @generated from message transcodely.v1.CreateFromUrlRequest
9427
+ */
9428
+ declare class CreateFromUrlRequest extends Message<CreateFromUrlRequest> {
9429
+ /**
9430
+ * App to create the video under. Required. The app must have managed hosting
9431
+ * enabled (AppService.EnableHosting) or the call fails with FailedPrecondition.
9432
+ *
9433
+ * @generated from field: string app_id = 1;
9434
+ */
9435
+ appId: string;
9436
+ /**
9437
+ * Publicly-reachable source URL to ingest. Must be http:// or https:// —
9438
+ * storage-origin schemes (gs://, s3://) are not accepted here; use an origin
9439
+ * and JobService.Create for those. The URL is fetched by the worker at
9440
+ * transcode time (the API never fetches it); private/internal addresses are
9441
+ * rejected up front and again, authoritatively, at fetch time (SSRF defense).
9442
+ *
9443
+ * @generated from field: string url = 2;
9444
+ */
9445
+ url: string;
9446
+ /**
9447
+ * Optional title for the video.
9448
+ *
9449
+ * @generated from field: optional string title = 3;
9450
+ */
9451
+ title?: string;
9452
+ /**
9453
+ * Optional description.
9454
+ *
9455
+ * @generated from field: optional string description = 4;
9456
+ */
9457
+ description?: string;
9458
+ /**
9459
+ * Optional tags for categorization (max 20).
9460
+ *
9461
+ * @generated from field: repeated string tags = 5;
9462
+ */
9463
+ tags: string[];
9464
+ /**
9465
+ * Visibility setting. Defaults to "unlisted" if not specified.
9466
+ *
9467
+ * @generated from field: optional string visibility = 6;
9468
+ */
9469
+ visibility?: string;
9470
+ /**
9471
+ * Optional preset reference for the auto-transcode job.
9472
+ * Accepts either a preset ID (e.g., "pst_abc123") or slug (e.g., "gaming_1080p_60_standard").
9473
+ * When provided, the preset's settings drive the encoding instead of the
9474
+ * app's default auto-profile ABR ladder.
9475
+ *
9476
+ * @generated from field: optional string preset = 7;
9477
+ */
9478
+ preset?: string;
9479
+ /**
9480
+ * When true, attach an animated hover-preview (mode=animated, worker smart
9481
+ * defaults) to the managed transcode, in addition to the poster. Free. The
9482
+ * produced loop surfaces as Video.hover_preview_url / hover_preview_mp4_url.
9483
+ *
9484
+ * @generated from field: bool hover_previews = 8;
9485
+ */
9486
+ hoverPreviews: boolean;
9487
+ constructor(data?: PartialMessage<CreateFromUrlRequest>);
9488
+ static readonly runtime: typeof proto3;
9489
+ static readonly typeName = "transcodely.v1.CreateFromUrlRequest";
9490
+ static readonly fields: FieldList;
9491
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateFromUrlRequest;
9492
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): CreateFromUrlRequest;
9493
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateFromUrlRequest;
9494
+ static equals(a: CreateFromUrlRequest | PlainMessage<CreateFromUrlRequest> | undefined, b: CreateFromUrlRequest | PlainMessage<CreateFromUrlRequest> | undefined): boolean;
9495
+ }
9496
+ /**
9497
+ * Response from creating a video from a URL.
9498
+ *
9499
+ * @generated from message transcodely.v1.CreateFromUrlResponse
9500
+ */
9501
+ declare class CreateFromUrlResponse extends Message<CreateFromUrlResponse> {
9502
+ /**
9503
+ * The created video (status: "processing"). No video.uploaded event fires for
9504
+ * URL ingest (no bytes are uploaded); the job lifecycle plus video.ready /
9505
+ * video.failed cover the outcome.
9506
+ *
9507
+ * @generated from field: transcodely.v1.Video video = 1;
9508
+ */
9509
+ video?: Video;
9510
+ constructor(data?: PartialMessage<CreateFromUrlResponse>);
9511
+ static readonly runtime: typeof proto3;
9512
+ static readonly typeName = "transcodely.v1.CreateFromUrlResponse";
9513
+ static readonly fields: FieldList;
9514
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): CreateFromUrlResponse;
9515
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): CreateFromUrlResponse;
9516
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): CreateFromUrlResponse;
9517
+ static equals(a: CreateFromUrlResponse | PlainMessage<CreateFromUrlResponse> | undefined, b: CreateFromUrlResponse | PlainMessage<CreateFromUrlResponse> | undefined): boolean;
9518
+ }
7903
9519
  /**
7904
9520
  * A single part in a multipart upload with its presigned URL.
7905
9521
  *
@@ -7961,7 +9577,8 @@ declare class CompletedPart extends Message<CompletedPart> {
7961
9577
  */
7962
9578
  declare class CreateMultipartUploadRequest extends Message<CreateMultipartUploadRequest> {
7963
9579
  /**
7964
- * App to create the video under. Required — must have hosting enabled.
9580
+ * App to create the video under. Required. The app must have managed hosting
9581
+ * enabled (AppService.EnableHosting) or the call fails with FailedPrecondition.
7965
9582
  *
7966
9583
  * @generated from field: string app_id = 1;
7967
9584
  */
@@ -8028,6 +9645,14 @@ declare class CreateMultipartUploadRequest extends Message<CreateMultipartUpload
8028
9645
  * @generated from field: optional string preset = 14;
8029
9646
  */
8030
9647
  preset?: string;
9648
+ /**
9649
+ * When true, attach an animated hover-preview (mode=animated, worker smart
9650
+ * defaults) to the managed transcode, in addition to the poster. Free. The
9651
+ * produced loop surfaces as Video.hover_preview_url / hover_preview_mp4_url.
9652
+ *
9653
+ * @generated from field: bool hover_previews = 15;
9654
+ */
9655
+ hoverPreviews: boolean;
8031
9656
  constructor(data?: PartialMessage<CreateMultipartUploadRequest>);
8032
9657
  static readonly runtime: typeof proto3;
8033
9658
  static readonly typeName = "transcodely.v1.CreateMultipartUploadRequest";
@@ -8299,6 +9924,15 @@ declare class ListVideosRequest extends Message<ListVideosRequest> {
8299
9924
  * @generated from field: optional string status = 3;
8300
9925
  */
8301
9926
  status?: string;
9927
+ /**
9928
+ * Optional app filter. API-key callers may omit it (their key's app is used)
9929
+ * or pass their own app; a different app is rejected with PermissionDenied.
9930
+ * Portal/JWT callers pass it to list a specific app in their org; omitted
9931
+ * returns videos across all apps in the org.
9932
+ *
9933
+ * @generated from field: optional string app_id = 4;
9934
+ */
9935
+ appId?: string;
8302
9936
  constructor(data?: PartialMessage<ListVideosRequest>);
8303
9937
  static readonly runtime: typeof proto3;
8304
9938
  static readonly typeName = "transcodely.v1.ListVideosRequest";
@@ -8366,7 +10000,9 @@ declare class UpdateVideoRequest extends Message<UpdateVideoRequest> {
8366
10000
  */
8367
10001
  description?: string;
8368
10002
  /**
8369
- * Updated tags (replaces existing tags).
10003
+ * Updated tags (replaces existing tags). Because proto3 repeated fields carry
10004
+ * no presence, an empty list is indistinguishable from "unset" on the wire
10005
+ * and leaves existing tags unchanged. To remove all tags, set clear_tags.
8370
10006
  *
8371
10007
  * @generated from field: repeated string tags = 4;
8372
10008
  */
@@ -8377,6 +10013,21 @@ declare class UpdateVideoRequest extends Message<UpdateVideoRequest> {
8377
10013
  * @generated from field: optional string visibility = 5;
8378
10014
  */
8379
10015
  visibility?: string;
10016
+ /**
10017
+ * Set to true to remove all tags. Mutually exclusive with tags.
10018
+ *
10019
+ * @generated from field: optional bool clear_tags = 6;
10020
+ */
10021
+ clearTags?: boolean;
10022
+ /**
10023
+ * Pin or unpin this video's source file against the app's
10024
+ * delete_source_after_days lifecycle rule. Pinning also immediately clears any
10025
+ * pending deletion schedule. Unpinning does NOT reschedule — the sweeper
10026
+ * re-evaluates later with a fresh warning webhook.
10027
+ *
10028
+ * @generated from field: optional bool source_pinned = 7;
10029
+ */
10030
+ sourcePinned?: boolean;
8380
10031
  constructor(data?: PartialMessage<UpdateVideoRequest>);
8381
10032
  static readonly runtime: typeof proto3;
8382
10033
  static readonly typeName = "transcodely.v1.UpdateVideoRequest";
@@ -8586,6 +10237,19 @@ declare class UsageSummary extends Message<UsageSummary> {
8586
10237
  * @generated from field: string currency = 31;
8587
10238
  */
8588
10239
  currency: string;
10240
+ /**
10241
+ * Per-day usage breakdown for the billing period identified by
10242
+ * billing_month, oldest day first. With a billing anchor day other than 1,
10243
+ * the period spans into the following calendar month, so dates are not
10244
+ * limited to the named month. Only days with recorded activity are present
10245
+ * (no zero-fill): a day is omitted when it had no storage snapshot, no
10246
+ * egress, and no video encoded. Powers the dashboard's usage-trend charts.
10247
+ * Populated for both app-scoped and org-scoped (aggregated across the
10248
+ * org's apps) calls.
10249
+ *
10250
+ * @generated from field: repeated transcodely.v1.DailyUsage daily = 40;
10251
+ */
10252
+ daily: DailyUsage[];
8589
10253
  constructor(data?: PartialMessage<UsageSummary>);
8590
10254
  static readonly runtime: typeof proto3;
8591
10255
  static readonly typeName = "transcodely.v1.UsageSummary";
@@ -8595,6 +10259,311 @@ declare class UsageSummary extends Message<UsageSummary> {
8595
10259
  static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): UsageSummary;
8596
10260
  static equals(a: UsageSummary | PlainMessage<UsageSummary> | undefined, b: UsageSummary | PlainMessage<UsageSummary> | undefined): boolean;
8597
10261
  }
10262
+ /**
10263
+ * One calendar day's slice of usage within a billing period (see
10264
+ * UsageSummary.daily for period semantics). All monetary fields are in the
10265
+ * parent UsageSummary's `currency`.
10266
+ *
10267
+ * @generated from message transcodely.v1.DailyUsage
10268
+ */
10269
+ declare class DailyUsage extends Message<DailyUsage> {
10270
+ /**
10271
+ * Calendar day in YYYY-MM-DD format (UTC).
10272
+ *
10273
+ * @generated from field: string date = 1;
10274
+ */
10275
+ date: string;
10276
+ /**
10277
+ * Total stored bytes as of this day's snapshot. Point-in-time (the day's
10278
+ * recorded storage level), not an increment over the prior day. Zero when
10279
+ * no snapshot was taken that day.
10280
+ *
10281
+ * @generated from field: int64 storage_bytes = 2;
10282
+ */
10283
+ storageBytes: bigint;
10284
+ /**
10285
+ * Bytes egressed during this day (sum of the day's hourly egress records).
10286
+ *
10287
+ * @generated from field: int64 egress_bytes = 3;
10288
+ */
10289
+ egressBytes: bigint;
10290
+ /**
10291
+ * CDN requests served during this day (sum of the day's hourly records).
10292
+ *
10293
+ * @generated from field: int64 request_count = 4;
10294
+ */
10295
+ requestCount: bigint;
10296
+ /**
10297
+ * Encoding cost for videos created on this day, derived from the linked
10298
+ * transcoding jobs' actual cost. Zero when no billable video was created.
10299
+ *
10300
+ * @generated from field: double encoding_cost = 5;
10301
+ */
10302
+ encodingCost: number;
10303
+ constructor(data?: PartialMessage<DailyUsage>);
10304
+ static readonly runtime: typeof proto3;
10305
+ static readonly typeName = "transcodely.v1.DailyUsage";
10306
+ static readonly fields: FieldList;
10307
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): DailyUsage;
10308
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): DailyUsage;
10309
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): DailyUsage;
10310
+ static equals(a: DailyUsage | PlainMessage<DailyUsage> | undefined, b: DailyUsage | PlainMessage<DailyUsage> | undefined): boolean;
10311
+ }
10312
+ /**
10313
+ * Request for a single video's playback stats.
10314
+ *
10315
+ * @generated from message transcodely.v1.GetStatsRequest
10316
+ */
10317
+ declare class GetStatsRequest extends Message<GetStatsRequest> {
10318
+ /**
10319
+ * Video ID to fetch stats for.
10320
+ *
10321
+ * @generated from field: string video_id = 1;
10322
+ */
10323
+ videoId: string;
10324
+ /**
10325
+ * Optional inclusive start of the UTC date range, YYYY-MM-DD (e.g.
10326
+ * "2026-07-01"). Omitted means unbounded (all retained history).
10327
+ *
10328
+ * @generated from field: optional string start_date = 2;
10329
+ */
10330
+ startDate?: string;
10331
+ /**
10332
+ * Optional inclusive end of the UTC date range, YYYY-MM-DD. Omitted means
10333
+ * unbounded (up to today).
10334
+ *
10335
+ * @generated from field: optional string end_date = 3;
10336
+ */
10337
+ endDate?: string;
10338
+ constructor(data?: PartialMessage<GetStatsRequest>);
10339
+ static readonly runtime: typeof proto3;
10340
+ static readonly typeName = "transcodely.v1.GetStatsRequest";
10341
+ static readonly fields: FieldList;
10342
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetStatsRequest;
10343
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetStatsRequest;
10344
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetStatsRequest;
10345
+ static equals(a: GetStatsRequest | PlainMessage<GetStatsRequest> | undefined, b: GetStatsRequest | PlainMessage<GetStatsRequest> | undefined): boolean;
10346
+ }
10347
+ /**
10348
+ * Response with a video's daily playback stats and range totals.
10349
+ *
10350
+ * @generated from message transcodely.v1.GetStatsResponse
10351
+ */
10352
+ declare class GetStatsResponse extends Message<GetStatsResponse> {
10353
+ /**
10354
+ * Per-day rows within the requested range, oldest day first. Only days with
10355
+ * recorded activity are present (no zero-fill).
10356
+ *
10357
+ * @generated from field: repeated transcodely.v1.VideoStatsDay daily = 1;
10358
+ */
10359
+ daily: VideoStatsDay[];
10360
+ /**
10361
+ * Totals across the returned days.
10362
+ *
10363
+ * @generated from field: transcodely.v1.VideoStatsTotals totals = 2;
10364
+ */
10365
+ totals?: VideoStatsTotals;
10366
+ constructor(data?: PartialMessage<GetStatsResponse>);
10367
+ static readonly runtime: typeof proto3;
10368
+ static readonly typeName = "transcodely.v1.GetStatsResponse";
10369
+ static readonly fields: FieldList;
10370
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): GetStatsResponse;
10371
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): GetStatsResponse;
10372
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): GetStatsResponse;
10373
+ static equals(a: GetStatsResponse | PlainMessage<GetStatsResponse> | undefined, b: GetStatsResponse | PlainMessage<GetStatsResponse> | undefined): boolean;
10374
+ }
10375
+ /**
10376
+ * One UTC day of playback stats for a video.
10377
+ *
10378
+ * @generated from message transcodely.v1.VideoStatsDay
10379
+ */
10380
+ declare class VideoStatsDay extends Message<VideoStatsDay> {
10381
+ /**
10382
+ * Calendar day in YYYY-MM-DD format (UTC).
10383
+ *
10384
+ * @generated from field: string date = 1;
10385
+ */
10386
+ date: string;
10387
+ /**
10388
+ * Number of playback starts (one 'play' beacon per pageview that began
10389
+ * playing).
10390
+ *
10391
+ * @generated from field: int32 plays = 2;
10392
+ */
10393
+ plays: number;
10394
+ /**
10395
+ * Approximate watch time in seconds. Derived from playback heartbeats
10396
+ * (heartbeat count × the ~10s heartbeat interval), not exact wall-clock
10397
+ * time — a partial final interval still counts as a whole one.
10398
+ *
10399
+ * @generated from field: int64 watch_seconds = 3;
10400
+ */
10401
+ watchSeconds: bigint;
10402
+ /**
10403
+ * Distinct viewers, counted by an anonymous per-pageview session id (no PII).
10404
+ *
10405
+ * @generated from field: int32 unique_viewers = 4;
10406
+ */
10407
+ uniqueViewers: number;
10408
+ constructor(data?: PartialMessage<VideoStatsDay>);
10409
+ static readonly runtime: typeof proto3;
10410
+ static readonly typeName = "transcodely.v1.VideoStatsDay";
10411
+ static readonly fields: FieldList;
10412
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): VideoStatsDay;
10413
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): VideoStatsDay;
10414
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): VideoStatsDay;
10415
+ static equals(a: VideoStatsDay | PlainMessage<VideoStatsDay> | undefined, b: VideoStatsDay | PlainMessage<VideoStatsDay> | undefined): boolean;
10416
+ }
10417
+ /**
10418
+ * Aggregated playback totals over a date range.
10419
+ *
10420
+ * @generated from message transcodely.v1.VideoStatsTotals
10421
+ */
10422
+ declare class VideoStatsTotals extends Message<VideoStatsTotals> {
10423
+ /**
10424
+ * Sum of daily plays.
10425
+ *
10426
+ * @generated from field: int32 plays = 1;
10427
+ */
10428
+ plays: number;
10429
+ /**
10430
+ * Sum of daily approximate watch seconds.
10431
+ *
10432
+ * @generated from field: int64 watch_seconds = 2;
10433
+ */
10434
+ watchSeconds: bigint;
10435
+ /**
10436
+ * Sum of per-day unique viewers. A viewer active on N distinct days counts N
10437
+ * times (it is not de-duplicated across days); for a single-day range it is
10438
+ * exact.
10439
+ *
10440
+ * @generated from field: int32 unique_viewers = 3;
10441
+ */
10442
+ uniqueViewers: number;
10443
+ constructor(data?: PartialMessage<VideoStatsTotals>);
10444
+ static readonly runtime: typeof proto3;
10445
+ static readonly typeName = "transcodely.v1.VideoStatsTotals";
10446
+ static readonly fields: FieldList;
10447
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): VideoStatsTotals;
10448
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): VideoStatsTotals;
10449
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): VideoStatsTotals;
10450
+ static equals(a: VideoStatsTotals | PlainMessage<VideoStatsTotals> | undefined, b: VideoStatsTotals | PlainMessage<VideoStatsTotals> | undefined): boolean;
10451
+ }
10452
+ /**
10453
+ * Request for an app's top videos by plays.
10454
+ *
10455
+ * @generated from message transcodely.v1.ListTopVideosRequest
10456
+ */
10457
+ declare class ListTopVideosRequest extends Message<ListTopVideosRequest> {
10458
+ /**
10459
+ * Optional app filter. API-key callers may omit it (their key's app is used)
10460
+ * or pass their own app; a different app is rejected with PermissionDenied.
10461
+ * Portal/JWT callers pass the app to scope the leaderboard; omitted resolves
10462
+ * to the org's first app.
10463
+ *
10464
+ * @generated from field: optional string app_id = 1;
10465
+ */
10466
+ appId?: string;
10467
+ /**
10468
+ * Optional inclusive UTC date range bounds, YYYY-MM-DD. Omitted means
10469
+ * unbounded on that side.
10470
+ *
10471
+ * @generated from field: optional string start_date = 2;
10472
+ */
10473
+ startDate?: string;
10474
+ /**
10475
+ * @generated from field: optional string end_date = 3;
10476
+ */
10477
+ endDate?: string;
10478
+ /**
10479
+ * Maximum number of videos to return (1-100). Defaults to 10.
10480
+ *
10481
+ * @generated from field: optional int32 limit = 4;
10482
+ */
10483
+ limit?: number;
10484
+ constructor(data?: PartialMessage<ListTopVideosRequest>);
10485
+ static readonly runtime: typeof proto3;
10486
+ static readonly typeName = "transcodely.v1.ListTopVideosRequest";
10487
+ static readonly fields: FieldList;
10488
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ListTopVideosRequest;
10489
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ListTopVideosRequest;
10490
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ListTopVideosRequest;
10491
+ static equals(a: ListTopVideosRequest | PlainMessage<ListTopVideosRequest> | undefined, b: ListTopVideosRequest | PlainMessage<ListTopVideosRequest> | undefined): boolean;
10492
+ }
10493
+ /**
10494
+ * Response with an app's ranked videos.
10495
+ *
10496
+ * @generated from message transcodely.v1.ListTopVideosResponse
10497
+ */
10498
+ declare class ListTopVideosResponse extends Message<ListTopVideosResponse> {
10499
+ /**
10500
+ * Videos ordered by plays (then watch time) descending.
10501
+ *
10502
+ * @generated from field: repeated transcodely.v1.TopVideo items = 1;
10503
+ */
10504
+ items: TopVideo[];
10505
+ constructor(data?: PartialMessage<ListTopVideosResponse>);
10506
+ static readonly runtime: typeof proto3;
10507
+ static readonly typeName = "transcodely.v1.ListTopVideosResponse";
10508
+ static readonly fields: FieldList;
10509
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): ListTopVideosResponse;
10510
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): ListTopVideosResponse;
10511
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): ListTopVideosResponse;
10512
+ static equals(a: ListTopVideosResponse | PlainMessage<ListTopVideosResponse> | undefined, b: ListTopVideosResponse | PlainMessage<ListTopVideosResponse> | undefined): boolean;
10513
+ }
10514
+ /**
10515
+ * A single ranked video with its playback totals over the requested range.
10516
+ *
10517
+ * @generated from message transcodely.v1.TopVideo
10518
+ */
10519
+ declare class TopVideo extends Message<TopVideo> {
10520
+ /**
10521
+ * Video ID.
10522
+ *
10523
+ * @generated from field: string video_id = 1;
10524
+ */
10525
+ videoId: string;
10526
+ /**
10527
+ * Video title, if set.
10528
+ *
10529
+ * @generated from field: optional string title = 2;
10530
+ */
10531
+ title?: string;
10532
+ /**
10533
+ * Poster image URL, computed from the app's CDN config. Absent when no CDN
10534
+ * is configured or the video has no poster.
10535
+ *
10536
+ * @generated from field: optional string poster_url = 3;
10537
+ */
10538
+ posterUrl?: string;
10539
+ /**
10540
+ * Total plays over the range.
10541
+ *
10542
+ * @generated from field: int64 plays = 4;
10543
+ */
10544
+ plays: bigint;
10545
+ /**
10546
+ * Total approximate watch seconds over the range.
10547
+ *
10548
+ * @generated from field: int64 watch_seconds = 5;
10549
+ */
10550
+ watchSeconds: bigint;
10551
+ /**
10552
+ * Unique viewers over the range, summed per day (a viewer active on N days
10553
+ * counts N times; exact for a single-day range). See VideoStatsTotals.
10554
+ *
10555
+ * @generated from field: int64 unique_viewers = 6;
10556
+ */
10557
+ uniqueViewers: bigint;
10558
+ constructor(data?: PartialMessage<TopVideo>);
10559
+ static readonly runtime: typeof proto3;
10560
+ static readonly typeName = "transcodely.v1.TopVideo";
10561
+ static readonly fields: FieldList;
10562
+ static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): TopVideo;
10563
+ static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): TopVideo;
10564
+ static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): TopVideo;
10565
+ static equals(a: TopVideo | PlainMessage<TopVideo> | undefined, b: TopVideo | PlainMessage<TopVideo> | undefined): boolean;
10566
+ }
8598
10567
 
8599
10568
  /**
8600
10569
  * Public types for the webhook surface — the discriminated union customers
@@ -8626,12 +10595,18 @@ interface EventBase {
8626
10595
  };
8627
10596
  }
8628
10597
  /**
8629
- * Every event the platform may emit, discriminated by `type`. The final
8630
- * `string` arm is intentional forward-compat: an older SDK receiving a
8631
- * `type` the API has since added still parses; `data` is left as the raw
8632
- * decoded JSON object and customers should handle it in a `default:` arm.
10598
+ * Every event this SDK version knows, discriminated by `type`. Each arm's
10599
+ * `data` is a decoded resource, so once an event is narrowed to this union —
10600
+ * via {@link isKnownEvent} (then a `switch`) or {@link isEventType} — reading
10601
+ * `event.data` yields the exact resource type.
10602
+ *
10603
+ * Kept free of any `string` catch-all arm on purpose: a `type: string` member
10604
+ * is a supertype of every literal, so TypeScript keeps it live in every
10605
+ * `case`, collapsing `data` back to `unknown` and defeating narrowing (the
10606
+ * bug in transcodely-js#34). Forward-compat lives in the sibling
10607
+ * {@link UnknownWebhookEvent} instead.
8633
10608
  */
8634
- type WebhookEvent = (EventBase & {
10609
+ type KnownWebhookEvent = (EventBase & {
8635
10610
  type: "job.created";
8636
10611
  data: Job;
8637
10612
  }) | (EventBase & {
@@ -8661,9 +10636,18 @@ type WebhookEvent = (EventBase & {
8661
10636
  }) | (EventBase & {
8662
10637
  type: "video.uploaded";
8663
10638
  data: Video;
10639
+ }) | (EventBase & {
10640
+ type: "video.ready";
10641
+ data: Video;
10642
+ }) | (EventBase & {
10643
+ type: "video.failed";
10644
+ data: Video;
8664
10645
  }) | (EventBase & {
8665
10646
  type: "video.deleted";
8666
10647
  data: Video;
10648
+ }) | (EventBase & {
10649
+ type: "video.source_scheduled_for_deletion";
10650
+ data: Video;
8667
10651
  }) | (EventBase & {
8668
10652
  type: "app.created";
8669
10653
  data: App;
@@ -8671,11 +10655,60 @@ type WebhookEvent = (EventBase & {
8671
10655
  type: "app.updated";
8672
10656
  data: App;
8673
10657
  }) | (EventBase & {
10658
+ type: "app.spend_limit_warning";
10659
+ data: SpendLimitNotification;
10660
+ }) | (EventBase & {
10661
+ type: "app.spend_limit_exceeded";
10662
+ data: SpendLimitNotification;
10663
+ });
10664
+ /**
10665
+ * Forward-compat arm: an event whose `type` this SDK version does not know
10666
+ * because the API added it after this release. The envelope still verifies
10667
+ * and parses; `data` is the raw decoded JSON object, left as `unknown` for the
10668
+ * consumer to inspect. Handle it in the `else` branch of {@link isKnownEvent}
10669
+ * or the `default:` of a `switch`.
10670
+ */
10671
+ interface UnknownWebhookEvent extends EventBase {
8674
10672
  type: string;
8675
10673
  data: unknown;
8676
- });
10674
+ }
8677
10675
  /**
8678
- * The 13 concrete webhook event types the API can emit. Mirrors the source of
10676
+ * A verified, decoded webhook event: the closed, precisely-typed
10677
+ * {@link KnownWebhookEvent} union plus the open {@link UnknownWebhookEvent}
10678
+ * forward-compat arm.
10679
+ *
10680
+ * This is a structural superset of `KnownWebhookEvent` — every known arm is
10681
+ * still assignable to `WebhookEvent`, and `WebhookEvent["type"]` is still
10682
+ * `string` — so code written against the previous single-union shape keeps
10683
+ * compiling. To *narrow* by `type`, first funnel through {@link isKnownEvent}
10684
+ * or {@link isEventType}; a bare `switch (event.type)` on the open union
10685
+ * cannot narrow (see {@link KnownWebhookEvent}).
10686
+ */
10687
+ type WebhookEvent = KnownWebhookEvent | UnknownWebhookEvent;
10688
+ /**
10689
+ * Payload of the `app.spend_limit_warning` and `app.spend_limit_exceeded`
10690
+ * events. Unlike the resource-carrying events, these carry a small notification
10691
+ * object (snake_case, as delivered on the wire) rather than a resource snapshot,
10692
+ * so `data` is the raw parsed JSON — it is not run through the resource codec.
10693
+ */
10694
+ interface SpendLimitNotification {
10695
+ /** The app the spend limit belongs to (`app_*`). */
10696
+ app_id: string;
10697
+ /** Inclusive start of the billing period, an RFC 3339 full-date in UTC (e.g. `"2026-01-01"`). */
10698
+ period_start: string;
10699
+ /** Exclusive end of the billing period, an RFC 3339 full-date in UTC (e.g. `"2026-02-01"`). */
10700
+ period_end: string;
10701
+ /** The app's monthly spend limit in EUR. */
10702
+ limit_eur: number;
10703
+ /** Recorded spend for the period in EUR at the time the event fired. */
10704
+ spent_eur: number;
10705
+ /** Threshold crossed: `80` for the warning event, `100` for the breach event. */
10706
+ threshold_pct: 80 | 100;
10707
+ /** Currency of the amounts in this payload. Always `"EUR"`. */
10708
+ currency: "EUR";
10709
+ }
10710
+ /**
10711
+ * The 18 concrete webhook event types the API can emit. Mirrors the source of
8679
10712
  * truth in `domain.WebhookEventTypes()` (api/internal/domain/webhook.go). The
8680
10713
  * `"*"` wildcard is a subscription-only value and is intentionally absent.
8681
10714
  *
@@ -8683,9 +10716,45 @@ type WebhookEvent = (EventBase & {
8683
10716
  * catalog-drift regression test can compare this set against the discriminated
8684
10717
  * union literals above.
8685
10718
  */
8686
- declare const WEBHOOK_EVENT_TYPES: readonly ["job.created", "job.succeeded", "job.failed", "job.canceled", "job.progress", "output.created", "output.ready", "output.failed", "output.progress", "video.uploaded", "video.deleted", "app.created", "app.updated"];
10719
+ declare const WEBHOOK_EVENT_TYPES: readonly ["job.created", "job.succeeded", "job.failed", "job.canceled", "job.progress", "output.created", "output.ready", "output.failed", "output.progress", "video.uploaded", "video.ready", "video.failed", "video.deleted", "video.source_scheduled_for_deletion", "app.created", "app.updated", "app.spend_limit_warning", "app.spend_limit_exceeded"];
8687
10720
  /** A concrete event type the API can emit (excludes the `"*"` wildcard). */
8688
10721
  type WebhookEventType = (typeof WEBHOOK_EVENT_TYPES)[number];
10722
+ /**
10723
+ * Narrow an event to the closed {@link KnownWebhookEvent} union, which this
10724
+ * SDK version types precisely. Gate a `switch (event.type)` on it so each
10725
+ * `case` narrows `event.data` to the right resource (with exhaustiveness
10726
+ * checking); the `else` branch keeps {@link UnknownWebhookEvent} — a raw
10727
+ * `data: unknown` — so events added to the API after this SDK release still
10728
+ * flow through untyped rather than being dropped.
10729
+ *
10730
+ * @example
10731
+ * ```ts
10732
+ * if (Webhooks.isKnownEvent(event)) {
10733
+ * switch (event.type) {
10734
+ * case "job.succeeded":
10735
+ * console.log(event.data.id); // event.data is a fully-typed Job
10736
+ * break;
10737
+ * }
10738
+ * } else {
10739
+ * console.log("unhandled future event", event.type);
10740
+ * }
10741
+ * ```
10742
+ */
10743
+ declare function isKnownEvent(event: WebhookEvent): event is KnownWebhookEvent;
10744
+ /**
10745
+ * Narrow an event to a single known type. Convenient for a receiver that only
10746
+ * cares about one or two events and would rather not `switch`.
10747
+ *
10748
+ * @example
10749
+ * ```ts
10750
+ * if (Webhooks.isEventType(event, "output.ready")) {
10751
+ * console.log(event.data.outputUrl); // event.data is a fully-typed JobOutput
10752
+ * }
10753
+ * ```
10754
+ */
10755
+ declare function isEventType<T extends WebhookEventType>(event: WebhookEvent, type: T): event is Extract<KnownWebhookEvent, {
10756
+ type: T;
10757
+ }>;
8689
10758
 
8690
10759
  /**
8691
10760
  * Query and replay events. Each event the SDK hands back is the same
@@ -9886,6 +11955,13 @@ declare class Preset extends Message<Preset> {
9886
11955
  * @generated from field: string id = 1;
9887
11956
  */
9888
11957
  id: string;
11958
+ /**
11959
+ * Parent app that owns this preset. Server-set; ignored on requests.
11960
+ * Empty for system presets, which belong to no app and are visible to all.
11961
+ *
11962
+ * @generated from field: string app_id = 20;
11963
+ */
11964
+ appId: string;
9889
11965
  /**
9890
11966
  * URL-safe slug identifier (e.g., "film_1080p_standard").
9891
11967
  * Used for referencing presets in job creation.
@@ -10102,6 +12178,15 @@ declare class CreatePresetRequest extends Message<CreatePresetRequest> {
10102
12178
  * @generated from field: optional bool disable_audio = 15;
10103
12179
  */
10104
12180
  disableAudio?: boolean;
12181
+ /**
12182
+ * Optional target app. API-key callers may omit it (their key's app is used)
12183
+ * or pass their own app; a different app is rejected with PermissionDenied.
12184
+ * Portal/JWT callers pass it to create in a specific app in their org;
12185
+ * omitted selects the org's first active app.
12186
+ *
12187
+ * @generated from field: optional string app_id = 16;
12188
+ */
12189
+ appId?: string;
10105
12190
  constructor(data?: PartialMessage<CreatePresetRequest>);
10106
12191
  static readonly runtime: typeof proto3;
10107
12192
  static readonly typeName = "transcodely.v1.CreatePresetRequest";
@@ -10258,6 +12343,16 @@ declare class ListPresetsRequest extends Message<ListPresetsRequest> {
10258
12343
  * @generated from field: transcodely.v1.PaginationRequest pagination = 5;
10259
12344
  */
10260
12345
  pagination?: PaginationRequest;
12346
+ /**
12347
+ * Optional app filter for custom presets. API-key callers may omit it (their
12348
+ * key's app is used) or pass their own app; a different app is rejected with
12349
+ * PermissionDenied. Portal/JWT callers pass it to scope custom presets to a
12350
+ * specific app in their org; omitted spans all apps in the org. System
12351
+ * presets are unaffected (governed by include_system).
12352
+ *
12353
+ * @generated from field: optional string app_id = 7;
12354
+ */
12355
+ appId?: string;
10261
12356
  constructor(data?: PartialMessage<ListPresetsRequest>);
10262
12357
  static readonly runtime: typeof proto3;
10263
12358
  static readonly typeName = "transcodely.v1.ListPresetsRequest";
@@ -10935,6 +13030,11 @@ declare class Videos {
10935
13030
  constructor(transport: Transport);
10936
13031
  createUpload(req: PartialMessage<CreateUploadRequest>, opts?: CallOptions): Promise<CreateUploadResponse>;
10937
13032
  completeUpload(req: PartialMessage<CompleteUploadRequest>, opts?: CallOptions): Promise<CompleteUploadResponse>;
13033
+ /** Create a hosted video from a publicly-reachable http(s) URL in one call —
13034
+ * no separate upload step. Returns the video in "processing" status; the
13035
+ * app must have managed hosting enabled. Playback/embed URLs populate once
13036
+ * the video reaches "ready" (subscribe to `video.ready` or `watch`). */
13037
+ createFromUrl(req: PartialMessage<CreateFromUrlRequest>, opts?: CallOptions): Promise<Video>;
10938
13038
  createMultipartUpload(req: PartialMessage<CreateMultipartUploadRequest>, opts?: CallOptions): Promise<CreateMultipartUploadResponse>;
10939
13039
  getUploadPartUrls(req: PartialMessage<GetUploadPartUrlsRequest>, opts?: CallOptions): Promise<GetUploadPartUrlsResponse>;
10940
13040
  completeMultipartUpload(req: PartialMessage<CompleteMultipartUploadRequest>, opts?: CallOptions): Promise<CompleteMultipartUploadResponse>;
@@ -10949,6 +13049,14 @@ declare class Videos {
10949
13049
  includeHeartbeats?: boolean;
10950
13050
  }): AsyncIterable<WatchVideoResponse>;
10951
13051
  getUsage(req?: PartialMessage<GetUsageRequest>, opts?: CallOptions): Promise<GetUsageResponse>;
13052
+ /** Get playback analytics for a single video: plays, watch time, and unique
13053
+ * viewers aggregated per UTC day, plus range totals. Stats come from a
13054
+ * best-effort playback beacon rolled up hourly, so recent activity may lag by
13055
+ * up to an hour. Returns the full response (`daily` rows + `totals`). */
13056
+ getStats(req: PartialMessage<GetStatsRequest>, opts?: CallOptions): Promise<GetStatsResponse>;
13057
+ /** List an app's top videos ranked by plays over a date range. Returns the
13058
+ * full response (`items`). */
13059
+ listTopVideos(req?: PartialMessage<ListTopVideosRequest>, opts?: CallOptions): Promise<ListTopVideosResponse>;
10952
13060
  }
10953
13061
 
10954
13062
  /**
@@ -11037,6 +13145,8 @@ declare function constructEvent(rawBody: string | Uint8Array | Buffer, sigHeader
11037
13145
 
11038
13146
  declare const Webhooks: {
11039
13147
  readonly constructEvent: typeof constructEvent;
13148
+ readonly isKnownEvent: typeof isKnownEvent;
13149
+ readonly isEventType: typeof isEventType;
11040
13150
  readonly WebhookError: typeof WebhookError;
11041
13151
  readonly WebhookSignatureError: typeof WebhookSignatureError;
11042
13152
  readonly WebhookTimestampError: typeof WebhookTimestampError;
@@ -11067,6 +13177,7 @@ declare class Transcodely {
11067
13177
  private _health;
11068
13178
  private _webhookEndpoints;
11069
13179
  private _events;
13180
+ private _billing;
11070
13181
  constructor(config: TranscodelyConfig);
11071
13182
  /** ID of the most recent successful or failed request, Stripe-style. */
11072
13183
  get lastRequestId(): string | undefined;
@@ -11082,6 +13193,11 @@ declare class Transcodely {
11082
13193
  get health(): Health;
11083
13194
  get webhookEndpoints(): WebhookEndpoints;
11084
13195
  get events(): Events;
13196
+ /**
13197
+ * The organization's invoices. Needs a dashboard session token for an org
13198
+ * owner plus `organizationId` in the client config; API keys are rejected.
13199
+ */
13200
+ get billing(): Billing;
11085
13201
  /**
11086
13202
  * Stateless verify-and-decode helper. `client.webhooks.constructEvent(...)`
11087
13203
  * mirrors the Stripe SDK convention. The namespace is also exported at the
@@ -11092,7 +13208,7 @@ declare class Transcodely {
11092
13208
  }
11093
13209
 
11094
13210
  /** SDK version. Bumped by release-please from package.json on each tag. */
11095
- declare const SDK_VERSION = "0.2.0";
13211
+ declare const SDK_VERSION = "0.3.1";
11096
13212
  /**
11097
13213
  * API version this SDK release is pinned to. Sent on every request as
11098
13214
  * `Transcodely-Version`. Customers can override per-client via the
@@ -11102,4 +13218,4 @@ declare const API_VERSION = "2026-05-03";
11102
13218
  /** Default base URL for the production Transcodely API. */
11103
13219
  declare const DEFAULT_BASE_URL = "https://api.transcodely.com";
11104
13220
 
11105
- export { APIConnectionError, APIError, Event as APIEvent, APIKey, API_VERSION, AV1Options, AbortMultipartUploadRequest, App, AppStatus, ArchiveAppRequest, ArchiveOriginRequest, ArchivePresetRequest, AudioCodec, AudioSettings, AudioStreamInfo, AudioTrackConfig, AuthenticationError, AutoABRConfig, AutoProfileDefaults, BYOKConfig, BitrateMode, BurnInStyle, type CallOptions, CancelJobRequest, CancelJobResponse, CheckSlugRequest, CheckSlugResponse, CompleteMultipartUploadRequest, CompleteMultipartUploadResponse, CompleteUploadRequest, CompleteUploadResponse, CompletedPart, ConfirmJobRequest, ConfirmJobResponse, ConflictError, Container, ContentAnalysis, ContentAwareConfig, ContentAwareMode, ContentType, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateAppRequest, CreateAppResponse, CreateJobRequest, CreateJobResponse, CreateMultipartUploadRequest, CreateMultipartUploadResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOriginRequest, CreateOriginResponse, CreatePresetRequest, CreatePresetResponse, CreateUploadRequest, CreateUploadResponse, CreateWebhookConfig, CreateWebhookEndpointRequest, CreateWebhookEndpointResponse, DASHConfig, DEFAULT_BASE_URL, DEFAULT_TOLERANCE_SECONDS, DRMConfig, DRMSystem, DeleteVideoRequest, DeleteWebhookEndpointRequest, DeleteWebhookEndpointResponse, DeliveryFormat, DuplicatePresetRequest, DuplicatePresetResponse, EVENT_ID_HEADER, EnableHostingRequest, EnableHostingResponse, EncryptionScheme, ErrorDetails, type EventBase, ExecutionTiming, type FieldViolation, GOPAlignmentMode, GcsCredentials, GcsOriginConfig, GetAPIKeyRequest, GetAPIKeyResponse, GetAppRequest, GetAppResponse, GetEndpointHealthRequest, GetEndpointHealthResponse, GetJobRequest, GetJobResponse, GetMeRequest, GetMeResponse, GetMembershipRequest, GetMembershipResponse, GetOrganizationRequest, GetOrganizationResponse, GetOriginRequest, GetOriginResponse, GetPresetBySlugRequest, GetPresetBySlugResponse, GetPresetRequest, GetPresetResponse, GetUploadPartUrlsRequest, GetUploadPartUrlsResponse, GetUsageRequest, GetUsageResponse, GetUserRequest, GetUserResponse, GetVideoRequest, GetVideoResponse, H264Options, H265Options, HDRConfig, HDRFormat, HDRMode, HLSConfig, HLSPlaylistType, HLSSegmentFormat, HealthBucket, HostingConfig, HttpCredentials, HttpOriginConfig, InputMetadata, InvalidRequestError, Job, JobOutput, JobPriority, JobStatus, KeyServerConfig, ListAPIKeysRequest, ListAPIKeysResponse, ListAppsRequest, ListAppsResponse, ListEventsRequest, ListEventsResponse, ListJobsRequest, ListJobsResponse, ListMembershipsRequest, ListMembershipsResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListOriginsRequest, ListOriginsResponse, ListPresetsRequest, ListPresetsResponse, ListUsersRequest, ListUsersResponse, ListVideosRequest, ListVideosResponse, ListWebhookDeliveriesRequest, ListWebhookDeliveriesResponse, ListWebhookEndpointsRequest, ListWebhookEndpointsResponse, type LogEvent, Membership, MembershipRole, MembershipStatus, MembershipWithUser, NotFoundError, Organization, OrganizationStatus, Origin, OriginPermission, OriginProvider, OriginRef, OriginStatus, OutputFormat, OutputSpec, OutputStatus, OutputVariantResult, Page, PaginationRequest, PaginationResponse, PermissionError, PreconditionError, Preset, PresetVariant, PricingSnapshot, QualityTier, R2Jurisdiction, R2OriginConfig, RateLimitError, RemoveMembershipRequest, ResendEventRequest, ResendEventResponse, Resolution, RetrieveEventRequest, RetrieveEventResponse, RetrieveWebhookEndpointRequest, RetrieveWebhookEndpointResponse, RevokeAPIKeyRequest, RotateWebhookSecretRequest, RotateWebhookSecretResponse, S3Credentials, S3OriginConfig, SDK_VERSION, SIGNATURE_HEADER, SegmentConfig, SendTestWebhookRequest, SendTestWebhookResponse, StreamingConfig, SubtitleFormat, SubtitleOperation, SubtitleStreamInfo, SubtitleTrack, ThumbnailFormat, ThumbnailMode, ThumbnailResult, ThumbnailSpec, ToneMapping, Transcodely, type TranscodelyConfig, TranscodelyError, UpdateAppRequest, UpdateAppResponse, UpdateHostingConfigRequest, UpdateHostingConfigResponse, UpdateMeRequest, UpdateMeResponse, UpdateMembershipRoleRequest, UpdateMembershipRoleResponse, UpdateOrganizationRequest, UpdateOrganizationResponse, UpdateOriginRequest, UpdateOriginResponse, UpdatePresetRequest, UpdatePresetResponse, UpdateVideoRequest, UpdateVideoResponse, UpdateWebhookConfig, UpdateWebhookEndpointRequest, UpdateWebhookEndpointResponse, UploadPart, UsageSummary, User, UserApprovalStatus, UserOrganization, UserStatus, UserWithOrganizations, VP9Options, ValidateOriginRequest, ValidateOriginResponse, ValidationResult, VariantPricingSnapshot, type VerifyOptions, Video, VideoCodec, VideoRendition, VideoSettings, VideoStatus, VideoStreamInfo, VideoVariant, VideoVisibility, WEBHOOK_EVENT_TYPES, WatchEventType, WatchJobRequest, WatchJobResponse, WatchVideoRequest, WatchVideoResponse, WebhookConfig, WebhookDelivery, WebhookEndpoint, WebhookError, type WebhookEvent, type WebhookEventType, WebhookPayloadError, WebhookSignatureError, WebhookTimestampError, Webhooks, constructEvent, verifySignature };
13221
+ export { APIConnectionError, APIError, Event as APIEvent, APIKey, API_VERSION, AV1Options, AbortMultipartUploadRequest, App, AppStatus, ArchiveAppRequest, ArchiveOriginRequest, ArchivePresetRequest, AudioCodec, AudioSettings, AudioStreamInfo, AudioTrackConfig, AuthenticationError, AutoABRConfig, AutoProfileDefaults, BYOKConfig, BitrateMode, BurnInStyle, type CallOptions, CancelJobRequest, CancelJobResponse, ChapterPoint, ChapterResult, CheckSlugRequest, CheckSlugResponse, ClipConfig, CompleteMultipartUploadRequest, CompleteMultipartUploadResponse, CompleteUploadRequest, CompleteUploadResponse, CompletedPart, ConfirmJobRequest, ConfirmJobResponse, ConflictError, Container, ContentAnalysis, ContentAwareConfig, ContentAwareMode, ContentType, CreateAPIKeyRequest, CreateAPIKeyResponse, CreateAppRequest, CreateAppResponse, CreateFromUrlRequest, CreateFromUrlResponse, CreateJobRequest, CreateJobResponse, CreateMultipartUploadRequest, CreateMultipartUploadResponse, CreateOrganizationRequest, CreateOrganizationResponse, CreateOriginRequest, CreateOriginResponse, CreatePresetRequest, CreatePresetResponse, CreateUploadRequest, CreateUploadResponse, CreateWebhookEndpointRequest, CreateWebhookEndpointResponse, DASHConfig, DEFAULT_BASE_URL, DEFAULT_TOLERANCE_SECONDS, DRMConfig, DRMSystem, DailyUsage, DeleteVideoRequest, DeleteWebhookEndpointRequest, DeleteWebhookEndpointResponse, DeliveryFormat, DuplicatePresetRequest, DuplicatePresetResponse, EVENT_ID_HEADER, EnableHostingRequest, EnableHostingResponse, EncryptionScheme, EndpointHealthSummary, ErrorDetails, type EventBase, ExecutionTiming, type FieldViolation, GOPAlignmentMode, GcsCredentials, GcsOriginConfig, GetAPIKeyRequest, GetAPIKeyResponse, GetAppRequest, GetAppResponse, GetEndpointHealthRequest, GetEndpointHealthResponse, GetInvoiceRequest, GetInvoiceResponse, GetJobRequest, GetJobResponse, GetMeRequest, GetMeResponse, GetMembershipRequest, GetMembershipResponse, GetOrganizationRequest, GetOrganizationResponse, GetOriginRequest, GetOriginResponse, GetPresetBySlugRequest, GetPresetBySlugResponse, GetPresetRequest, GetPresetResponse, GetSpendRequest, GetSpendResponse, GetStatsRequest, GetStatsResponse, GetUpcomingInvoiceRequest, GetUpcomingInvoiceResponse, GetUploadPartUrlsRequest, GetUploadPartUrlsResponse, GetUsageRequest, GetUsageResponse, GetUserRequest, GetUserResponse, GetVideoRequest, GetVideoResponse, H264Options, H265Options, HDRConfig, HDRFormat, HDRMode, HLSConfig, HLSPlaylistType, HLSSegmentFormat, HealthBucket, HostingConfig, HttpCredentials, HttpOriginConfig, InputMetadata, InvalidRequestError, Invoice, InvoiceLineItem, InvoiceLineType, InvoiceStatus, Job, JobFee, JobOutput, JobPriority, JobStatus, KeyServerConfig, type KnownWebhookEvent, ListAPIKeysRequest, ListAPIKeysResponse, ListAppsRequest, ListAppsResponse, ListEventsRequest, ListEventsResponse, ListInvoicesRequest, ListInvoicesResponse, ListJobsRequest, ListJobsResponse, ListMembershipsRequest, ListMembershipsResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListOriginsRequest, ListOriginsResponse, ListPresetsRequest, ListPresetsResponse, ListTopVideosRequest, ListTopVideosResponse, ListUsersRequest, ListUsersResponse, ListVideosRequest, ListVideosResponse, ListWebhookDeliveriesRequest, ListWebhookDeliveriesResponse, ListWebhookEndpointsRequest, ListWebhookEndpointsResponse, type LogEvent, Membership, MembershipRole, MembershipStatus, MembershipWithUser, NotFoundError, Organization, OrganizationStatus, Origin, OriginPermission, OriginProvider, OriginRef, OriginStatus, OutputFormat, OutputSpec, OutputStatus, OutputVariantResult, Page, PaginationRequest, PaginationResponse, PermissionError, PreconditionError, Preset, PresetVariant, PricingSnapshot, QualityTier, R2Jurisdiction, R2OriginConfig, RateLimitError, RemoveMembershipRequest, ResendEventRequest, ResendEventResponse, Resolution, RetrieveEventRequest, RetrieveEventResponse, RetrieveWebhookEndpointRequest, RetrieveWebhookEndpointResponse, RevokeAPIKeyRequest, RotateWebhookSecretRequest, RotateWebhookSecretResponse, S3Credentials, S3OriginConfig, SDK_VERSION, SIGNATURE_HEADER, SegmentConfig, SendTestWebhookRequest, SendTestWebhookResponse, type SpendLimitNotification, StreamingConfig, SubtitleFormat, SubtitleOperation, SubtitleResult, SubtitleStreamInfo, SubtitleTrack, ThumbnailFormat, ThumbnailMode, ThumbnailResult, ThumbnailSpec, ToneMapping, TopVideo, Transcodely, type TranscodelyConfig, TranscodelyError, type UnknownWebhookEvent, UpdateAppRequest, UpdateAppResponse, UpdateHostingConfigRequest, UpdateHostingConfigResponse, UpdateMeRequest, UpdateMeResponse, UpdateMembershipRoleRequest, UpdateMembershipRoleResponse, UpdateOrganizationRequest, UpdateOrganizationResponse, UpdateOriginRequest, UpdateOriginResponse, UpdatePresetRequest, UpdatePresetResponse, UpdateSpendLimitRequest, UpdateSpendLimitResponse, UpdateVideoRequest, UpdateVideoResponse, UpdateWebhookEndpointRequest, UpdateWebhookEndpointResponse, UploadPart, UsageSummary, User, UserApprovalStatus, UserOrganization, UserStatus, UserWithOrganizations, VP9Options, ValidateOriginRequest, ValidateOriginResponse, ValidationResult, VariantPricingSnapshot, type VerifyOptions, Video, VideoCodec, VideoRendition, VideoSettings, VideoStatsDay, VideoStatsTotals, VideoStatus, VideoStreamInfo, VideoTextTrack, VideoVariant, VideoVisibility, WEBHOOK_EVENT_TYPES, WatchEventType, WatchJobRequest, WatchJobResponse, WatchVideoRequest, WatchVideoResponse, WatermarkAnchor, WatermarkConfig, WatermarkPixelPlacement, WebhookDelivery, WebhookEndpoint, WebhookError, type WebhookEvent, type WebhookEventType, WebhookPayloadError, WebhookSignatureError, WebhookTimestampError, Webhooks, constructEvent, isEventType, isKnownEvent, verifySignature };