@trillboards/api-client 0.2.0 → 0.4.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.mjs CHANGED
@@ -70,10 +70,51 @@ var TrillboardsError = class _TrillboardsError extends Error {
70
70
  };
71
71
 
72
72
  // src/version.ts
73
- var VERSION = "0.1.3";
73
+ var VERSION = "0.4.1";
74
74
 
75
75
  // src/http.ts
76
76
  var PUBLIC_PATHS = ["/v1/errors", "/v1/changelog", "/api/discover", "/v1/health"];
77
+ function isRetryable(err) {
78
+ if (err instanceof TrillboardsError) {
79
+ return err.statusCode === 429 || err.statusCode >= 500;
80
+ }
81
+ if (err instanceof TypeError) return true;
82
+ return false;
83
+ }
84
+ function computeBackoffMs(attempt, baseMs, err) {
85
+ if (err instanceof TrillboardsError && err.retryAfter != null && err.retryAfter > 0) {
86
+ return err.retryAfter * 1e3;
87
+ }
88
+ const exponential = baseMs * Math.pow(2, attempt);
89
+ return Math.floor(Math.random() * exponential);
90
+ }
91
+ function sleep(ms) {
92
+ return new Promise((resolve) => setTimeout(resolve, ms));
93
+ }
94
+ async function retryWithBackoff(operation, opts = {}) {
95
+ const retries = opts.retries ?? 6;
96
+ const baseMs = opts.baseMs ?? 1e3;
97
+ let lastError;
98
+ for (let attempt = 0; attempt <= retries; attempt += 1) {
99
+ try {
100
+ return await operation();
101
+ } catch (err) {
102
+ lastError = err;
103
+ if (!isRetryable(err) || attempt === retries) {
104
+ throw err;
105
+ }
106
+ if (opts.onAttemptError) {
107
+ try {
108
+ opts.onAttemptError(attempt + 1, err);
109
+ } catch {
110
+ }
111
+ }
112
+ const delayMs = computeBackoffMs(attempt, baseMs, err);
113
+ await sleep(delayMs);
114
+ }
115
+ }
116
+ throw lastError;
117
+ }
77
118
  var HttpClient = class {
78
119
  constructor(config) {
79
120
  this.config = config;
@@ -124,17 +165,28 @@ var HttpClient = class {
124
165
  get(path, opts) {
125
166
  return this.request("GET", path, { params: opts?.params });
126
167
  }
127
- post(path, body) {
128
- return this.request("POST", path, { body });
168
+ /**
169
+ * POST / PUT / PATCH / DELETE auto-retry on 429 + 5xx + network TypeError
170
+ * via `retryWithBackoff()`. Callers can opt into observability by passing
171
+ * `retry.onAttemptError` to receive a callback per transient failure.
172
+ *
173
+ * The retry behavior is identical across all four methods because all of
174
+ * them are state-changing operations subject to the same transient-failure
175
+ * classes (rate limit, upstream-down, network-flap). The wire idempotency
176
+ * of POST vs DELETE is enforced server-side via Idempotency-Key headers,
177
+ * which the caller can attach via `opts.headers`.
178
+ */
179
+ post(path, body, opts) {
180
+ return retryWithBackoff(() => this.request("POST", path, { body, headers: opts?.headers }), opts?.retry);
129
181
  }
130
- put(path, body) {
131
- return this.request("PUT", path, { body });
182
+ put(path, body, opts) {
183
+ return retryWithBackoff(() => this.request("PUT", path, { body, headers: opts?.headers }), opts?.retry);
132
184
  }
133
- patch(path, body) {
134
- return this.request("PATCH", path, { body });
185
+ patch(path, body, opts) {
186
+ return retryWithBackoff(() => this.request("PATCH", path, { body, headers: opts?.headers }), opts?.retry);
135
187
  }
136
- delete(path) {
137
- return this.request("DELETE", path);
188
+ delete(path, opts) {
189
+ return retryWithBackoff(() => this.request("DELETE", path, { headers: opts?.headers }), opts?.retry);
138
190
  }
139
191
  buildUrl(path, params) {
140
192
  const base = `${this.config.baseUrl}${path}`;
@@ -168,6 +220,25 @@ var ScreensClient = class {
168
220
  async create(body) {
169
221
  return this.http.post("/v1/partner/device", body);
170
222
  }
223
+ /** Get the resolved display settings for one screen. */
224
+ async getDisplaySettings(screenId) {
225
+ return this.http.get(`/v1/partner/screens/${screenId}/display-settings`);
226
+ }
227
+ /** Partially update display settings; omitted content-fit keys are preserved. */
228
+ async patchDisplaySettings(screenId, settings) {
229
+ return this.http.patch(`/v1/partner/screens/${screenId}/display-settings`, settings);
230
+ }
231
+ /** Update display settings through the PUT endpoint. */
232
+ async updateDisplaySettings(screenId, settings) {
233
+ return this.http.put(`/v1/partner/screens/${screenId}/display-settings`, settings);
234
+ }
235
+ /** Apply a partial display-settings update to up to 100 screens. */
236
+ async batchUpdateDisplaySettings(screenIds, settings) {
237
+ return this.http.post("/v1/partner/screens/batch/display-settings", {
238
+ screen_ids: screenIds,
239
+ settings
240
+ });
241
+ }
171
242
  /** Delete a screen/device. */
172
243
  async delete(screenId) {
173
244
  return this.http.delete(`/v1/partner/device/${screenId}`);
@@ -191,13 +262,28 @@ var DevicesClient = class {
191
262
  async create(body) {
192
263
  return this.http.post("/v1/partner/device", body);
193
264
  }
265
+ /** Register or re-register up to 100 devices with optional fleet defaults. */
266
+ async createBatch(body) {
267
+ return this.http.post("/v1/partner/devices/batch", body);
268
+ }
194
269
  /** Delete a device. */
195
270
  async delete(deviceId) {
196
271
  return this.http.delete(`/v1/partner/device/${deviceId}`);
197
272
  }
198
- /** Send heartbeat for a device. */
199
- async heartbeat(deviceId, body) {
200
- return this.http.post(`/v1/partner/device/${deviceId}/heartbeat`, body ?? {});
273
+ /**
274
+ * Send heartbeat for a device.
275
+ *
276
+ * Auto-retries on 429 + 5xx + network TypeError via the shared
277
+ * retryWithBackoff() helper (see http.ts). Pass `opts.retry.onAttemptError`
278
+ * to observe transient failures (e.g. emit an `upload_error` event from
279
+ * the CTV SDK without coupling the retry loop to its event emitter).
280
+ */
281
+ async heartbeat(deviceId, body, opts) {
282
+ return this.http.post(
283
+ `/v1/partner/device/${deviceId}/heartbeat`,
284
+ body ?? {},
285
+ { retry: opts?.retry }
286
+ );
201
287
  }
202
288
  };
203
289
 
@@ -353,6 +439,34 @@ var BillingClient = class {
353
439
  }
354
440
  };
355
441
 
442
+ // src/resources/routes.ts
443
+ var BASE = "/v1/partner/sensing/routes";
444
+ var RoutesClient = class {
445
+ constructor(http) {
446
+ this.http = http;
447
+ }
448
+ /** Create a Route. Every screen in `screenMongoIds` must be one you own. */
449
+ async create(body) {
450
+ return this.http.post(BASE, body);
451
+ }
452
+ /** List your Routes. Pass `includeDisabled: false` to return only enabled Routes. */
453
+ async list(params) {
454
+ return this.http.get(BASE, { params });
455
+ }
456
+ /** Get one Route by id. */
457
+ async get(routeId) {
458
+ return this.http.get(`${BASE}/${routeId}`);
459
+ }
460
+ /** Update a Route (partial, non-clobbering — only the fields you send change). */
461
+ async update(routeId, body) {
462
+ return this.http.patch(`${BASE}/${routeId}`, body);
463
+ }
464
+ /** Soft-delete a Route. */
465
+ async delete(routeId) {
466
+ return this.http.delete(`${BASE}/${routeId}`);
467
+ }
468
+ };
469
+
356
470
  // src/client.ts
357
471
  var DEFAULT_BASE_URL = "https://api.trillboards.com";
358
472
  var TrillboardsClient = class {
@@ -379,33 +493,148 @@ var TrillboardsClient = class {
379
493
  this.data = new DataClient(this._http);
380
494
  this.errors = new ErrorsClient(this._http);
381
495
  this.billing = new BillingClient(this._http);
496
+ this.routes = new RoutesClient(this._http);
382
497
  }
383
498
  };
384
- function constructEvent(payload, signature, secret) {
499
+ var DEFAULT_TOLERANCE_SECONDS = 300;
500
+ function parseSignatureHeader(rawSig) {
501
+ const versions = /* @__PURE__ */ new Map();
502
+ let timestamp;
503
+ let legacy;
504
+ const trimmed = rawSig.trim();
505
+ if (trimmed.startsWith("sha256=")) {
506
+ legacy = trimmed.slice("sha256=".length);
507
+ return { timestamp, versions, legacy };
508
+ }
509
+ for (const part of trimmed.split(",")) {
510
+ const eq = part.indexOf("=");
511
+ if (eq < 0) continue;
512
+ const key = part.slice(0, eq).trim();
513
+ const value = part.slice(eq + 1).trim();
514
+ if (!key || !value) continue;
515
+ if (key === "t") {
516
+ const ts = Number(value);
517
+ if (Number.isFinite(ts)) timestamp = ts;
518
+ } else if (/^v\d+$/.test(key)) {
519
+ versions.set(key, value);
520
+ }
521
+ }
522
+ return { timestamp, versions, legacy };
523
+ }
524
+ function getHeader(headers, name) {
525
+ const lc = name.toLowerCase();
526
+ for (const key of Object.keys(headers)) {
527
+ if (key.toLowerCase() === lc) {
528
+ const v = headers[key];
529
+ if (Array.isArray(v)) return v[0];
530
+ return v;
531
+ }
532
+ }
533
+ return void 0;
534
+ }
535
+ function constantTimeEqual(a, b) {
536
+ const aBuf = Buffer.from(a, "utf8");
537
+ const bBuf = Buffer.from(b, "utf8");
538
+ if (aBuf.length !== bBuf.length) return false;
539
+ return timingSafeEqual(aBuf, bBuf);
540
+ }
541
+ function authError(message) {
542
+ return new TrillboardsError({
543
+ type: "authentication_error",
544
+ code: "webhook_signature_invalid",
545
+ message,
546
+ statusCode: 401
547
+ });
548
+ }
549
+ function constructEvent(payload, headers, secret, opts = {}) {
550
+ let signatureHeader;
551
+ let timestampHeader;
552
+ if (typeof headers === "string") {
553
+ signatureHeader = headers;
554
+ } else if (headers && typeof headers === "object") {
555
+ signatureHeader = getHeader(headers, "X-Trillboards-Signature");
556
+ timestampHeader = getHeader(headers, "X-Trillboards-Timestamp");
557
+ }
558
+ if (!signatureHeader) {
559
+ throw authError("Missing X-Trillboards-Signature header.");
560
+ }
385
561
  const payloadStr = typeof payload === "string" ? payload : payload.toString("utf8");
386
- const expectedSignature = createHmac("sha256", secret).update(payloadStr).digest("hex");
387
- const sigBuffer = Buffer.from(signature, "utf8");
388
- const expectedBuffer = Buffer.from(expectedSignature, "utf8");
389
- if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {
390
- throw new TrillboardsError({
391
- type: "authentication_error",
392
- code: "webhook_signature_invalid",
393
- message: "Webhook signature verification failed. The payload may have been tampered with.",
394
- statusCode: 401
395
- });
562
+ const parsed = parseSignatureHeader(signatureHeader);
563
+ let ts = parsed.timestamp;
564
+ if (ts === void 0 && timestampHeader) {
565
+ const fromHeader = Number(timestampHeader);
566
+ if (Number.isFinite(fromHeader)) ts = fromHeader;
567
+ }
568
+ if (ts === void 0 || !Number.isFinite(ts)) {
569
+ throw authError(
570
+ "Webhook signature missing timestamp. Provide either `t=<unix_seconds>` inside X-Trillboards-Signature OR a separate X-Trillboards-Timestamp header."
571
+ );
572
+ }
573
+ const tolerance = opts.tolerance ?? DEFAULT_TOLERANCE_SECONDS;
574
+ const now = opts.nowSec ?? Math.floor(Date.now() / 1e3);
575
+ if (Math.abs(now - ts) > tolerance) {
576
+ throw authError(
577
+ `Webhook timestamp ${ts} outside tolerance window of ${tolerance}s (now ${now}). Possible replay attack.`
578
+ );
579
+ }
580
+ const v1Expected = createHmac("sha256", secret).update(`${ts}.${payloadStr}`).digest("hex");
581
+ const v0Expected = createHmac("sha256", secret).update(payloadStr).digest("hex");
582
+ const v1Provided = parsed.versions.get("v1");
583
+ const v0Provided = parsed.versions.get("v0");
584
+ if (v1Provided) {
585
+ if (constantTimeEqual(v1Provided, v1Expected)) {
586
+ return JSON.parse(payloadStr);
587
+ }
588
+ throw authError(
589
+ "Webhook v1 signature verification failed. The payload may have been tampered with, or your webhook secret may be incorrect."
590
+ );
591
+ }
592
+ if (v0Provided && constantTimeEqual(v0Provided, v0Expected)) {
593
+ return JSON.parse(payloadStr);
594
+ }
595
+ if (parsed.legacy) {
596
+ if (constantTimeEqual(parsed.legacy, v1Expected)) {
597
+ return JSON.parse(payloadStr);
598
+ }
599
+ if (constantTimeEqual(parsed.legacy, v0Expected)) {
600
+ return JSON.parse(payloadStr);
601
+ }
602
+ }
603
+ throw authError(
604
+ "Webhook signature verification failed. The payload may have been tampered with, or your webhook secret may be incorrect."
605
+ );
606
+ }
607
+ var legacyWarned = false;
608
+ function constructEventLegacy(payload, signature, secret) {
609
+ if (!legacyWarned) {
610
+ console.warn(
611
+ "[@trillboards/api-client] constructEventLegacy is deprecated and unsafe (no replay protection). Migrate to Webhooks.constructEvent(payload, req.headers, secret). See https://api.trillboards.com/docs/integrations/webhook-signature-verification.md"
612
+ );
613
+ legacyWarned = true;
614
+ }
615
+ const payloadStr = typeof payload === "string" ? payload : payload.toString("utf8");
616
+ const expected = createHmac("sha256", secret).update(payloadStr).digest("hex");
617
+ if (!constantTimeEqual(signature, expected)) {
618
+ throw authError(
619
+ "Legacy webhook signature mismatch. If your server has been upgraded to the compound-header emitter, switch to Webhooks.constructEvent instead."
620
+ );
396
621
  }
397
622
  return JSON.parse(payloadStr);
398
623
  }
399
- var Webhooks = { constructEvent };
624
+ var Webhooks = {
625
+ constructEvent,
626
+ constructEventLegacy,
627
+ parseSignatureHeader
628
+ };
400
629
 
401
630
  // src/generated/index.ts
402
631
  var generatedTypes = {
403
- schemaCount: 67,
404
- operationCount: 132,
405
- schemas: ["Ad", "AdSettings", "AudienceAnalyticsResponse", "AudienceExportResponse", "AudienceMetricsResponse", "AudienceSegment", "BatchResult", "BleScanResultData", "ChangelogEntry", "ChangelogResponse", "ContentPreferencesInput", "ContentPreferencesResponse", "ContentPreset", "DashboardResponse", "DemographicsResponse", "Device", "DeviceCapabilityPayload", "DeviceSummary", "DisplaySettingsInput", "DisplaySettingsResponse", "EarningsBreakdownResponse", "EarningsResponse", "Error", "HeaderBiddingSettings", "HttpProbeResult", "MdnsNetworkDevice", "Pagination", "Partner", "PartnerAdDeliveryProfile", "PartnerDefaultStream", "PartnerDefaultStreamCreate", "PartnerDefaultStreamUpdate", "PartnerDeviceHeartbeatBody", "PartnerHeartbeatCommand", "PartnerHeartbeatData", "PartnerHeartbeatMeasurementMetadata", "PartnerHeartbeatQueryData", "PartnerHeartbeatQueryResponse", "PartnerHeartbeatRequest", "PartnerHeartbeatResponse", "PartnerHeartbeatTelemetry", "PartnerLBarContent", "PartnerLBarDisplayPreferences", "PartnerLBarSettings", "PartnerSafeHeartbeatTelemetry", "PartnerSelfPromoAd", "PartnerSelfPromoCreate", "PartnerSelfPromoPlacement", "PartnerStats", "PayoutResponse", "PlaygroundResult", "PlaygroundValidationError", "ProgrammaticSettingsInput", "ProgrammaticSettingsResponse", "RequestMetadataResponse", "RolePermissions", "SDKConfig", "ScreenAnalyticsResponse", "SsdpDeviceInfo", "TeamInviteResponse", "TeamMember", "Transaction", "Webhook", "WebhookDelivery", "WebhookEvent", "WifiEnvironmentSnapshot", "WifiScanResult"],
406
- operations: ["listPartnerSelfPromoAds", "createPartnerSelfPromoAd", "listPartnerSelfPromoPlacements", "schedulePartnerSelfPromo", "createPartnerSelfPromoUpload", "disablePartnerSelfPromo", "registerAgent", "getAnalytics", "rotateApiKey", "getAudienceAnalytics", "exportAudienceData", "getAudienceHeatmap", "getLiveAudience", "getLookalikeScreens", "predictScreenAudience", "listAudienceSegments", "createAudienceSegment", "deleteAudienceSegment", "getAudienceSegment", "updateAudienceSegment", "matchAudienceSegment", "estimateSegmentReach", "generateSegmentVastTag", "getAudienceStats", "purchaseCredits", "createCreditCheckout", "setupBilling", "getUsageSummary", "getConnectDashboard", "getConnectEarningsChart", "getConnectScreenHealth", "listContentPresets", "getContentPreset", "getDashboard", "registerDevice", "deleteDevice", "getDevice", "updateDevice", "getAdsForDevice", "ackDeviceCommand", "getDeviceHeartbeat", "heartbeat", "recordProgrammaticEvent", "listDevices", "registerDevicesBatch", "batchUpdateDeviceOrientation", "getEarnings", "getEarningsBreakdown", "requestPayout", "getTransactions", "getActiveSSEConnections", "subscribeToEvents", "getFleetAnalytics", "pushFleetCommand", "getFleetOverview", "updateFleetSettings", "recordImpressionGet", "recordImpressionPost", "recordImpressionsBatch", "getPartnerInfo", "listIntentCategories", "getIntentCategory", "getIntentPricing", "getNetworkConfig", "patchNetworkConfig", "updateNetworkConfig", "recordAdComplete", "getPricing", "quickStart", "registerPartner", "generateSandboxEvent", "resetSandbox", "createSandboxScreen", "getSandboxStatus", "batchUpdateContentPreferences", "batchUpdateDisplaySettings", "batchUpdateProgrammaticSettings", "resolvePartnerScreen", "getScreenAnalytics", "applyContentPreset", "getAudienceMetrics", "getContentPreferences", "patchContentPreferences", "updateContentPreferences", "listPartnerDefaultStreams", "createPartnerDefaultStream", "createPartnerDefaultStreamImages", "reorderPartnerDefaultStreams", "createPartnerDefaultStreamUpload", "deletePartnerDefaultStream", "updatePartnerDefaultStream", "getScreenDemographics", "getDisplaySettings", "patchDisplaySettings", "updateDisplaySettings", "getPartnerLBarSettings", "updatePartnerLBarSettings", "updatePartnerLBarLiveUpdates", "getProgrammaticSettings", "patchProgrammaticSettings", "updateProgrammaticSettings", "createStripeConnectAccount", "getStripeLoginLink", "getStripeOnboardingLink", "requestStripePayout", "getStripePayoutHistory", "getStripeAccountStatus", "handleStripeWebhook", "listTeamMembers", "acceptInvitation", "inviteTeamMember", "getInvitationByToken", "resendInvitation", "removeTeamMember", "changeTeamMemberRole", "getTrackingPublicKey", "recordTrackingBatch", "upgradeToPartner", "getUsageSummary__get__usage", "getUsageDashboard", "getRateLimitStatus", "queryChangelog", "playgroundDryRun", "getRequestMetadata", "getVastConfig", "getVenueIntelligence", "listWebhooks", "createWebhook", "deleteWebhook", "updateWebhook", "getWebhookDeliveries", "testWebhook"]
632
+ schemaCount: 99,
633
+ operationCount: 210,
634
+ schemas: ["Ad", "AdSettings", "AudienceAnalyticsResponse", "AudienceAttentionPrediction", "AudienceExportResponse", "AudienceLoyaltyFeaturesRow", "AudienceMetricsResponse", "AudienceSegment", "AudienceSocialAttention", "BatchResult", "BleScanResultData", "ChangelogEntry", "ChangelogResponse", "ContentFitSettings", "ContentPreferencesInput", "ContentPreferencesResponse", "ContentPreset", "CreatePartnerSensingRouteRequest", "CreativeClassification", "DashboardResponse", "DataExportSummaryResponse", "DemographicsResponse", "Device", "DeviceCapabilityPayload", "DeviceSummary", "DisplaySettingsInput", "DisplaySettingsResponse", "EarningsBreakdownResponse", "EarningsResponse", "Error", "FleetCommand", "FleetCommandEvent", "HeaderBiddingSettings", "HttpProbeResult", "MdnsNetworkDevice", "Pagination", "Partner", "PartnerAdDeliveryProfile", "PartnerDefaultStream", "PartnerDefaultStreamCreate", "PartnerDefaultStreamUpdate", "PartnerDeviceHeartbeatBody", "PartnerHeartbeatCommand", "PartnerHeartbeatData", "PartnerHeartbeatMeasurementMetadata", "PartnerHeartbeatQueryData", "PartnerHeartbeatQueryResponse", "PartnerHeartbeatRequest", "PartnerHeartbeatResponse", "PartnerHeartbeatTelemetry", "PartnerLBarContent", "PartnerLBarDisplayPreferences", "PartnerLBarSettings", "PartnerMonetizationRequirements", "PartnerNetworkConfig", "PartnerNetworkConfigUpdate", "PartnerPlay", "PartnerRegistrationDisplaySettings", "PartnerRequirement", "PartnerSafeHeartbeatTelemetry", "PartnerSelfPromoAd", "PartnerSelfPromoCreate", "PartnerSelfPromoPlacement", "PartnerStats", "PayoutResponse", "PlaygroundResult", "PlaygroundValidationError", "ProgrammaticSettingsInput", "ProgrammaticSettingsResponse", "RequestMetadataResponse", "ResolvedContentPolicy", "ResolvedSensingConfig", "RolePermissions", "SDKConfig", "ScreenAnalyticsResponse", "ScreenGroup", "ScreenGroupContentPolicy", "ScreenGroupContentPolicyInput", "ScreenGroupEvent", "ScreenGroupSensingConfig", "ScreenGroupSensingConfigInput", "SensingPerformanceMode", "SensingRoute", "SensingRouteAction", "SensingRouteCondition", "SensingSettingsResponse", "SensingThresholdCrossedEvent", "SsdpDeviceInfo", "TeamInviteResponse", "TeamMember", "Transaction", "UpdatePartnerSensingRouteRequest", "VastWaterfall", "VastWaterfallSource", "Webhook", "WebhookDelivery", "WebhookEvent", "WifiEnvironmentSnapshot", "WifiScanResult"],
635
+ operations: ["listPartnerSelfPromoAds", "createPartnerSelfPromoAd", "listPartnerSelfPromoPlacements", "schedulePartnerSelfPromo", "createPartnerSelfPromoUpload", "disableSelfPromoAd", "registerAgent", "getAnalytics", "getAudienceContinuity", "getAudienceProfile", "getBleSummary", "getContentPerformance", "searchCreativeCatalog", "getCreativeScenes", "getCrossScreenFlow", "getPartnerAnalyticsDashboard", "getDeviceSuiteSignature", "exportPartnerAnalytics", "exportPartnerAdsByDay", "getFleetHourly", "getHaloFunnel", "getLoyaltyClock", "getNetworkSummary", "getNetworkTrend", "getProximitySummary", "getRevenueAttentionCorrelation", "getSceneFeed", "getSceneIntelligence", "rotateApiKey", "getAudienceAnalytics", "exportAudienceData", "getAudienceHeatmap", "getLiveAudience", "getLookalikeScreens", "predictScreenAudience", "getResolvedHouseholdReach", "listAudienceSegments", "createAudienceSegment", "deleteAudienceSegment", "getAudienceSegment", "updateAudienceSegment", "matchAudienceSegment", "estimateSegmentReach", "generateSegmentVastTag", "getAudienceStats", "cancelBillingSubscription", "purchaseCredits", "createCreditCheckout", "listBillingPlans", "setupBilling", "createBillingSubscription", "getBillingSubscription", "getBillingUsage", "getUsageSummary", "stripeWebhookCallback", "getConnectDashboard", "getConnectEarningsChart", "getConnectScreenHealth", "listContentPresets", "getContentPreset", "submitPartnerCreative", "getPartnerCreative", "getDashboard", "exportProximityGraphEdges", "getDataExportSummary", "exportDataset", "getGeohashAudiencePanel", "getOutcomeAttribution", "registerDevice", "deleteDevice", "getDevice", "updateDevice", "getAdsForDevice", "ackDeviceCommand", "getDeviceHeartbeat", "heartbeat", "recordProgrammaticEvent", "listDevices", "registerDeviceV2", "registerDevicesBatch", "batchUpdateDeviceOrientation", "reconcileDevices", "partnerDocsBrowser", "getEarnings", "getEarningsBreakdown", "requestPayout", "getTransactions", "getActiveSSEConnections", "subscribeToEvents", "getFleetCommand", "getFleetAnalytics", "pushFleetCommand", "getFleetOverview", "updateFleetSettings", "recordImpressionGet", "recordImpressionPost", "recordImpressionsBatch", "getPartnerInfo", "listIntentCategories", "getIntentCategory", "getIntentPricing", "getMeasurementMethodology", "getNetworkConfig", "patchNetworkConfig", "updateNetworkConfig", "getNetworkTrends", "partnerPing", "partnerPingAuth", "recordPartnerPlay", "recordPartnerPlaysBatch", "getPricing", "recordProgrammaticEventLegacyAlias", "quickStart", "registerPartner", "generateSandboxEvent", "resetSandbox", "createSandboxScreen", "getSandboxStatus", "listScreenGroups", "createScreenGroup", "deleteScreenGroup", "getScreenGroup", "updateScreenGroup", "getScreenGroupAnalytics", "createScreenGroupCommand", "getScreenGroupContentPolicy", "updateScreenGroupContentPolicy", "removeScreenGroupMembers", "listScreenGroupMembers", "addScreenGroupMembers", "getScreenGroupSensingConfig", "updateScreenGroupSensingConfig", "getScreenAudienceSegments", "batchUpdateContentPreferences", "batchUpdateDisplaySettings", "batchUpdateProgrammaticSettings", "resolvePartnerScreen", "getScreenAnalytics", "getPartnerScreenAtmosphere", "getPartnerScreenIntelligence", "getPartnerScreenTasteProfile", "getPartnerScreenTraffic", "getPartnerScreenVAS", "applyContentPreset", "getAudienceMetrics", "getContentPreferences", "patchContentPreferences", "updateContentPreferences", "listPartnerDefaultStreams", "createPartnerDefaultStream", "createPartnerDefaultStreamImages", "reorderPartnerDefaultStreams", "createPartnerDefaultStreamUpload", "deletePartnerDefaultStream", "updatePartnerDefaultStream", "getScreenDemographics", "getDisplaySettings", "patchDisplaySettings", "updateDisplaySettings", "getPartnerLBarSettings", "updatePartnerLBarSettings", "updatePartnerLBarLiveUpdates", "getProgrammaticSettings", "patchProgrammaticSettings", "updateProgrammaticSettings", "getResolvedContentPolicy", "getResolvedSensingConfig", "getScreenSensingChips", "interpretScreenSensingIntent", "deployScreenSensingProfile", "getScreenSensingSettings", "updateScreenSensingSettings", "listPartnerSensingRoutes", "createPartnerSensingRoute", "deletePartnerSensingRoute", "getPartnerSensingRoute", "updatePartnerSensingRoute", "createStripeConnectAccount", "getStripeLoginLink", "getStripeOnboardingLink", "requestStripePayout", "getStripePayoutHistory", "getStripeAccountStatus", "handleStripeWebhook", "listTeamMembers", "acceptInvitation", "inviteTeamMember", "getInvitationByToken", "resendInvitation", "removeTeamMember", "changeTeamMemberRole", "getTrackingPublicKey", "recordTrackingBatch", "getUsageSummary__get__usage", "getUsageDashboard", "getRateLimitStatus", "queryChangelog", "playgroundDryRun", "getRequestMetadata", "getVastConfig", "getVenuesNearby", "getVenueAtmosphere", "getVenueTraffic", "getVenueIntelligence", "listWebhooks", "createWebhook", "deleteWebhook", "updateWebhook", "getWebhookDeliveries", "testWebhook"]
407
636
  };
408
637
 
409
- export { AnalyticsClient, AudienceClient, BillingClient, DataClient, DevicesClient, EarningsClient, ErrorsClient, FleetClient, ImpressionsClient, ScreensClient, TrillboardsClient, TrillboardsError, VERSION, Webhooks, WebhooksClient, constructEvent, generatedTypes };
638
+ export { AnalyticsClient, AudienceClient, BillingClient, DataClient, DevicesClient, EarningsClient, ErrorsClient, FleetClient, ImpressionsClient, RoutesClient, ScreensClient, TrillboardsClient, TrillboardsError, VERSION, Webhooks, WebhooksClient, constructEvent, constructEventLegacy, generatedTypes, parseSignatureHeader, retryWithBackoff };
410
639
  //# sourceMappingURL=index.mjs.map
411
640
  //# sourceMappingURL=index.mjs.map