@rendobar/sdk 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,8 +23,10 @@ const job = await client.jobs.create({
23
23
  });
24
24
 
25
25
  // Wait for completion
26
+ import { outputUrl } from "@rendobar/sdk";
27
+
26
28
  const result = await client.jobs.wait(job.id);
27
- console.log(result.outputUrl);
29
+ console.log(outputUrl(result)); // primary download/playable URL
28
30
  ```
29
31
 
30
32
  ## Authentication
@@ -99,6 +101,78 @@ const logs = await client.jobs.logs("job_abc");
99
101
  const types = await client.jobs.types();
100
102
  ```
101
103
 
104
+ ### Job output
105
+
106
+ Every job type returns the same output shape. A completed job carries an
107
+ `output` with four fields:
108
+
109
+ ```typescript
110
+ type Output = {
111
+ data: unknown; // structured result (probe, detections, transcript), or null
112
+ file: OutputFile | null; // the headline file or stream manifest, or null
113
+ files: OutputFile[]; // every produced file (empty for data-only jobs)
114
+ expiresAt: number | null; // Unix ms URL expiry, set when files is non-empty
115
+ };
116
+
117
+ type OutputFile = {
118
+ url: string; // ready-to-fetch, time-limited URL
119
+ path: string; // path within the job output
120
+ type: "video" | "image" | "audio" | "captions" | "playlist" | "data" | "other";
121
+ size: number; // bytes
122
+ meta?: { format?: string; width?: number; height?: number; durationMs?: number };
123
+ };
124
+ ```
125
+
126
+ `output` exists only on a completed job (`status === "complete"`), so narrow on
127
+ status before reading it.
128
+
129
+ ```typescript
130
+ import { outputUrl, jobData } from "@rendobar/sdk";
131
+
132
+ const job = await client.jobs.wait("job_abc");
133
+
134
+ // Headline URL: the single file, or a stream manifest (.m3u8/.mpd). Returns
135
+ // undefined for data-only jobs and pure file sets (no single headline).
136
+ const url = outputUrl(job);
137
+
138
+ // Or read it yourself after a status check
139
+ if (job.status === "complete") {
140
+ console.log(job.output.file?.url);
141
+
142
+ // Iterate every produced file (frame extraction, HLS segments, sprite sets)
143
+ for (const f of job.output.files) {
144
+ console.log(f.type, f.path, f.size, f.url);
145
+ }
146
+ }
147
+
148
+ // A failed job carries a structured error instead
149
+ if (job.status === "failed") {
150
+ console.log(job.error.code, job.error.message, job.error.detail);
151
+ }
152
+ ```
153
+
154
+ For data jobs (`extract.metadata`, `caption.extract`, detections), the answer is
155
+ in `output.data`. It is `unknown` at the contract level because its shape is
156
+ job-type-specific. Use `jobData<T>(job)` to read it with your expected type, or
157
+ read `job.output.data` and narrow it yourself:
158
+
159
+ ```typescript
160
+ import { jobData } from "@rendobar/sdk";
161
+
162
+ type Metadata = { format: string; durationMs: number; width: number; height: number };
163
+
164
+ const job = await client.jobs.wait("job_abc");
165
+ const meta = jobData<Metadata>(job); // Metadata | null
166
+
167
+ if (meta) {
168
+ console.log(meta.format, meta.durationMs);
169
+ }
170
+ ```
171
+
172
+ `T` is your claim about the shape for the job type you submitted. If the input is
173
+ untrusted, validate `output.data` yourself (e.g. with Zod) instead of asserting a
174
+ type.
175
+
102
176
  ## Raw FFmpeg
103
177
 
104
178
  Run arbitrary FFmpeg commands in a sandboxed container. Commands are parsed, sanitized (protocol whitelist/blacklist flags blocked), and executed with a clean process environment.
@@ -120,7 +194,7 @@ const job = await client.jobs.create({
120
194
  });
121
195
 
122
196
  const done = await client.jobs.wait(job.id);
123
- console.log(done.outputUrl);
197
+ console.log(outputUrl(done));
124
198
  ```
125
199
 
126
200
  Prefer named inputs? Pass them in the top-level `inputs` map and reference the keys in the command:
@@ -258,7 +332,7 @@ All response types are exported:
258
332
 
259
333
  ```typescript
260
334
  import type {
261
- Job, JobStep, JobType, JobCreatedResponse,
335
+ Job, JobStep, Output, OutputFile, FileType, JobError, Cost, JobType, JobCreatedResponse,
262
336
  BillingState, Transaction, UsageSummary,
263
337
  WebhookEndpoint, WebhookDelivery,
264
338
  Organization, ApiKey, PaginationMeta,
package/dist/index.cjs CHANGED
@@ -646,6 +646,44 @@ function createClient(config = {}) {
646
646
  };
647
647
  }
648
648
  //#endregion
649
+ //#region src/types.ts
650
+ /**
651
+ * Primary playable/download URL for a completed job, or `undefined`.
652
+ *
653
+ * Returns `output.file.url` — the single download for a file job or the playlist
654
+ * URL for a stream. A pure set (multiple files, no headline) or a data-only job
655
+ * has no single primary URL: inspect `job.output.files` / `job.output.data`.
656
+ */
657
+ function outputUrl(job) {
658
+ if (job.status !== "complete") return void 0;
659
+ return job.output.file?.url;
660
+ }
661
+ /**
662
+ * Typed accessor for a completed job's structured `data`, or `null`.
663
+ *
664
+ * `output.data` is job-type-specific (probe result, detections, transcript) and
665
+ * is `unknown` at the contract level — its shape is documented per job type, not
666
+ * by the API schema. This helper applies the caller-supplied type `T` so you can
667
+ * read `data` without sprinkling assertions at each call site. `T` is your claim
668
+ * about the shape for the job type you submitted; validate it yourself (e.g. with
669
+ * Zod) if the input is untrusted.
670
+ *
671
+ * Returns `null` for non-complete jobs and for jobs with no structured data
672
+ * (pure file transforms).
673
+ *
674
+ * @example
675
+ * type Metadata = { format: string; durationMs: number };
676
+ * const meta = jobData<Metadata>(await client.jobs.wait(id));
677
+ * if (meta) console.log(meta.durationMs);
678
+ */
679
+ function jobData(job) {
680
+ if (job.status !== "complete") return null;
681
+ if (job.output.data == null) return null;
682
+ return job.output.data;
683
+ }
684
+ //#endregion
649
685
  exports.ApiError = ApiError;
650
686
  exports.createClient = createClient;
651
687
  exports.isApiError = isApiError;
688
+ exports.jobData = jobData;
689
+ exports.outputUrl = outputUrl;
package/dist/index.d.cts CHANGED
@@ -2109,28 +2109,156 @@ declare const jobStepSchema: ZodObject<{
2109
2109
  meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2110
2110
  error: ZodOptional<ZodString>;
2111
2111
  }, $strip>;
2112
- declare const jobResponseSchema: ZodObject<{
2112
+ /**
2113
+ * File type, an OPEN enum (tolerant-reader contract). Derived from the file
2114
+ * extension. Clients MUST tolerate unknown future values and fall back to
2115
+ * treating the file as opaque ("other"). Adding a value here is non-breaking.
2116
+ */
2117
+ declare const fileTypeSchema: ZodEnum<{
2118
+ video: "video";
2119
+ image: "image";
2120
+ audio: "audio";
2121
+ captions: "captions";
2122
+ playlist: "playlist";
2123
+ data: "data";
2124
+ other: "other";
2125
+ }>;
2126
+ /**
2127
+ * A single produced file. `url` is a ready-to-fetch, time-limited URL (signed
2128
+ * download URL for single-file jobs, token-in-path serving URL for served
2129
+ * multi-file jobs). `path` is the file's path within the job output (basename
2130
+ * for single-file jobs, prefix-relative path for served jobs).
2131
+ */
2132
+ declare const fileSchema: ZodObject<{
2133
+ url: ZodString;
2134
+ path: ZodString;
2135
+ type: ZodEnum<{
2136
+ video: "video";
2137
+ image: "image";
2138
+ audio: "audio";
2139
+ captions: "captions";
2140
+ playlist: "playlist";
2141
+ data: "data";
2142
+ other: "other";
2143
+ }>;
2144
+ size: ZodNumber;
2145
+ meta: ZodOptional<ZodObject<{
2146
+ format: ZodOptional<ZodString>;
2147
+ width: ZodOptional<ZodNumber>;
2148
+ height: ZodOptional<ZodNumber>;
2149
+ durationMs: ZodOptional<ZodNumber>;
2150
+ }, $strip>>;
2151
+ }, $strip>;
2152
+ declare const jobOutputSchema: ZodObject<{
2153
+ data: ZodUnknown;
2154
+ file: ZodNullable<ZodObject<{
2155
+ url: ZodString;
2156
+ path: ZodString;
2157
+ type: ZodEnum<{
2158
+ video: "video";
2159
+ image: "image";
2160
+ audio: "audio";
2161
+ captions: "captions";
2162
+ playlist: "playlist";
2163
+ data: "data";
2164
+ other: "other";
2165
+ }>;
2166
+ size: ZodNumber;
2167
+ meta: ZodOptional<ZodObject<{
2168
+ format: ZodOptional<ZodString>;
2169
+ width: ZodOptional<ZodNumber>;
2170
+ height: ZodOptional<ZodNumber>;
2171
+ durationMs: ZodOptional<ZodNumber>;
2172
+ }, $strip>>;
2173
+ }, $strip>>;
2174
+ files: ZodArray<ZodObject<{
2175
+ url: ZodString;
2176
+ path: ZodString;
2177
+ type: ZodEnum<{
2178
+ video: "video";
2179
+ image: "image";
2180
+ audio: "audio";
2181
+ captions: "captions";
2182
+ playlist: "playlist";
2183
+ data: "data";
2184
+ other: "other";
2185
+ }>;
2186
+ size: ZodNumber;
2187
+ meta: ZodOptional<ZodObject<{
2188
+ format: ZodOptional<ZodString>;
2189
+ width: ZodOptional<ZodNumber>;
2190
+ height: ZodOptional<ZodNumber>;
2191
+ durationMs: ZodOptional<ZodNumber>;
2192
+ }, $strip>>;
2193
+ }, $strip>>;
2194
+ expiresAt: ZodNullable<ZodNumber>;
2195
+ }, $strip>;
2196
+ declare const jobErrorSchema: ZodObject<{
2197
+ code: ZodString;
2198
+ message: ZodString;
2199
+ detail: ZodNullable<ZodString>;
2200
+ retryable: ZodBoolean;
2201
+ }, $strip>;
2202
+ declare const jobCostSchema: ZodObject<{
2203
+ amount: ZodNumber;
2204
+ currency: ZodLiteral<"USD">;
2205
+ formatted: ZodString;
2206
+ }, $strip>;
2207
+ declare const jobResponseSchema: ZodDiscriminatedUnion<[ZodObject<{
2113
2208
  id: ZodString;
2114
2209
  orgId: ZodString;
2115
2210
  type: ZodString;
2116
- status: ZodString;
2117
2211
  inputs: ZodRecord<ZodString, ZodUnknown>;
2118
2212
  params: ZodRecord<ZodString, ZodUnknown>;
2119
- outputUrl: ZodNullable<ZodString>;
2120
- posterUrl: ZodNullable<ZodString>;
2121
- outputMeta: ZodNullable<ZodRecord<ZodString, ZodUnknown>>;
2122
- errorCode: ZodNullable<ZodString>;
2123
- errorMessage: ZodNullable<ZodString>;
2124
- price: ZodNullable<ZodNumber>;
2125
- priceFormatted: ZodNullable<ZodString>;
2126
2213
  cost: ZodNullable<ZodObject<{
2127
- total: ZodNumber;
2128
- currency: ZodString;
2214
+ amount: ZodNumber;
2215
+ currency: ZodLiteral<"USD">;
2216
+ formatted: ZodString;
2129
2217
  }, $strip>>;
2218
+ outputCategory: ZodEnum<{
2219
+ video: "video";
2220
+ image: "image";
2221
+ audio: "audio";
2222
+ captions: "captions";
2223
+ json: "json";
2224
+ raw: "raw";
2225
+ }>;
2226
+ steps: ZodArray<ZodObject<{
2227
+ id: ZodString;
2228
+ name: ZodString;
2229
+ status: ZodString;
2230
+ startedAt: ZodOptional<ZodNumber>;
2231
+ completedAt: ZodOptional<ZodNumber>;
2232
+ durationMs: ZodOptional<ZodNumber>;
2233
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2234
+ error: ZodOptional<ZodString>;
2235
+ }, $strip>>;
2236
+ logsAvailable: ZodBoolean;
2130
2237
  createdAt: ZodNumber;
2131
2238
  dispatchedAt: ZodNullable<ZodNumber>;
2132
2239
  startedAt: ZodNullable<ZodNumber>;
2133
2240
  completedAt: ZodNullable<ZodNumber>;
2241
+ settledAt: ZodNullable<ZodNumber>;
2242
+ status: ZodLiteral<"waiting">;
2243
+ }, $strip>, ZodObject<{
2244
+ id: ZodString;
2245
+ orgId: ZodString;
2246
+ type: ZodString;
2247
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2248
+ params: ZodRecord<ZodString, ZodUnknown>;
2249
+ cost: ZodNullable<ZodObject<{
2250
+ amount: ZodNumber;
2251
+ currency: ZodLiteral<"USD">;
2252
+ formatted: ZodString;
2253
+ }, $strip>>;
2254
+ outputCategory: ZodEnum<{
2255
+ video: "video";
2256
+ image: "image";
2257
+ audio: "audio";
2258
+ captions: "captions";
2259
+ json: "json";
2260
+ raw: "raw";
2261
+ }>;
2134
2262
  steps: ZodArray<ZodObject<{
2135
2263
  id: ZodString;
2136
2264
  name: ZodString;
@@ -2141,11 +2269,212 @@ declare const jobResponseSchema: ZodObject<{
2141
2269
  meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2142
2270
  error: ZodOptional<ZodString>;
2143
2271
  }, $strip>>;
2144
- outputCategory: ZodString;
2145
- mediaType: ZodNullable<ZodString>;
2146
2272
  logsAvailable: ZodBoolean;
2273
+ createdAt: ZodNumber;
2274
+ dispatchedAt: ZodNullable<ZodNumber>;
2275
+ startedAt: ZodNullable<ZodNumber>;
2276
+ completedAt: ZodNullable<ZodNumber>;
2147
2277
  settledAt: ZodNullable<ZodNumber>;
2148
- }, $strip>;
2278
+ status: ZodLiteral<"dispatched">;
2279
+ progress: ZodOptional<ZodNumber>;
2280
+ eta: ZodOptional<ZodNullable<ZodNumber>>;
2281
+ }, $strip>, ZodObject<{
2282
+ id: ZodString;
2283
+ orgId: ZodString;
2284
+ type: ZodString;
2285
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2286
+ params: ZodRecord<ZodString, ZodUnknown>;
2287
+ cost: ZodNullable<ZodObject<{
2288
+ amount: ZodNumber;
2289
+ currency: ZodLiteral<"USD">;
2290
+ formatted: ZodString;
2291
+ }, $strip>>;
2292
+ outputCategory: ZodEnum<{
2293
+ video: "video";
2294
+ image: "image";
2295
+ audio: "audio";
2296
+ captions: "captions";
2297
+ json: "json";
2298
+ raw: "raw";
2299
+ }>;
2300
+ steps: ZodArray<ZodObject<{
2301
+ id: ZodString;
2302
+ name: ZodString;
2303
+ status: ZodString;
2304
+ startedAt: ZodOptional<ZodNumber>;
2305
+ completedAt: ZodOptional<ZodNumber>;
2306
+ durationMs: ZodOptional<ZodNumber>;
2307
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2308
+ error: ZodOptional<ZodString>;
2309
+ }, $strip>>;
2310
+ logsAvailable: ZodBoolean;
2311
+ createdAt: ZodNumber;
2312
+ dispatchedAt: ZodNullable<ZodNumber>;
2313
+ startedAt: ZodNullable<ZodNumber>;
2314
+ completedAt: ZodNullable<ZodNumber>;
2315
+ settledAt: ZodNullable<ZodNumber>;
2316
+ status: ZodLiteral<"running">;
2317
+ progress: ZodNumber;
2318
+ eta: ZodNullable<ZodNumber>;
2319
+ }, $strip>, ZodObject<{
2320
+ id: ZodString;
2321
+ orgId: ZodString;
2322
+ type: ZodString;
2323
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2324
+ params: ZodRecord<ZodString, ZodUnknown>;
2325
+ cost: ZodNullable<ZodObject<{
2326
+ amount: ZodNumber;
2327
+ currency: ZodLiteral<"USD">;
2328
+ formatted: ZodString;
2329
+ }, $strip>>;
2330
+ outputCategory: ZodEnum<{
2331
+ video: "video";
2332
+ image: "image";
2333
+ audio: "audio";
2334
+ captions: "captions";
2335
+ json: "json";
2336
+ raw: "raw";
2337
+ }>;
2338
+ steps: ZodArray<ZodObject<{
2339
+ id: ZodString;
2340
+ name: ZodString;
2341
+ status: ZodString;
2342
+ startedAt: ZodOptional<ZodNumber>;
2343
+ completedAt: ZodOptional<ZodNumber>;
2344
+ durationMs: ZodOptional<ZodNumber>;
2345
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2346
+ error: ZodOptional<ZodString>;
2347
+ }, $strip>>;
2348
+ logsAvailable: ZodBoolean;
2349
+ createdAt: ZodNumber;
2350
+ dispatchedAt: ZodNullable<ZodNumber>;
2351
+ startedAt: ZodNullable<ZodNumber>;
2352
+ completedAt: ZodNullable<ZodNumber>;
2353
+ settledAt: ZodNullable<ZodNumber>;
2354
+ status: ZodLiteral<"complete">;
2355
+ output: ZodObject<{
2356
+ data: ZodUnknown;
2357
+ file: ZodNullable<ZodObject<{
2358
+ url: ZodString;
2359
+ path: ZodString;
2360
+ type: ZodEnum<{
2361
+ video: "video";
2362
+ image: "image";
2363
+ audio: "audio";
2364
+ captions: "captions";
2365
+ playlist: "playlist";
2366
+ data: "data";
2367
+ other: "other";
2368
+ }>;
2369
+ size: ZodNumber;
2370
+ meta: ZodOptional<ZodObject<{
2371
+ format: ZodOptional<ZodString>;
2372
+ width: ZodOptional<ZodNumber>;
2373
+ height: ZodOptional<ZodNumber>;
2374
+ durationMs: ZodOptional<ZodNumber>;
2375
+ }, $strip>>;
2376
+ }, $strip>>;
2377
+ files: ZodArray<ZodObject<{
2378
+ url: ZodString;
2379
+ path: ZodString;
2380
+ type: ZodEnum<{
2381
+ video: "video";
2382
+ image: "image";
2383
+ audio: "audio";
2384
+ captions: "captions";
2385
+ playlist: "playlist";
2386
+ data: "data";
2387
+ other: "other";
2388
+ }>;
2389
+ size: ZodNumber;
2390
+ meta: ZodOptional<ZodObject<{
2391
+ format: ZodOptional<ZodString>;
2392
+ width: ZodOptional<ZodNumber>;
2393
+ height: ZodOptional<ZodNumber>;
2394
+ durationMs: ZodOptional<ZodNumber>;
2395
+ }, $strip>>;
2396
+ }, $strip>>;
2397
+ expiresAt: ZodNullable<ZodNumber>;
2398
+ }, $strip>;
2399
+ }, $strip>, ZodObject<{
2400
+ id: ZodString;
2401
+ orgId: ZodString;
2402
+ type: ZodString;
2403
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2404
+ params: ZodRecord<ZodString, ZodUnknown>;
2405
+ cost: ZodNullable<ZodObject<{
2406
+ amount: ZodNumber;
2407
+ currency: ZodLiteral<"USD">;
2408
+ formatted: ZodString;
2409
+ }, $strip>>;
2410
+ outputCategory: ZodEnum<{
2411
+ video: "video";
2412
+ image: "image";
2413
+ audio: "audio";
2414
+ captions: "captions";
2415
+ json: "json";
2416
+ raw: "raw";
2417
+ }>;
2418
+ steps: ZodArray<ZodObject<{
2419
+ id: ZodString;
2420
+ name: ZodString;
2421
+ status: ZodString;
2422
+ startedAt: ZodOptional<ZodNumber>;
2423
+ completedAt: ZodOptional<ZodNumber>;
2424
+ durationMs: ZodOptional<ZodNumber>;
2425
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2426
+ error: ZodOptional<ZodString>;
2427
+ }, $strip>>;
2428
+ logsAvailable: ZodBoolean;
2429
+ createdAt: ZodNumber;
2430
+ dispatchedAt: ZodNullable<ZodNumber>;
2431
+ startedAt: ZodNullable<ZodNumber>;
2432
+ completedAt: ZodNullable<ZodNumber>;
2433
+ settledAt: ZodNullable<ZodNumber>;
2434
+ status: ZodLiteral<"failed">;
2435
+ error: ZodObject<{
2436
+ code: ZodString;
2437
+ message: ZodString;
2438
+ detail: ZodNullable<ZodString>;
2439
+ retryable: ZodBoolean;
2440
+ }, $strip>;
2441
+ }, $strip>, ZodObject<{
2442
+ id: ZodString;
2443
+ orgId: ZodString;
2444
+ type: ZodString;
2445
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2446
+ params: ZodRecord<ZodString, ZodUnknown>;
2447
+ cost: ZodNullable<ZodObject<{
2448
+ amount: ZodNumber;
2449
+ currency: ZodLiteral<"USD">;
2450
+ formatted: ZodString;
2451
+ }, $strip>>;
2452
+ outputCategory: ZodEnum<{
2453
+ video: "video";
2454
+ image: "image";
2455
+ audio: "audio";
2456
+ captions: "captions";
2457
+ json: "json";
2458
+ raw: "raw";
2459
+ }>;
2460
+ steps: ZodArray<ZodObject<{
2461
+ id: ZodString;
2462
+ name: ZodString;
2463
+ status: ZodString;
2464
+ startedAt: ZodOptional<ZodNumber>;
2465
+ completedAt: ZodOptional<ZodNumber>;
2466
+ durationMs: ZodOptional<ZodNumber>;
2467
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2468
+ error: ZodOptional<ZodString>;
2469
+ }, $strip>>;
2470
+ logsAvailable: ZodBoolean;
2471
+ createdAt: ZodNumber;
2472
+ dispatchedAt: ZodNullable<ZodNumber>;
2473
+ startedAt: ZodNullable<ZodNumber>;
2474
+ completedAt: ZodNullable<ZodNumber>;
2475
+ settledAt: ZodNullable<ZodNumber>;
2476
+ status: ZodLiteral<"cancelled">;
2477
+ }, $strip>], "status">;
2149
2478
  declare const jobCreatedResponseSchema: ZodObject<{
2150
2479
  id: ZodString;
2151
2480
  status: ZodLiteral<"waiting">;
@@ -2297,6 +2626,11 @@ declare const paymentMethodSchema: ZodObject<{
2297
2626
  }, $strip>;
2298
2627
  type JobResponse = output<typeof jobResponseSchema>;
2299
2628
  type JobStep = output<typeof jobStepSchema>;
2629
+ type Output = output<typeof jobOutputSchema>;
2630
+ type OutputFile = output<typeof fileSchema>;
2631
+ type FileType = output<typeof fileTypeSchema>;
2632
+ type JobError = output<typeof jobErrorSchema>;
2633
+ type Cost = output<typeof jobCostSchema>;
2300
2634
  type JobCreatedResponse = output<typeof jobCreatedResponseSchema>;
2301
2635
  type JobType = output<typeof jobTypeSchema>;
2302
2636
  type BillingState = output<typeof billingStateSchema>;
@@ -2326,7 +2660,6 @@ declare const orgEventSchema: ZodDiscriminatedUnion<[ZodObject<{
2326
2660
  }, $strip>, ZodObject<{
2327
2661
  type: ZodLiteral<"job.result">;
2328
2662
  jobId: ZodString;
2329
- outputMeta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2330
2663
  }, $strip>, ZodObject<{
2331
2664
  type: ZodLiteral<"balance.updated">;
2332
2665
  balance: ZodNumber;
@@ -2423,6 +2756,33 @@ interface LogEntryData {
2423
2756
  }
2424
2757
  //#endregion
2425
2758
  //#region src/types.d.ts
2759
+ /**
2760
+ * Primary playable/download URL for a completed job, or `undefined`.
2761
+ *
2762
+ * Returns `output.file.url` — the single download for a file job or the playlist
2763
+ * URL for a stream. A pure set (multiple files, no headline) or a data-only job
2764
+ * has no single primary URL: inspect `job.output.files` / `job.output.data`.
2765
+ */
2766
+ declare function outputUrl(job: JobResponse): string | undefined;
2767
+ /**
2768
+ * Typed accessor for a completed job's structured `data`, or `null`.
2769
+ *
2770
+ * `output.data` is job-type-specific (probe result, detections, transcript) and
2771
+ * is `unknown` at the contract level — its shape is documented per job type, not
2772
+ * by the API schema. This helper applies the caller-supplied type `T` so you can
2773
+ * read `data` without sprinkling assertions at each call site. `T` is your claim
2774
+ * about the shape for the job type you submitted; validate it yourself (e.g. with
2775
+ * Zod) if the input is untrusted.
2776
+ *
2777
+ * Returns `null` for non-complete jobs and for jobs with no structured data
2778
+ * (pure file transforms).
2779
+ *
2780
+ * @example
2781
+ * type Metadata = { format: string; durationMs: number };
2782
+ * const meta = jobData<Metadata>(await client.jobs.wait(id));
2783
+ * if (meta) console.log(meta.durationMs);
2784
+ */
2785
+ declare function jobData<T>(job: JobResponse): T | null;
2426
2786
  /**
2427
2787
  * Per-job execution timing breakdown. Returned by `client.jobs.getTimings(id)`.
2428
2788
  *
@@ -2887,4 +3247,4 @@ type Asset = {
2887
3247
  updatedAt: number;
2888
3248
  };
2889
3249
  //#endregion
2890
- export { ApiError, type ApiKey, type Asset, type BatchResult, type BillingInvoice, type BillingState, type ClientConfig, type CreateJobParams, type CreateWebhookParams, type FfmpegParams, type JobResponse as Job, type JobCreatedResponse, type JobListPage, type JobStep, type JobSubscribeOptions, type JobSubscription, type JobTimings, type JobType, type ListDeliveriesParams, type ListJobsParams, type LogEntryData, type OrgCurrentResponse, type OrgEvent, type Organization, type PaginationMeta, type PaymentMethod, type RealtimeConnectOptions, type RealtimeConnection, type RendobarClient, type Transaction, type TransactionListParams, type UpdateWebhookParams, type UploadResult, type UsageParams, type UsageSummary, type WaitOptions, type WebhookDelivery, type WebhookEndpoint, createClient, isApiError };
3250
+ export { ApiError, type ApiKey, type Asset, type BatchResult, type BillingInvoice, type BillingState, type ClientConfig, type Cost, type CreateJobParams, type CreateWebhookParams, type FfmpegParams, type FileType, type JobResponse as Job, type JobCreatedResponse, type JobError, type JobListPage, type JobStep, type JobSubscribeOptions, type JobSubscription, type JobTimings, type JobType, type ListDeliveriesParams, type ListJobsParams, type LogEntryData, type OrgCurrentResponse, type OrgEvent, type Organization, type Output, type OutputFile, type PaginationMeta, type PaymentMethod, type RealtimeConnectOptions, type RealtimeConnection, type RendobarClient, type Transaction, type TransactionListParams, type UpdateWebhookParams, type UploadResult, type UsageParams, type UsageSummary, type WaitOptions, type WebhookDelivery, type WebhookEndpoint, createClient, isApiError, jobData, outputUrl };
package/dist/index.d.mts CHANGED
@@ -2109,28 +2109,156 @@ declare const jobStepSchema: ZodObject<{
2109
2109
  meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2110
2110
  error: ZodOptional<ZodString>;
2111
2111
  }, $strip>;
2112
- declare const jobResponseSchema: ZodObject<{
2112
+ /**
2113
+ * File type, an OPEN enum (tolerant-reader contract). Derived from the file
2114
+ * extension. Clients MUST tolerate unknown future values and fall back to
2115
+ * treating the file as opaque ("other"). Adding a value here is non-breaking.
2116
+ */
2117
+ declare const fileTypeSchema: ZodEnum<{
2118
+ video: "video";
2119
+ image: "image";
2120
+ audio: "audio";
2121
+ captions: "captions";
2122
+ playlist: "playlist";
2123
+ data: "data";
2124
+ other: "other";
2125
+ }>;
2126
+ /**
2127
+ * A single produced file. `url` is a ready-to-fetch, time-limited URL (signed
2128
+ * download URL for single-file jobs, token-in-path serving URL for served
2129
+ * multi-file jobs). `path` is the file's path within the job output (basename
2130
+ * for single-file jobs, prefix-relative path for served jobs).
2131
+ */
2132
+ declare const fileSchema: ZodObject<{
2133
+ url: ZodString;
2134
+ path: ZodString;
2135
+ type: ZodEnum<{
2136
+ video: "video";
2137
+ image: "image";
2138
+ audio: "audio";
2139
+ captions: "captions";
2140
+ playlist: "playlist";
2141
+ data: "data";
2142
+ other: "other";
2143
+ }>;
2144
+ size: ZodNumber;
2145
+ meta: ZodOptional<ZodObject<{
2146
+ format: ZodOptional<ZodString>;
2147
+ width: ZodOptional<ZodNumber>;
2148
+ height: ZodOptional<ZodNumber>;
2149
+ durationMs: ZodOptional<ZodNumber>;
2150
+ }, $strip>>;
2151
+ }, $strip>;
2152
+ declare const jobOutputSchema: ZodObject<{
2153
+ data: ZodUnknown;
2154
+ file: ZodNullable<ZodObject<{
2155
+ url: ZodString;
2156
+ path: ZodString;
2157
+ type: ZodEnum<{
2158
+ video: "video";
2159
+ image: "image";
2160
+ audio: "audio";
2161
+ captions: "captions";
2162
+ playlist: "playlist";
2163
+ data: "data";
2164
+ other: "other";
2165
+ }>;
2166
+ size: ZodNumber;
2167
+ meta: ZodOptional<ZodObject<{
2168
+ format: ZodOptional<ZodString>;
2169
+ width: ZodOptional<ZodNumber>;
2170
+ height: ZodOptional<ZodNumber>;
2171
+ durationMs: ZodOptional<ZodNumber>;
2172
+ }, $strip>>;
2173
+ }, $strip>>;
2174
+ files: ZodArray<ZodObject<{
2175
+ url: ZodString;
2176
+ path: ZodString;
2177
+ type: ZodEnum<{
2178
+ video: "video";
2179
+ image: "image";
2180
+ audio: "audio";
2181
+ captions: "captions";
2182
+ playlist: "playlist";
2183
+ data: "data";
2184
+ other: "other";
2185
+ }>;
2186
+ size: ZodNumber;
2187
+ meta: ZodOptional<ZodObject<{
2188
+ format: ZodOptional<ZodString>;
2189
+ width: ZodOptional<ZodNumber>;
2190
+ height: ZodOptional<ZodNumber>;
2191
+ durationMs: ZodOptional<ZodNumber>;
2192
+ }, $strip>>;
2193
+ }, $strip>>;
2194
+ expiresAt: ZodNullable<ZodNumber>;
2195
+ }, $strip>;
2196
+ declare const jobErrorSchema: ZodObject<{
2197
+ code: ZodString;
2198
+ message: ZodString;
2199
+ detail: ZodNullable<ZodString>;
2200
+ retryable: ZodBoolean;
2201
+ }, $strip>;
2202
+ declare const jobCostSchema: ZodObject<{
2203
+ amount: ZodNumber;
2204
+ currency: ZodLiteral<"USD">;
2205
+ formatted: ZodString;
2206
+ }, $strip>;
2207
+ declare const jobResponseSchema: ZodDiscriminatedUnion<[ZodObject<{
2113
2208
  id: ZodString;
2114
2209
  orgId: ZodString;
2115
2210
  type: ZodString;
2116
- status: ZodString;
2117
2211
  inputs: ZodRecord<ZodString, ZodUnknown>;
2118
2212
  params: ZodRecord<ZodString, ZodUnknown>;
2119
- outputUrl: ZodNullable<ZodString>;
2120
- posterUrl: ZodNullable<ZodString>;
2121
- outputMeta: ZodNullable<ZodRecord<ZodString, ZodUnknown>>;
2122
- errorCode: ZodNullable<ZodString>;
2123
- errorMessage: ZodNullable<ZodString>;
2124
- price: ZodNullable<ZodNumber>;
2125
- priceFormatted: ZodNullable<ZodString>;
2126
2213
  cost: ZodNullable<ZodObject<{
2127
- total: ZodNumber;
2128
- currency: ZodString;
2214
+ amount: ZodNumber;
2215
+ currency: ZodLiteral<"USD">;
2216
+ formatted: ZodString;
2129
2217
  }, $strip>>;
2218
+ outputCategory: ZodEnum<{
2219
+ video: "video";
2220
+ image: "image";
2221
+ audio: "audio";
2222
+ captions: "captions";
2223
+ json: "json";
2224
+ raw: "raw";
2225
+ }>;
2226
+ steps: ZodArray<ZodObject<{
2227
+ id: ZodString;
2228
+ name: ZodString;
2229
+ status: ZodString;
2230
+ startedAt: ZodOptional<ZodNumber>;
2231
+ completedAt: ZodOptional<ZodNumber>;
2232
+ durationMs: ZodOptional<ZodNumber>;
2233
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2234
+ error: ZodOptional<ZodString>;
2235
+ }, $strip>>;
2236
+ logsAvailable: ZodBoolean;
2130
2237
  createdAt: ZodNumber;
2131
2238
  dispatchedAt: ZodNullable<ZodNumber>;
2132
2239
  startedAt: ZodNullable<ZodNumber>;
2133
2240
  completedAt: ZodNullable<ZodNumber>;
2241
+ settledAt: ZodNullable<ZodNumber>;
2242
+ status: ZodLiteral<"waiting">;
2243
+ }, $strip>, ZodObject<{
2244
+ id: ZodString;
2245
+ orgId: ZodString;
2246
+ type: ZodString;
2247
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2248
+ params: ZodRecord<ZodString, ZodUnknown>;
2249
+ cost: ZodNullable<ZodObject<{
2250
+ amount: ZodNumber;
2251
+ currency: ZodLiteral<"USD">;
2252
+ formatted: ZodString;
2253
+ }, $strip>>;
2254
+ outputCategory: ZodEnum<{
2255
+ video: "video";
2256
+ image: "image";
2257
+ audio: "audio";
2258
+ captions: "captions";
2259
+ json: "json";
2260
+ raw: "raw";
2261
+ }>;
2134
2262
  steps: ZodArray<ZodObject<{
2135
2263
  id: ZodString;
2136
2264
  name: ZodString;
@@ -2141,11 +2269,212 @@ declare const jobResponseSchema: ZodObject<{
2141
2269
  meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2142
2270
  error: ZodOptional<ZodString>;
2143
2271
  }, $strip>>;
2144
- outputCategory: ZodString;
2145
- mediaType: ZodNullable<ZodString>;
2146
2272
  logsAvailable: ZodBoolean;
2273
+ createdAt: ZodNumber;
2274
+ dispatchedAt: ZodNullable<ZodNumber>;
2275
+ startedAt: ZodNullable<ZodNumber>;
2276
+ completedAt: ZodNullable<ZodNumber>;
2147
2277
  settledAt: ZodNullable<ZodNumber>;
2148
- }, $strip>;
2278
+ status: ZodLiteral<"dispatched">;
2279
+ progress: ZodOptional<ZodNumber>;
2280
+ eta: ZodOptional<ZodNullable<ZodNumber>>;
2281
+ }, $strip>, ZodObject<{
2282
+ id: ZodString;
2283
+ orgId: ZodString;
2284
+ type: ZodString;
2285
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2286
+ params: ZodRecord<ZodString, ZodUnknown>;
2287
+ cost: ZodNullable<ZodObject<{
2288
+ amount: ZodNumber;
2289
+ currency: ZodLiteral<"USD">;
2290
+ formatted: ZodString;
2291
+ }, $strip>>;
2292
+ outputCategory: ZodEnum<{
2293
+ video: "video";
2294
+ image: "image";
2295
+ audio: "audio";
2296
+ captions: "captions";
2297
+ json: "json";
2298
+ raw: "raw";
2299
+ }>;
2300
+ steps: ZodArray<ZodObject<{
2301
+ id: ZodString;
2302
+ name: ZodString;
2303
+ status: ZodString;
2304
+ startedAt: ZodOptional<ZodNumber>;
2305
+ completedAt: ZodOptional<ZodNumber>;
2306
+ durationMs: ZodOptional<ZodNumber>;
2307
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2308
+ error: ZodOptional<ZodString>;
2309
+ }, $strip>>;
2310
+ logsAvailable: ZodBoolean;
2311
+ createdAt: ZodNumber;
2312
+ dispatchedAt: ZodNullable<ZodNumber>;
2313
+ startedAt: ZodNullable<ZodNumber>;
2314
+ completedAt: ZodNullable<ZodNumber>;
2315
+ settledAt: ZodNullable<ZodNumber>;
2316
+ status: ZodLiteral<"running">;
2317
+ progress: ZodNumber;
2318
+ eta: ZodNullable<ZodNumber>;
2319
+ }, $strip>, ZodObject<{
2320
+ id: ZodString;
2321
+ orgId: ZodString;
2322
+ type: ZodString;
2323
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2324
+ params: ZodRecord<ZodString, ZodUnknown>;
2325
+ cost: ZodNullable<ZodObject<{
2326
+ amount: ZodNumber;
2327
+ currency: ZodLiteral<"USD">;
2328
+ formatted: ZodString;
2329
+ }, $strip>>;
2330
+ outputCategory: ZodEnum<{
2331
+ video: "video";
2332
+ image: "image";
2333
+ audio: "audio";
2334
+ captions: "captions";
2335
+ json: "json";
2336
+ raw: "raw";
2337
+ }>;
2338
+ steps: ZodArray<ZodObject<{
2339
+ id: ZodString;
2340
+ name: ZodString;
2341
+ status: ZodString;
2342
+ startedAt: ZodOptional<ZodNumber>;
2343
+ completedAt: ZodOptional<ZodNumber>;
2344
+ durationMs: ZodOptional<ZodNumber>;
2345
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2346
+ error: ZodOptional<ZodString>;
2347
+ }, $strip>>;
2348
+ logsAvailable: ZodBoolean;
2349
+ createdAt: ZodNumber;
2350
+ dispatchedAt: ZodNullable<ZodNumber>;
2351
+ startedAt: ZodNullable<ZodNumber>;
2352
+ completedAt: ZodNullable<ZodNumber>;
2353
+ settledAt: ZodNullable<ZodNumber>;
2354
+ status: ZodLiteral<"complete">;
2355
+ output: ZodObject<{
2356
+ data: ZodUnknown;
2357
+ file: ZodNullable<ZodObject<{
2358
+ url: ZodString;
2359
+ path: ZodString;
2360
+ type: ZodEnum<{
2361
+ video: "video";
2362
+ image: "image";
2363
+ audio: "audio";
2364
+ captions: "captions";
2365
+ playlist: "playlist";
2366
+ data: "data";
2367
+ other: "other";
2368
+ }>;
2369
+ size: ZodNumber;
2370
+ meta: ZodOptional<ZodObject<{
2371
+ format: ZodOptional<ZodString>;
2372
+ width: ZodOptional<ZodNumber>;
2373
+ height: ZodOptional<ZodNumber>;
2374
+ durationMs: ZodOptional<ZodNumber>;
2375
+ }, $strip>>;
2376
+ }, $strip>>;
2377
+ files: ZodArray<ZodObject<{
2378
+ url: ZodString;
2379
+ path: ZodString;
2380
+ type: ZodEnum<{
2381
+ video: "video";
2382
+ image: "image";
2383
+ audio: "audio";
2384
+ captions: "captions";
2385
+ playlist: "playlist";
2386
+ data: "data";
2387
+ other: "other";
2388
+ }>;
2389
+ size: ZodNumber;
2390
+ meta: ZodOptional<ZodObject<{
2391
+ format: ZodOptional<ZodString>;
2392
+ width: ZodOptional<ZodNumber>;
2393
+ height: ZodOptional<ZodNumber>;
2394
+ durationMs: ZodOptional<ZodNumber>;
2395
+ }, $strip>>;
2396
+ }, $strip>>;
2397
+ expiresAt: ZodNullable<ZodNumber>;
2398
+ }, $strip>;
2399
+ }, $strip>, ZodObject<{
2400
+ id: ZodString;
2401
+ orgId: ZodString;
2402
+ type: ZodString;
2403
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2404
+ params: ZodRecord<ZodString, ZodUnknown>;
2405
+ cost: ZodNullable<ZodObject<{
2406
+ amount: ZodNumber;
2407
+ currency: ZodLiteral<"USD">;
2408
+ formatted: ZodString;
2409
+ }, $strip>>;
2410
+ outputCategory: ZodEnum<{
2411
+ video: "video";
2412
+ image: "image";
2413
+ audio: "audio";
2414
+ captions: "captions";
2415
+ json: "json";
2416
+ raw: "raw";
2417
+ }>;
2418
+ steps: ZodArray<ZodObject<{
2419
+ id: ZodString;
2420
+ name: ZodString;
2421
+ status: ZodString;
2422
+ startedAt: ZodOptional<ZodNumber>;
2423
+ completedAt: ZodOptional<ZodNumber>;
2424
+ durationMs: ZodOptional<ZodNumber>;
2425
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2426
+ error: ZodOptional<ZodString>;
2427
+ }, $strip>>;
2428
+ logsAvailable: ZodBoolean;
2429
+ createdAt: ZodNumber;
2430
+ dispatchedAt: ZodNullable<ZodNumber>;
2431
+ startedAt: ZodNullable<ZodNumber>;
2432
+ completedAt: ZodNullable<ZodNumber>;
2433
+ settledAt: ZodNullable<ZodNumber>;
2434
+ status: ZodLiteral<"failed">;
2435
+ error: ZodObject<{
2436
+ code: ZodString;
2437
+ message: ZodString;
2438
+ detail: ZodNullable<ZodString>;
2439
+ retryable: ZodBoolean;
2440
+ }, $strip>;
2441
+ }, $strip>, ZodObject<{
2442
+ id: ZodString;
2443
+ orgId: ZodString;
2444
+ type: ZodString;
2445
+ inputs: ZodRecord<ZodString, ZodUnknown>;
2446
+ params: ZodRecord<ZodString, ZodUnknown>;
2447
+ cost: ZodNullable<ZodObject<{
2448
+ amount: ZodNumber;
2449
+ currency: ZodLiteral<"USD">;
2450
+ formatted: ZodString;
2451
+ }, $strip>>;
2452
+ outputCategory: ZodEnum<{
2453
+ video: "video";
2454
+ image: "image";
2455
+ audio: "audio";
2456
+ captions: "captions";
2457
+ json: "json";
2458
+ raw: "raw";
2459
+ }>;
2460
+ steps: ZodArray<ZodObject<{
2461
+ id: ZodString;
2462
+ name: ZodString;
2463
+ status: ZodString;
2464
+ startedAt: ZodOptional<ZodNumber>;
2465
+ completedAt: ZodOptional<ZodNumber>;
2466
+ durationMs: ZodOptional<ZodNumber>;
2467
+ meta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2468
+ error: ZodOptional<ZodString>;
2469
+ }, $strip>>;
2470
+ logsAvailable: ZodBoolean;
2471
+ createdAt: ZodNumber;
2472
+ dispatchedAt: ZodNullable<ZodNumber>;
2473
+ startedAt: ZodNullable<ZodNumber>;
2474
+ completedAt: ZodNullable<ZodNumber>;
2475
+ settledAt: ZodNullable<ZodNumber>;
2476
+ status: ZodLiteral<"cancelled">;
2477
+ }, $strip>], "status">;
2149
2478
  declare const jobCreatedResponseSchema: ZodObject<{
2150
2479
  id: ZodString;
2151
2480
  status: ZodLiteral<"waiting">;
@@ -2297,6 +2626,11 @@ declare const paymentMethodSchema: ZodObject<{
2297
2626
  }, $strip>;
2298
2627
  type JobResponse = output<typeof jobResponseSchema>;
2299
2628
  type JobStep = output<typeof jobStepSchema>;
2629
+ type Output = output<typeof jobOutputSchema>;
2630
+ type OutputFile = output<typeof fileSchema>;
2631
+ type FileType = output<typeof fileTypeSchema>;
2632
+ type JobError = output<typeof jobErrorSchema>;
2633
+ type Cost = output<typeof jobCostSchema>;
2300
2634
  type JobCreatedResponse = output<typeof jobCreatedResponseSchema>;
2301
2635
  type JobType = output<typeof jobTypeSchema>;
2302
2636
  type BillingState = output<typeof billingStateSchema>;
@@ -2326,7 +2660,6 @@ declare const orgEventSchema: ZodDiscriminatedUnion<[ZodObject<{
2326
2660
  }, $strip>, ZodObject<{
2327
2661
  type: ZodLiteral<"job.result">;
2328
2662
  jobId: ZodString;
2329
- outputMeta: ZodOptional<ZodRecord<ZodString, ZodUnknown>>;
2330
2663
  }, $strip>, ZodObject<{
2331
2664
  type: ZodLiteral<"balance.updated">;
2332
2665
  balance: ZodNumber;
@@ -2423,6 +2756,33 @@ interface LogEntryData {
2423
2756
  }
2424
2757
  //#endregion
2425
2758
  //#region src/types.d.ts
2759
+ /**
2760
+ * Primary playable/download URL for a completed job, or `undefined`.
2761
+ *
2762
+ * Returns `output.file.url` — the single download for a file job or the playlist
2763
+ * URL for a stream. A pure set (multiple files, no headline) or a data-only job
2764
+ * has no single primary URL: inspect `job.output.files` / `job.output.data`.
2765
+ */
2766
+ declare function outputUrl(job: JobResponse): string | undefined;
2767
+ /**
2768
+ * Typed accessor for a completed job's structured `data`, or `null`.
2769
+ *
2770
+ * `output.data` is job-type-specific (probe result, detections, transcript) and
2771
+ * is `unknown` at the contract level — its shape is documented per job type, not
2772
+ * by the API schema. This helper applies the caller-supplied type `T` so you can
2773
+ * read `data` without sprinkling assertions at each call site. `T` is your claim
2774
+ * about the shape for the job type you submitted; validate it yourself (e.g. with
2775
+ * Zod) if the input is untrusted.
2776
+ *
2777
+ * Returns `null` for non-complete jobs and for jobs with no structured data
2778
+ * (pure file transforms).
2779
+ *
2780
+ * @example
2781
+ * type Metadata = { format: string; durationMs: number };
2782
+ * const meta = jobData<Metadata>(await client.jobs.wait(id));
2783
+ * if (meta) console.log(meta.durationMs);
2784
+ */
2785
+ declare function jobData<T>(job: JobResponse): T | null;
2426
2786
  /**
2427
2787
  * Per-job execution timing breakdown. Returned by `client.jobs.getTimings(id)`.
2428
2788
  *
@@ -2887,4 +3247,4 @@ type Asset = {
2887
3247
  updatedAt: number;
2888
3248
  };
2889
3249
  //#endregion
2890
- export { ApiError, type ApiKey, type Asset, type BatchResult, type BillingInvoice, type BillingState, type ClientConfig, type CreateJobParams, type CreateWebhookParams, type FfmpegParams, type JobResponse as Job, type JobCreatedResponse, type JobListPage, type JobStep, type JobSubscribeOptions, type JobSubscription, type JobTimings, type JobType, type ListDeliveriesParams, type ListJobsParams, type LogEntryData, type OrgCurrentResponse, type OrgEvent, type Organization, type PaginationMeta, type PaymentMethod, type RealtimeConnectOptions, type RealtimeConnection, type RendobarClient, type Transaction, type TransactionListParams, type UpdateWebhookParams, type UploadResult, type UsageParams, type UsageSummary, type WaitOptions, type WebhookDelivery, type WebhookEndpoint, createClient, isApiError };
3250
+ export { ApiError, type ApiKey, type Asset, type BatchResult, type BillingInvoice, type BillingState, type ClientConfig, type Cost, type CreateJobParams, type CreateWebhookParams, type FfmpegParams, type FileType, type JobResponse as Job, type JobCreatedResponse, type JobError, type JobListPage, type JobStep, type JobSubscribeOptions, type JobSubscription, type JobTimings, type JobType, type ListDeliveriesParams, type ListJobsParams, type LogEntryData, type OrgCurrentResponse, type OrgEvent, type Organization, type Output, type OutputFile, type PaginationMeta, type PaymentMethod, type RealtimeConnectOptions, type RealtimeConnection, type RendobarClient, type Transaction, type TransactionListParams, type UpdateWebhookParams, type UploadResult, type UsageParams, type UsageSummary, type WaitOptions, type WebhookDelivery, type WebhookEndpoint, createClient, isApiError, jobData, outputUrl };
package/dist/index.mjs CHANGED
@@ -645,4 +645,40 @@ function createClient(config = {}) {
645
645
  };
646
646
  }
647
647
  //#endregion
648
- export { ApiError, createClient, isApiError };
648
+ //#region src/types.ts
649
+ /**
650
+ * Primary playable/download URL for a completed job, or `undefined`.
651
+ *
652
+ * Returns `output.file.url` — the single download for a file job or the playlist
653
+ * URL for a stream. A pure set (multiple files, no headline) or a data-only job
654
+ * has no single primary URL: inspect `job.output.files` / `job.output.data`.
655
+ */
656
+ function outputUrl(job) {
657
+ if (job.status !== "complete") return void 0;
658
+ return job.output.file?.url;
659
+ }
660
+ /**
661
+ * Typed accessor for a completed job's structured `data`, or `null`.
662
+ *
663
+ * `output.data` is job-type-specific (probe result, detections, transcript) and
664
+ * is `unknown` at the contract level — its shape is documented per job type, not
665
+ * by the API schema. This helper applies the caller-supplied type `T` so you can
666
+ * read `data` without sprinkling assertions at each call site. `T` is your claim
667
+ * about the shape for the job type you submitted; validate it yourself (e.g. with
668
+ * Zod) if the input is untrusted.
669
+ *
670
+ * Returns `null` for non-complete jobs and for jobs with no structured data
671
+ * (pure file transforms).
672
+ *
673
+ * @example
674
+ * type Metadata = { format: string; durationMs: number };
675
+ * const meta = jobData<Metadata>(await client.jobs.wait(id));
676
+ * if (meta) console.log(meta.durationMs);
677
+ */
678
+ function jobData(job) {
679
+ if (job.status !== "complete") return null;
680
+ if (job.output.data == null) return null;
681
+ return job.output.data;
682
+ }
683
+ //#endregion
684
+ export { ApiError, createClient, isApiError, jobData, outputUrl };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rendobar/sdk",
3
- "version": "2.1.2",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "description": "TypeScript client for the Rendobar media processing API",
6
6
  "main": "./dist/index.cjs",