@trillboards/api-client 0.1.3 → 0.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/LICENSE +21 -0
- package/dist/index.d.mts +385 -2
- package/dist/index.d.ts +385 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/http.ts","../src/resources/screens.ts","../src/resources/devices.ts","../src/resources/impressions.ts","../src/resources/analytics.ts","../src/resources/earnings.ts","../src/resources/errors.ts","../src/resources/webhooks.ts","../src/resources/fleet.ts","../src/resources/audience.ts","../src/resources/data.ts","../src/resources/billing.ts","../src/client.ts","../src/webhooks.ts","../src/generated/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TrillboardsError — client-side error class that mirrors the server-side\n * canonical error envelope from utils/apiErrors.ts.\n *\n * Error shape from the API:\n * { error: { type, code, message, param, doc_url, request_id, details?, help? } }\n */\n\nimport type { ApiErrorType, ErrorDetail, ErrorResponseBody } from './types';\n\nexport interface TrillboardsErrorOptions {\n type: ApiErrorType;\n code: string;\n message: string;\n statusCode: number;\n param?: string | null;\n requestId?: string;\n docsUrl?: string;\n details?: ErrorDetail[];\n help?: Record<string, unknown>;\n retryAfterSeconds?: number | null;\n}\n\nexport class TrillboardsError extends Error {\n readonly type: ApiErrorType;\n readonly code: string;\n readonly param: string | null;\n readonly requestId: string;\n readonly docsUrl: string;\n readonly statusCode: number;\n readonly details: ErrorDetail[];\n readonly help: Record<string, unknown> | null;\n private readonly _retryAfterSeconds: number | null;\n\n constructor(opts: TrillboardsErrorOptions) {\n super(opts.message);\n this.name = 'TrillboardsError';\n this.type = opts.type;\n this.code = opts.code;\n this.statusCode = opts.statusCode;\n this.param = opts.param ?? null;\n this.requestId = opts.requestId ?? '';\n this.docsUrl = opts.docsUrl ?? `https://api.trillboards.com/docs/errors#${opts.code}`;\n this.details = opts.details ?? [];\n this.help = opts.help ?? null;\n this._retryAfterSeconds = opts.retryAfterSeconds ?? null;\n }\n\n /**\n * Construct a TrillboardsError from an API error response body and fetch Response.\n *\n * The API wraps errors in { error: { ... } }. We unwrap and map to class fields.\n */\n static fromResponse(body: ErrorResponseBody | Record<string, unknown>, response: { status: number; headers: { get(name: string): string | null } }): TrillboardsError {\n const errorObj = (body as ErrorResponseBody)?.error ?? body;\n const errData = errorObj as Record<string, unknown>;\n\n const retryAfterHeader = response.headers.get('retry-after');\n let retryAfterSeconds: number | null = null;\n if (retryAfterHeader) {\n const parsed = parseInt(retryAfterHeader, 10);\n if (!isNaN(parsed)) {\n retryAfterSeconds = parsed;\n }\n }\n\n return new TrillboardsError({\n type: (errData.type as ApiErrorType) ?? 'api_error',\n code: (errData.code as string) ?? 'unknown_error',\n message: (errData.message as string) ?? 'An unknown error occurred.',\n statusCode: response.status,\n param: (errData.param as string | null) ?? null,\n requestId: (errData.request_id as string) ?? '',\n docsUrl: (errData.doc_url as string) ?? undefined,\n details: (errData.details as ErrorDetail[]) ?? [],\n help: (errData.help as Record<string, unknown>) ?? null,\n retryAfterSeconds,\n });\n }\n\n /** True if this is a 429 rate limit response. */\n get isRateLimited(): boolean {\n return this.statusCode === 429;\n }\n\n /**\n * Number of seconds to wait before retrying, from the Retry-After header.\n * Returns null if no Retry-After header was present.\n */\n get retryAfter(): number | null {\n return this._retryAfterSeconds;\n }\n\n /** True if this is an authentication error (401). */\n get isAuthError(): boolean {\n return this.statusCode === 401;\n }\n\n /** True if this is a permission/forbidden error (403). */\n get isForbidden(): boolean {\n return this.statusCode === 403;\n }\n\n /** True if this is a server-side error (5xx). */\n get isServerError(): boolean {\n return this.statusCode >= 500;\n }\n}\n","/**\n * SDK version constant. Sent in User-Agent and X-Trillboards-Client headers.\n * Keep in sync with package.json version.\n */\nexport const VERSION = '0.1.3';\n","/**\n * Internal HTTP client for the Trillboards API.\n *\n * Uses native fetch (Node 18+). Zero runtime dependencies.\n * Sends standard headers: Authorization, Content-Type, User-Agent, X-Trillboards-Client.\n */\n\nimport { TrillboardsError } from './error';\nimport type { ErrorResponseBody, RequestOptions } from './types';\nimport { VERSION } from './version';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n version?: string;\n}\n\n/**\n * Endpoint prefixes that are publicly accessible and do not require (or want)\n * an Authorization header. Sending a malformed key on these paths causes the\n * server to reject the request even though no auth is needed.\n */\nconst PUBLIC_PATHS = ['/v1/errors', '/v1/changelog', '/api/discover', '/v1/health'];\n\nexport class HttpClient {\n private readonly config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const url = this.buildUrl(path, options?.params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Trillboards-Client': `typescript-sdk/${VERSION}`,\n 'User-Agent': `trillboards-typescript/${VERSION}`,\n ...(options?.headers ?? {}),\n };\n\n // Only send auth on non-public endpoints\n const isPublic = PUBLIC_PATHS.some(prefix => path.startsWith(prefix));\n if (!isPublic && this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n if (this.config.version) {\n headers['Trillboards-Version'] = this.config.version;\n }\n\n const fetchOptions: globalThis.RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined && options.body !== null) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n throw new TrillboardsError({\n type: 'api_error',\n code: 'invalid_response',\n message: `Invalid JSON response from API (HTTP ${response.status}).`,\n statusCode: response.status,\n });\n }\n\n if (!response.ok) {\n throw TrillboardsError.fromResponse(json as ErrorResponseBody, response);\n }\n\n return json as T;\n }\n\n get<T>(path: string, opts?: { params?: Record<string, unknown> }): Promise<T> {\n return this.request<T>('GET', path, { params: opts?.params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = `${this.config.baseUrl}${path}`;\n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n return `${base}?${searchParams.toString()}`;\n }\n}\n","/**\n * ScreensClient — Partner API screen management.\n *\n * Base path: /v1/partner (screens are mapped from devices + screen pairs)\n */\n\nimport type { HttpClient } from '../http';\nimport type { ListResponse, Screen } from '../types';\n\nexport class ScreensClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all screens owned by this partner. */\n async list(params?: { limit?: number; offset?: number }): Promise<ListResponse<Screen>> {\n return this.http.get<ListResponse<Screen>>('/v1/partner/devices', { params });\n }\n\n /** Get a single screen by ID. */\n async get(screenId: string): Promise<{ success: boolean; data: Screen }> {\n return this.http.get<{ success: boolean; data: Screen }>(`/v1/partner/device/${screenId}`);\n }\n\n /** Register a new device/screen. */\n async create(body: {\n device_name: string;\n device_type?: string;\n venue_type?: string;\n country?: string;\n city?: string;\n timezone?: string;\n resolution?: string;\n }): Promise<{ success: boolean; data: Screen }> {\n return this.http.post<{ success: boolean; data: Screen }>('/v1/partner/device', body);\n }\n\n /** Delete a screen/device. */\n async delete(screenId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/device/${screenId}`);\n }\n}\n","/**\n * DevicesClient — device registration and heartbeat.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { Device, ListResponse } from '../types';\n\nexport class DevicesClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all devices for this partner. */\n async list(params?: { limit?: number; offset?: number }): Promise<ListResponse<Device>> {\n return this.http.get<ListResponse<Device>>('/v1/partner/devices', { params });\n }\n\n /** Get a single device by ID. */\n async get(deviceId: string): Promise<{ success: boolean; data: Device }> {\n return this.http.get<{ success: boolean; data: Device }>(`/v1/partner/device/${deviceId}`);\n }\n\n /** Register a new device. */\n async create(body: {\n device_name: string;\n device_type?: string;\n platform?: string;\n }): Promise<{ success: boolean; data: Device }> {\n return this.http.post<{ success: boolean; data: Device }>('/v1/partner/device', body);\n }\n\n /** Delete a device. */\n async delete(deviceId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/device/${deviceId}`);\n }\n\n /** Send heartbeat for a device. */\n async heartbeat(deviceId: string, body?: Record<string, unknown>): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/v1/partner/device/${deviceId}/heartbeat`, body ?? {});\n }\n}\n","/**\n * ImpressionsClient — impression tracking.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { Impression } from '../types';\n\nexport class ImpressionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Record a single impression. */\n async create(body: {\n screen_id: string;\n device_id: string;\n ad_type?: string;\n duration_seconds?: number;\n metadata?: Record<string, unknown>;\n }): Promise<{ success: boolean; data: Impression }> {\n return this.http.post<{ success: boolean; data: Impression }>('/v1/partner/impression', body);\n }\n\n /** Record a batch of impressions (offline sync). */\n async createBatch(body: {\n impressions: Array<{\n screen_id: string;\n device_id: string;\n ad_type?: string;\n duration_seconds?: number;\n played_at?: string;\n metadata?: Record<string, unknown>;\n }>;\n }): Promise<{ success: boolean; count: number }> {\n return this.http.post<{ success: boolean; count: number }>('/v1/partner/impressions/batch', body);\n }\n}\n","/**\n * AnalyticsClient — partner analytics and reporting.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { AnalyticsData } from '../types';\n\nexport class AnalyticsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get partner analytics summary. */\n async get(params?: {\n period?: 'day' | 'week' | 'month';\n start_date?: string;\n end_date?: string;\n screen_id?: string;\n }): Promise<{ success: boolean; data: AnalyticsData }> {\n return this.http.get<{ success: boolean; data: AnalyticsData }>('/v1/partner/analytics', { params });\n }\n}\n","/**\n * EarningsClient — earnings, payouts, and transaction history.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { EarningsData } from '../types';\n\nexport class EarningsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get earnings summary for the authenticated partner. */\n async get(params?: {\n period?: 'day' | 'week' | 'month';\n start_date?: string;\n end_date?: string;\n }): Promise<{ success: boolean; data: EarningsData }> {\n return this.http.get<{ success: boolean; data: EarningsData }>('/v1/partner/connect/earnings', { params });\n }\n}\n","/**\n * ErrorsClient — access the public error catalog and query partner errors.\n *\n * list() hits /v1/errors (public, no auth required).\n * get() hits /v1/partner/usage (authenticated, partner-scoped).\n */\n\nimport type { HttpClient } from '../http';\nimport type { ErrorEntry, ListResponse } from '../types';\n\nexport class ErrorsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all known API error codes from the public error catalog.\n * This endpoint does NOT require authentication.\n */\n async list(params?: {\n limit?: number;\n offset?: number;\n code?: string;\n type?: string;\n }): Promise<ListResponse<ErrorEntry>> {\n return this.http.get<ListResponse<ErrorEntry>>('/v1/errors', { params });\n }\n\n /** Get a single error by request_id (requires authentication). */\n async get(requestId: string): Promise<{ success: boolean; data: ErrorEntry }> {\n return this.http.get<{ success: boolean; data: ErrorEntry }>(`/v1/partner/usage`, {\n params: { request_id: requestId },\n });\n }\n}\n","/**\n * WebhooksClient — webhook subscription management.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { ListResponse, Webhook } from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all webhook subscriptions. */\n async list(): Promise<ListResponse<Webhook>> {\n return this.http.get<ListResponse<Webhook>>('/v1/partner/webhooks');\n }\n\n /** Create a new webhook subscription. */\n async create(body: {\n url: string;\n events: string[];\n }): Promise<{ success: boolean; data: Webhook }> {\n return this.http.post<{ success: boolean; data: Webhook }>('/v1/partner/webhooks', body);\n }\n\n /** Update a webhook subscription. */\n async update(webhookId: string, body: {\n url?: string;\n events?: string[];\n status?: string;\n }): Promise<{ success: boolean; data: Webhook }> {\n return this.http.patch<{ success: boolean; data: Webhook }>(`/v1/partner/webhooks/${webhookId}`, body);\n }\n\n /** Delete a webhook subscription. */\n async delete(webhookId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/webhooks/${webhookId}`);\n }\n\n /** Send a test event to a webhook. */\n async test(webhookId: string): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/v1/partner/webhooks/${webhookId}/test`);\n }\n}\n","/**\n * FleetClient — fleet-wide device management.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { FleetCommand, ListResponse } from '../types';\n\nexport class FleetClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Push a command to a set of screens. */\n async pushCommand(body: {\n command: string;\n target_screens?: string[];\n venue_type?: string;\n country?: string;\n params?: Record<string, unknown>;\n }): Promise<{ success: boolean; data: FleetCommand }> {\n return this.http.post<{ success: boolean; data: FleetCommand }>('/v1/partner/fleet/command', body);\n }\n\n /** List recent fleet commands. */\n async listCommands(params?: { limit?: number; offset?: number }): Promise<ListResponse<FleetCommand>> {\n return this.http.get<ListResponse<FleetCommand>>('/v1/partner/fleet/commands', { params });\n }\n}\n","/**\n * AudienceClient — audience intelligence API.\n *\n * Base path: /v1/partner/audience\n */\n\nimport type { HttpClient } from '../http';\nimport type { AudienceData } from '../types';\n\nexport class AudienceClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get live audience data for a screen. */\n async getLive(screenId: string): Promise<{ success: boolean; data: AudienceData }> {\n return this.http.get<{ success: boolean; data: AudienceData }>(`/v1/partner/audience/live/${screenId}`);\n }\n\n /** Get audience heatmap across screens. */\n async getHeatmap(params?: {\n start_date?: string;\n end_date?: string;\n screen_ids?: string[];\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/audience/heatmap', { params });\n }\n\n /** Get aggregate audience statistics. */\n async getStats(params?: {\n period?: 'day' | 'week' | 'month';\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/audience/stats', { params });\n }\n}\n","/**\n * DataClient — data export and venue intelligence.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\n\nexport class DataClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get venue intelligence data for a screen. */\n async getVenueIntelligence(screenId: string): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>(`/v1/partner/venue/${screenId}`);\n }\n\n /** Get API usage summary. */\n async getUsage(params?: {\n period?: 'day' | 'week' | 'month';\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/usage', { params });\n }\n}\n","/**\n * BillingClient — usage-based billing and credits.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { BillingInfo } from '../types';\n\nexport class BillingClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get current billing info (plan, credits, usage). */\n async get(): Promise<{ success: boolean; data: BillingInfo }> {\n return this.http.get<{ success: boolean; data: BillingInfo }>('/v1/partner/billing');\n }\n\n /** Get Stripe Connect account status. */\n async getStripeStatus(): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/stripe/status');\n }\n\n /** Request a payout transfer. */\n async requestPayout(body?: {\n amount?: number;\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.post<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/stripe/payout', body ?? {});\n }\n}\n","/**\n * TrillboardsClient — main entry point for the Trillboards Partner API SDK.\n *\n * Usage:\n * import { TrillboardsClient } from '@trillboards/api-client';\n *\n * const client = new TrillboardsClient({ apiKey: 'trb_partner_xxxxx' });\n * const screens = await client.screens.list();\n */\n\nimport { HttpClient } from './http';\nimport type { ClientOptions } from './types';\nimport {\n ScreensClient,\n DevicesClient,\n ImpressionsClient,\n AnalyticsClient,\n EarningsClient,\n ErrorsClient,\n WebhooksClient,\n FleetClient,\n AudienceClient,\n DataClient,\n BillingClient,\n} from './resources';\n\nconst DEFAULT_BASE_URL = 'https://api.trillboards.com';\n\nexport class TrillboardsClient {\n readonly screens: ScreensClient;\n readonly devices: DevicesClient;\n readonly impressions: ImpressionsClient;\n readonly analytics: AnalyticsClient;\n readonly webhooks: WebhooksClient;\n readonly earnings: EarningsClient;\n readonly fleet: FleetClient;\n readonly audience: AudienceClient;\n readonly data: DataClient;\n readonly errors: ErrorsClient;\n readonly billing: BillingClient;\n\n /** The underlying HTTP client (exposed for advanced use cases). */\n readonly _http: HttpClient;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'TrillboardsClient requires an apiKey. Get one at https://trillboards.com/developers'\n );\n }\n\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n\n this._http = new HttpClient({\n apiKey: options.apiKey,\n baseUrl,\n version: options.version,\n });\n\n this.screens = new ScreensClient(this._http);\n this.devices = new DevicesClient(this._http);\n this.impressions = new ImpressionsClient(this._http);\n this.analytics = new AnalyticsClient(this._http);\n this.webhooks = new WebhooksClient(this._http);\n this.earnings = new EarningsClient(this._http);\n this.fleet = new FleetClient(this._http);\n this.audience = new AudienceClient(this._http);\n this.data = new DataClient(this._http);\n this.errors = new ErrorsClient(this._http);\n this.billing = new BillingClient(this._http);\n }\n}\n","/**\n * Webhook signature verification for Trillboards Partner API webhooks.\n *\n * Uses HMAC-SHA256 with timing-safe comparison to prevent signature\n * forgery and timing attacks.\n */\n\nimport { createHmac, timingSafeEqual } from 'crypto';\nimport { TrillboardsError } from './error';\nimport type { WebhookEvent } from './types';\n\n/**\n * Verify a webhook payload signature and parse the event.\n *\n * @param payload - Raw request body as string or Buffer.\n * @param signature - The signature from the `X-Trillboards-Signature` header.\n * @param secret - The webhook secret from your webhook subscription.\n * @returns The parsed WebhookEvent if signature is valid.\n * @throws TrillboardsError if the signature does not match.\n *\n * @example\n * ```typescript\n * import { Webhooks } from '@trillboards/api-client';\n *\n * app.post('/webhooks', (req, res) => {\n * const event = Webhooks.constructEvent(\n * req.body,\n * req.headers['x-trillboards-signature'],\n * process.env.WEBHOOK_SECRET\n * );\n * console.log('Received event:', event.type);\n * res.sendStatus(200);\n * });\n * ```\n */\nexport function constructEvent(\n payload: string | Buffer,\n signature: string,\n secret: string,\n): WebhookEvent {\n const payloadStr = typeof payload === 'string' ? payload : payload.toString('utf8');\n\n const expectedSignature = createHmac('sha256', secret)\n .update(payloadStr)\n .digest('hex');\n\n const sigBuffer = Buffer.from(signature, 'utf8');\n const expectedBuffer = Buffer.from(expectedSignature, 'utf8');\n\n if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {\n throw new TrillboardsError({\n type: 'authentication_error',\n code: 'webhook_signature_invalid',\n message: 'Webhook signature verification failed. The payload may have been tampered with.',\n statusCode: 401,\n });\n }\n\n return JSON.parse(payloadStr) as WebhookEvent;\n}\n\nexport const Webhooks = { constructEvent };\n","// Auto-generated from OpenAPI specs — run npm run generate to populate\n//\n// This directory will contain auto-generated TypeScript types derived from\n// trillboard-api/docs/openapi/partner-api.yaml and the generated fragments\n// at trillboard-api/docs/openapi/generated/partner-api-generated.json.\n\nexport const generatedTypes = {} as const;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/error.ts","../src/version.ts","../src/http.ts","../src/resources/screens.ts","../src/resources/devices.ts","../src/resources/impressions.ts","../src/resources/analytics.ts","../src/resources/earnings.ts","../src/resources/errors.ts","../src/resources/webhooks.ts","../src/resources/fleet.ts","../src/resources/audience.ts","../src/resources/data.ts","../src/resources/billing.ts","../src/client.ts","../src/webhooks.ts","../src/generated/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * TrillboardsError — client-side error class that mirrors the server-side\n * canonical error envelope from utils/apiErrors.ts.\n *\n * Error shape from the API:\n * { error: { type, code, message, param, doc_url, request_id, details?, help? } }\n */\n\nimport type { ApiErrorType, ErrorDetail, ErrorResponseBody } from './types';\n\nexport interface TrillboardsErrorOptions {\n type: ApiErrorType;\n code: string;\n message: string;\n statusCode: number;\n param?: string | null;\n requestId?: string;\n docsUrl?: string;\n details?: ErrorDetail[];\n help?: Record<string, unknown>;\n retryAfterSeconds?: number | null;\n}\n\nexport class TrillboardsError extends Error {\n readonly type: ApiErrorType;\n readonly code: string;\n readonly param: string | null;\n readonly requestId: string;\n readonly docsUrl: string;\n readonly statusCode: number;\n readonly details: ErrorDetail[];\n readonly help: Record<string, unknown> | null;\n private readonly _retryAfterSeconds: number | null;\n\n constructor(opts: TrillboardsErrorOptions) {\n super(opts.message);\n this.name = 'TrillboardsError';\n this.type = opts.type;\n this.code = opts.code;\n this.statusCode = opts.statusCode;\n this.param = opts.param ?? null;\n this.requestId = opts.requestId ?? '';\n this.docsUrl = opts.docsUrl ?? `https://api.trillboards.com/docs/errors#${opts.code}`;\n this.details = opts.details ?? [];\n this.help = opts.help ?? null;\n this._retryAfterSeconds = opts.retryAfterSeconds ?? null;\n }\n\n /**\n * Construct a TrillboardsError from an API error response body and fetch Response.\n *\n * The API wraps errors in { error: { ... } }. We unwrap and map to class fields.\n */\n static fromResponse(body: ErrorResponseBody | Record<string, unknown>, response: { status: number; headers: { get(name: string): string | null } }): TrillboardsError {\n const errorObj = (body as ErrorResponseBody)?.error ?? body;\n const errData = errorObj as Record<string, unknown>;\n\n const retryAfterHeader = response.headers.get('retry-after');\n let retryAfterSeconds: number | null = null;\n if (retryAfterHeader) {\n const parsed = parseInt(retryAfterHeader, 10);\n if (!isNaN(parsed)) {\n retryAfterSeconds = parsed;\n }\n }\n\n return new TrillboardsError({\n type: (errData.type as ApiErrorType) ?? 'api_error',\n code: (errData.code as string) ?? 'unknown_error',\n message: (errData.message as string) ?? 'An unknown error occurred.',\n statusCode: response.status,\n param: (errData.param as string | null) ?? null,\n requestId: (errData.request_id as string) ?? '',\n docsUrl: (errData.doc_url as string) ?? undefined,\n details: (errData.details as ErrorDetail[]) ?? [],\n help: (errData.help as Record<string, unknown>) ?? null,\n retryAfterSeconds,\n });\n }\n\n /** True if this is a 429 rate limit response. */\n get isRateLimited(): boolean {\n return this.statusCode === 429;\n }\n\n /**\n * Number of seconds to wait before retrying, from the Retry-After header.\n * Returns null if no Retry-After header was present.\n */\n get retryAfter(): number | null {\n return this._retryAfterSeconds;\n }\n\n /** True if this is an authentication error (401). */\n get isAuthError(): boolean {\n return this.statusCode === 401;\n }\n\n /** True if this is a permission/forbidden error (403). */\n get isForbidden(): boolean {\n return this.statusCode === 403;\n }\n\n /** True if this is a server-side error (5xx). */\n get isServerError(): boolean {\n return this.statusCode >= 500;\n }\n}\n","/**\n * SDK version constant. Sent in User-Agent and X-Trillboards-Client headers.\n * Keep in sync with package.json version.\n */\nexport const VERSION = '0.1.3';\n","/**\n * Internal HTTP client for the Trillboards API.\n *\n * Uses native fetch (Node 18+). Zero runtime dependencies.\n * Sends standard headers: Authorization, Content-Type, User-Agent, X-Trillboards-Client.\n */\n\nimport { TrillboardsError } from './error';\nimport type { ErrorResponseBody, RequestOptions } from './types';\nimport { VERSION } from './version';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n version?: string;\n}\n\n/**\n * Endpoint prefixes that are publicly accessible and do not require (or want)\n * an Authorization header. Sending a malformed key on these paths causes the\n * server to reject the request even though no auth is needed.\n */\nconst PUBLIC_PATHS = ['/v1/errors', '/v1/changelog', '/api/discover', '/v1/health'];\n\nexport class HttpClient {\n private readonly config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const url = this.buildUrl(path, options?.params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Trillboards-Client': `typescript-sdk/${VERSION}`,\n 'User-Agent': `trillboards-typescript/${VERSION}`,\n ...(options?.headers ?? {}),\n };\n\n // Only send auth on non-public endpoints. Respect a caller-supplied\n // Authorization header (e.g. per-call OAuth token override) — merging\n // options?.headers first and then blindly writing config.apiKey here\n // meant a callsite passing its own Bearer got silently replaced.\n const callerSuppliedAuth = Object.keys(options?.headers ?? {})\n .some((h) => h.toLowerCase() === 'authorization');\n const isPublic = PUBLIC_PATHS.some(prefix => path.startsWith(prefix));\n if (!isPublic && this.config.apiKey && !callerSuppliedAuth) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n if (this.config.version) {\n headers['Trillboards-Version'] = this.config.version;\n }\n\n const fetchOptions: globalThis.RequestInit = {\n method,\n headers,\n };\n\n if (options?.body !== undefined && options.body !== null) {\n fetchOptions.body = JSON.stringify(options.body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n let json: unknown;\n try {\n json = await response.json();\n } catch {\n throw new TrillboardsError({\n type: 'api_error',\n code: 'invalid_response',\n message: `Invalid JSON response from API (HTTP ${response.status}).`,\n statusCode: response.status,\n });\n }\n\n if (!response.ok) {\n throw TrillboardsError.fromResponse(json as ErrorResponseBody, response);\n }\n\n return json as T;\n }\n\n get<T>(path: string, opts?: { params?: Record<string, unknown> }): Promise<T> {\n return this.request<T>('GET', path, { params: opts?.params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const base = `${this.config.baseUrl}${path}`;\n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n return `${base}?${searchParams.toString()}`;\n }\n}\n","/**\n * ScreensClient — Partner API screen management.\n *\n * Base path: /v1/partner (screens are mapped from devices + screen pairs)\n */\n\nimport type { HttpClient } from '../http';\nimport type { ListResponse, Screen } from '../types';\n\nexport class ScreensClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all screens owned by this partner. */\n async list(params?: { limit?: number; offset?: number }): Promise<ListResponse<Screen>> {\n return this.http.get<ListResponse<Screen>>('/v1/partner/devices', { params });\n }\n\n /** Get a single screen by ID. */\n async get(screenId: string): Promise<{ success: boolean; data: Screen }> {\n return this.http.get<{ success: boolean; data: Screen }>(`/v1/partner/device/${screenId}`);\n }\n\n /** Register a new device/screen. */\n async create(body: {\n device_name: string;\n device_type?: string;\n venue_type?: string;\n country?: string;\n city?: string;\n timezone?: string;\n resolution?: string;\n }): Promise<{ success: boolean; data: Screen }> {\n return this.http.post<{ success: boolean; data: Screen }>('/v1/partner/device', body);\n }\n\n /** Delete a screen/device. */\n async delete(screenId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/device/${screenId}`);\n }\n}\n","/**\n * DevicesClient — device registration and heartbeat.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { Device, ListResponse } from '../types';\n\nexport class DevicesClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all devices for this partner. */\n async list(params?: { limit?: number; offset?: number }): Promise<ListResponse<Device>> {\n return this.http.get<ListResponse<Device>>('/v1/partner/devices', { params });\n }\n\n /** Get a single device by ID. */\n async get(deviceId: string): Promise<{ success: boolean; data: Device }> {\n return this.http.get<{ success: boolean; data: Device }>(`/v1/partner/device/${deviceId}`);\n }\n\n /** Register a new device. */\n async create(body: {\n device_name: string;\n device_type?: string;\n platform?: string;\n }): Promise<{ success: boolean; data: Device }> {\n return this.http.post<{ success: boolean; data: Device }>('/v1/partner/device', body);\n }\n\n /** Delete a device. */\n async delete(deviceId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/device/${deviceId}`);\n }\n\n /** Send heartbeat for a device. */\n async heartbeat(deviceId: string, body?: Record<string, unknown>): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/v1/partner/device/${deviceId}/heartbeat`, body ?? {});\n }\n}\n","/**\n * ImpressionsClient — impression tracking.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { Impression } from '../types';\n\nexport class ImpressionsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Record a single impression. */\n async create(body: {\n screen_id: string;\n device_id: string;\n ad_type?: string;\n duration_seconds?: number;\n metadata?: Record<string, unknown>;\n }): Promise<{ success: boolean; data: Impression }> {\n return this.http.post<{ success: boolean; data: Impression }>('/v1/partner/impression', body);\n }\n\n /** Record a batch of impressions (offline sync). */\n async createBatch(body: {\n impressions: Array<{\n screen_id: string;\n device_id: string;\n ad_type?: string;\n duration_seconds?: number;\n played_at?: string;\n metadata?: Record<string, unknown>;\n }>;\n }): Promise<{ success: boolean; count: number }> {\n return this.http.post<{ success: boolean; count: number }>('/v1/partner/impressions/batch', body);\n }\n}\n","/**\n * AnalyticsClient — partner analytics and reporting.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { AnalyticsData } from '../types';\n\nexport class AnalyticsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get partner analytics summary. */\n async get(params?: {\n period?: 'day' | 'week' | 'month';\n start_date?: string;\n end_date?: string;\n screen_id?: string;\n }): Promise<{ success: boolean; data: AnalyticsData }> {\n return this.http.get<{ success: boolean; data: AnalyticsData }>('/v1/partner/analytics', { params });\n }\n}\n","/**\n * EarningsClient — earnings, payouts, and transaction history.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { EarningsData } from '../types';\n\nexport class EarningsClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get earnings summary for the authenticated partner. */\n async get(params?: {\n period?: 'day' | 'week' | 'month';\n start_date?: string;\n end_date?: string;\n }): Promise<{ success: boolean; data: EarningsData }> {\n return this.http.get<{ success: boolean; data: EarningsData }>('/v1/partner/connect/earnings', { params });\n }\n}\n","/**\n * ErrorsClient — access the public error catalog and query partner errors.\n *\n * list() hits /v1/errors (public, no auth required).\n * get() hits /v1/partner/usage (authenticated, partner-scoped).\n */\n\nimport type { HttpClient } from '../http';\nimport type { ErrorEntry, ListResponse } from '../types';\n\nexport class ErrorsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all known API error codes from the public error catalog.\n * This endpoint does NOT require authentication.\n */\n async list(params?: {\n limit?: number;\n offset?: number;\n code?: string;\n type?: string;\n }): Promise<ListResponse<ErrorEntry>> {\n return this.http.get<ListResponse<ErrorEntry>>('/v1/errors', { params });\n }\n\n /** Get a single error by request_id (requires authentication). */\n async get(requestId: string): Promise<{ success: boolean; data: ErrorEntry }> {\n return this.http.get<{ success: boolean; data: ErrorEntry }>(`/v1/partner/usage`, {\n params: { request_id: requestId },\n });\n }\n}\n","/**\n * WebhooksClient — webhook subscription management.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { ListResponse, Webhook } from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly http: HttpClient) {}\n\n /** List all webhook subscriptions. */\n async list(): Promise<ListResponse<Webhook>> {\n return this.http.get<ListResponse<Webhook>>('/v1/partner/webhooks');\n }\n\n /** Create a new webhook subscription. */\n async create(body: {\n url: string;\n events: string[];\n }): Promise<{ success: boolean; data: Webhook }> {\n return this.http.post<{ success: boolean; data: Webhook }>('/v1/partner/webhooks', body);\n }\n\n /** Update a webhook subscription. */\n async update(webhookId: string, body: {\n url?: string;\n events?: string[];\n status?: string;\n }): Promise<{ success: boolean; data: Webhook }> {\n return this.http.patch<{ success: boolean; data: Webhook }>(`/v1/partner/webhooks/${webhookId}`, body);\n }\n\n /** Delete a webhook subscription. */\n async delete(webhookId: string): Promise<{ success: boolean }> {\n return this.http.delete<{ success: boolean }>(`/v1/partner/webhooks/${webhookId}`);\n }\n\n /** Send a test event to a webhook. */\n async test(webhookId: string): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/v1/partner/webhooks/${webhookId}/test`);\n }\n}\n","/**\n * FleetClient — fleet-wide device management.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { FleetCommand, ListResponse } from '../types';\n\nexport class FleetClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Push a command to a set of screens. */\n async pushCommand(body: {\n command: string;\n target_screens?: string[];\n venue_type?: string;\n country?: string;\n params?: Record<string, unknown>;\n }): Promise<{ success: boolean; data: FleetCommand }> {\n return this.http.post<{ success: boolean; data: FleetCommand }>('/v1/partner/fleet/command', body);\n }\n\n /** List recent fleet commands. */\n async listCommands(params?: { limit?: number; offset?: number }): Promise<ListResponse<FleetCommand>> {\n return this.http.get<ListResponse<FleetCommand>>('/v1/partner/fleet/commands', { params });\n }\n}\n","/**\n * AudienceClient — audience intelligence API.\n *\n * Base path: /v1/partner/audience\n */\n\nimport type { HttpClient } from '../http';\nimport type { AudienceData } from '../types';\n\nexport class AudienceClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get live audience data for a screen. */\n async getLive(screenId: string): Promise<{ success: boolean; data: AudienceData }> {\n return this.http.get<{ success: boolean; data: AudienceData }>(`/v1/partner/audience/live/${screenId}`);\n }\n\n /** Get audience heatmap across screens. */\n async getHeatmap(params?: {\n start_date?: string;\n end_date?: string;\n screen_ids?: string[];\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/audience/heatmap', { params });\n }\n\n /** Get aggregate audience statistics. */\n async getStats(params?: {\n period?: 'day' | 'week' | 'month';\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/audience/stats', { params });\n }\n}\n","/**\n * DataClient — data export and venue intelligence.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\n\nexport class DataClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get venue intelligence data for a screen. */\n async getVenueIntelligence(screenId: string): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>(`/v1/partner/venue/${screenId}`);\n }\n\n /** Get API usage summary. */\n async getUsage(params?: {\n period?: 'day' | 'week' | 'month';\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/usage', { params });\n }\n}\n","/**\n * BillingClient — usage-based billing and credits.\n *\n * Base path: /v1/partner\n */\n\nimport type { HttpClient } from '../http';\nimport type { BillingInfo } from '../types';\n\nexport class BillingClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Get current billing info (plan, credits, usage). */\n async get(): Promise<{ success: boolean; data: BillingInfo }> {\n return this.http.get<{ success: boolean; data: BillingInfo }>('/v1/partner/billing');\n }\n\n /** Get Stripe Connect account status. */\n async getStripeStatus(): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.get<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/stripe/status');\n }\n\n /** Request a payout transfer. */\n async requestPayout(body?: {\n amount?: number;\n }): Promise<{ success: boolean; data: Record<string, unknown> }> {\n return this.http.post<{ success: boolean; data: Record<string, unknown> }>('/v1/partner/stripe/payout', body ?? {});\n }\n}\n","/**\n * TrillboardsClient — main entry point for the Trillboards Partner API SDK.\n *\n * Usage:\n * import { TrillboardsClient } from '@trillboards/api-client';\n *\n * const client = new TrillboardsClient({ apiKey: 'trb_partner_xxxxx' });\n * const screens = await client.screens.list();\n */\n\nimport { HttpClient } from './http';\nimport type { ClientOptions } from './types';\nimport {\n ScreensClient,\n DevicesClient,\n ImpressionsClient,\n AnalyticsClient,\n EarningsClient,\n ErrorsClient,\n WebhooksClient,\n FleetClient,\n AudienceClient,\n DataClient,\n BillingClient,\n} from './resources';\n\nconst DEFAULT_BASE_URL = 'https://api.trillboards.com';\n\nexport class TrillboardsClient {\n readonly screens: ScreensClient;\n readonly devices: DevicesClient;\n readonly impressions: ImpressionsClient;\n readonly analytics: AnalyticsClient;\n readonly webhooks: WebhooksClient;\n readonly earnings: EarningsClient;\n readonly fleet: FleetClient;\n readonly audience: AudienceClient;\n readonly data: DataClient;\n readonly errors: ErrorsClient;\n readonly billing: BillingClient;\n\n /** The underlying HTTP client (exposed for advanced use cases). */\n readonly _http: HttpClient;\n\n constructor(options: ClientOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'TrillboardsClient requires an apiKey. Get one at https://trillboards.com/developers'\n );\n }\n\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n\n this._http = new HttpClient({\n apiKey: options.apiKey,\n baseUrl,\n version: options.version,\n });\n\n this.screens = new ScreensClient(this._http);\n this.devices = new DevicesClient(this._http);\n this.impressions = new ImpressionsClient(this._http);\n this.analytics = new AnalyticsClient(this._http);\n this.webhooks = new WebhooksClient(this._http);\n this.earnings = new EarningsClient(this._http);\n this.fleet = new FleetClient(this._http);\n this.audience = new AudienceClient(this._http);\n this.data = new DataClient(this._http);\n this.errors = new ErrorsClient(this._http);\n this.billing = new BillingClient(this._http);\n }\n}\n","/**\n * Webhook signature verification for Trillboards Partner API webhooks.\n *\n * Uses HMAC-SHA256 with timing-safe comparison to prevent signature\n * forgery and timing attacks.\n */\n\nimport { createHmac, timingSafeEqual } from 'crypto';\nimport { TrillboardsError } from './error';\nimport type { WebhookEvent } from './types';\n\n/**\n * Verify a webhook payload signature and parse the event.\n *\n * @param payload - Raw request body as string or Buffer.\n * @param signature - The signature from the `X-Trillboards-Signature` header.\n * @param secret - The webhook secret from your webhook subscription.\n * @returns The parsed WebhookEvent if signature is valid.\n * @throws TrillboardsError if the signature does not match.\n *\n * @example\n * ```typescript\n * import { Webhooks } from '@trillboards/api-client';\n *\n * app.post('/webhooks', (req, res) => {\n * const event = Webhooks.constructEvent(\n * req.body,\n * req.headers['x-trillboards-signature'],\n * process.env.WEBHOOK_SECRET\n * );\n * console.log('Received event:', event.type);\n * res.sendStatus(200);\n * });\n * ```\n */\nexport function constructEvent(\n payload: string | Buffer,\n signature: string,\n secret: string,\n): WebhookEvent {\n const payloadStr = typeof payload === 'string' ? payload : payload.toString('utf8');\n\n const expectedSignature = createHmac('sha256', secret)\n .update(payloadStr)\n .digest('hex');\n\n const sigBuffer = Buffer.from(signature, 'utf8');\n const expectedBuffer = Buffer.from(expectedSignature, 'utf8');\n\n if (sigBuffer.length !== expectedBuffer.length || !timingSafeEqual(sigBuffer, expectedBuffer)) {\n throw new TrillboardsError({\n type: 'authentication_error',\n code: 'webhook_signature_invalid',\n message: 'Webhook signature verification failed. The payload may have been tampered with.',\n statusCode: 401,\n });\n }\n\n return JSON.parse(payloadStr) as WebhookEvent;\n}\n\nexport const Webhooks = { constructEvent };\n","/* eslint-disable */\n/**\n * AUTO-GENERATED. DO NOT EDIT.\n *\n * Generated from: trillboard-api/docs/openapi/merged/partner-api.json\n * Generator: trillboards-api-client/scripts/generate.js\n *\n * Re-emit via `npm run generate`.\n */\n\n// OpenAPI version: 3.0.3\n// API title: Trillboards Partner API\n// API version: 1.1.0\n// Schema count: 67\n// Operation count: 132\n\n// ─── Component schemas ───────────────────────────────────────────────────\n\nexport type Ad = {\n allocation_id?: string;\n /** Duration in seconds */\n duration?: number;\n /** Advertisement ID */\n id?: string;\n /** Call this to record impression */\n impression_url?: string;\n /** 1x1 tracking pixel URL */\n pixel_url?: string;\n title?: string;\n type?: \"video\" | \"image\";\n /** Media URL (CDN) */\n url?: string;\n};\n\nexport type AdSettings = {\n ad_interval?: number;\n image_duration?: number;\n max_ads_per_hour?: number;\n overlay_button_text?: string;\n sound_enabled?: boolean;\n};\n\nexport type AudienceAnalyticsResponse = {\n data?: {\n audience?: {\n avg_attention?: number;\n avg_face_count?: number;\n screens_with_data?: number;\n };\n overview?: {\n active_screens?: number;\n avg_impressions_per_screen?: number;\n total_impressions?: number;\n total_screens?: number;\n };\n period?: string;\n timestamp?: string;\n trends?: {\n audience_trend?: \"increasing\" | \"stable\" | \"decreasing\";\n impressions_trend?: \"increasing\" | \"stable\" | \"decreasing\";\n };\n };\n request_id?: string;\n success?: boolean;\n};\n\nexport type AudienceExportResponse = {\n data?: Array<{\n audience?: {\n avg_attention?: number;\n avg_face_count?: number;\n demographics?: Record<string, unknown>;\n income_profile?: Record<string, unknown>;\n lifestyle_segments?: Array<string>;\n };\n country?: string;\n impressions?: number;\n location?: string;\n period?: {\n end?: string;\n start?: string;\n };\n screen_id?: string;\n screen_name?: string;\n }>;\n request_id?: string;\n success?: boolean;\n summary?: {\n aggregation?: string;\n period?: Record<string, unknown>;\n total_impressions?: number;\n total_screens?: number;\n };\n};\n\nexport type AudienceMetricsResponse = {\n data?: {\n aggregated?: {\n avgAttention?: number;\n avgDwellMs?: number;\n avgFaceCount?: number;\n groupComposition?: Record<string, unknown>;\n incomeProfile?: {\n high?: number;\n low?: number;\n medium?: number;\n premium?: number;\n };\n };\n history?: Array<Record<string, unknown>>;\n live?: {\n /** Average attention score (0-1) */\n avgAttention?: number;\n /** Average faces detected */\n avgFaceCount?: number;\n incomeLevel?: \"unknown\" | \"low\" | \"medium\" | \"high\" | \"premium\";\n /** Maximum faces detected in period */\n maxFaces?: number;\n mood?: string;\n screenEngagement?: string;\n };\n period?: string;\n screen_id?: string;\n screen_name?: string;\n timestamp?: string;\n };\n request_id?: string;\n success?: boolean;\n};\n\nexport type AudienceSegment = {\n created_at?: string;\n description?: string;\n id?: string;\n is_active?: boolean;\n last_matched_at?: string;\n last_matched_count?: number;\n name?: string;\n object?: string;\n request_id?: string;\n rules?: Array<{\n field?: string;\n operator?: string;\n value?: unknown;\n }>;\n updated_at?: string;\n};\n\nexport type BatchResult = {\n /** Number that failed */\n failed_count?: number;\n failed_screens?: Array<{\n error?: string;\n screen_id?: string;\n }>;\n object?: string;\n request_id?: string;\n /** Number of screens requested to update */\n total_requested?: number;\n /** Number successfully updated */\n updated_count?: number;\n /** IDs of successfully updated screens */\n updated_screens?: Array<string>;\n};\n\nexport type BleScanResultData = {\n appleContinuitySubtype?: number | null;\n deviceType?: number | null;\n ibeaconMajor?: number | null;\n ibeaconMinor?: number | null;\n ibeaconUuid?: string | null;\n manufacturerCompanyId?: number | null;\n rawAddress: string;\n rssi: number;\n serviceUuids?: Array<string> | null;\n stableManufacturerPayloadHex?: string | null;\n txPowerDbm?: number | null;\n [key: string]: unknown;\n};\n\nexport type ChangelogEntry = {\n /** ISO date string or null for unreleased */\n date: string | null;\n /** Human-readable change description */\n description: string;\n /** API surface: data, sdk, device, sensing, openrtb, partner, all */\n surface: string;\n /** Keepachangelog type: added, changed, deprecated, removed, fixed, security */\n type: string;\n /** \"unreleased\" or a date like \"2026-04-16\" */\n version: string;\n};\n\nexport type ChangelogResponse = {\n /** Matching changelog entries */\n data: Array<ChangelogEntry>;\n /** Always \"list\" */\n object: \"list\";\n /** Number of entries returned */\n total: number;\n};\n\nexport type ContentPreferencesInput = {\n /** Specific advertiser IDs to block */\n blocked_advertisers?: Array<string>;\n /** Ad categories to block (e.g., \"alcohol\", \"gambling\", \"adult\") */\n blocked_categories?: Array<string>;\n /** Preferred ad language (ISO 639-1 code) */\n language_preference?: string;\n /** Max times same ad can show per hour */\n max_ad_frequency?: number;\n /** Minimum ad content rating */\n min_ad_rating?: \"G\" | \"PG\" | \"PG-13\" | \"R\";\n /** Preferred ad categories (prioritized in auctions) */\n preferred_categories?: Array<string>;\n};\n\nexport type ContentPreferencesResponse = {\n blocked_advertisers?: Array<string>;\n blocked_categories?: Array<string>;\n language_preference?: string;\n max_ad_frequency?: number;\n min_ad_rating?: string;\n object?: string;\n preferred_categories?: Array<string>;\n request_id?: string;\n screen_id?: string;\n updated_at?: string;\n};\n\nexport type ContentPreset = {\n /** Advertiser IDs blocked */\n blocked_advertisers?: Array<string>;\n /** Categories blocked by this preset */\n blocked_categories?: Array<string>;\n /** Preset description */\n description?: string;\n /** Unique preset identifier */\n id?: string;\n /** Minimum ad rating allowed */\n min_ad_rating?: \"G\" | \"PG\" | \"PG-13\" | \"R\";\n /** Human-readable preset name */\n name?: string;\n /** Full preference object applied by this preset */\n preferences?: Record<string, unknown>;\n};\n\nexport type DashboardResponse = {\n earnings?: {\n available_payout_cents?: number;\n next_payout_date?: string;\n pending_payout_cents?: number;\n revenue_share_percent?: number;\n total_earned_cents?: number;\n };\n partner?: {\n created_at?: string;\n name?: string;\n slug?: string;\n status?: \"pending\" | \"active\" | \"suspended\" | \"terminated\";\n };\n recent_activity?: Array<{\n ad_id?: string;\n screen_id?: string;\n timestamp?: string;\n type?: string;\n }>;\n stats?: {\n active_screens?: number;\n offline_screens?: number;\n pending_screens?: number;\n total_impressions_month?: number;\n total_impressions_today?: number;\n total_impressions_week?: number;\n total_screens?: number;\n };\n stripe_status?: {\n account_status?: string;\n connect_account_id?: string;\n };\n top_screens?: Array<{\n impressions_today?: number;\n location?: string;\n name?: string;\n screen_id?: string;\n }>;\n};\n\nexport type DemographicsResponse = {\n data?: {\n data_quality?: {\n confidence?: number;\n sample_size?: number;\n };\n demographics?: {\n age_distribution?: {\n \"18-25\"?: number;\n \"26-35\"?: number;\n \"36-50\"?: number;\n \"50+\"?: number;\n };\n gender_split?: {\n female?: number;\n male?: number;\n };\n group_composition?: {\n couples?: number;\n families?: number;\n friends?: number;\n solo?: number;\n work_groups?: number;\n };\n income_profile?: {\n high?: number;\n low?: number;\n medium?: number;\n premium?: number;\n };\n lifestyle_segments?: Array<string>;\n };\n period?: string;\n screen_id?: string;\n screen_name?: string;\n timestamp?: string;\n };\n request_id?: string;\n success?: boolean;\n};\n\nexport type Device = {\n created_at?: string;\n device_id?: string;\n device_type?: string;\n /** Screen display specification. `width`/`height` are pixel resolution; `width_in`/`height_in` are physical inches. Pixel-only inputs are NOT recorded as physical size — pass `width_in`/`height_in` (most accurate) or `ppi` so the server can derive inches from pixels. */\n display?: {\n /** Display resolution height in pixels */\n height?: number;\n /** Physical screen height in inches */\n height_in?: number;\n orientation?: string;\n /** Pixels per inch (required to derive physical size from width/height) */\n ppi?: number;\n /** Display resolution width in pixels */\n width?: number;\n /** Physical screen width in inches */\n width_in?: number;\n };\n embed_url?: string;\n enrichment?: Record<string, unknown>;\n external_device_id?: string;\n fingerprint?: string;\n location?: Record<string, unknown>;\n name?: string;\n screen_id?: string;\n status?: \"pending\" | \"active\" | \"offline\" | \"suspended\";\n updated_at?: string;\n venue?: Record<string, unknown>;\n};\n\nexport type DeviceCapabilityPayload = {\n agentType?: string | null;\n agentVersion?: string | null;\n audienceSensing?: {\n cameraAvailable?: boolean | null;\n cameraCount?: number | null;\n cameraHealth?: {\n lastFailureClass?: string | null;\n lastFailureMessage?: string | null;\n lastFrameAtMs?: number | null;\n retryCount?: number | null;\n state?: string | null;\n [key: string]: unknown;\n } | null;\n cameraType?: string | null;\n microphoneAvailable?: boolean | null;\n sensingMode?: string | null;\n [key: string]: unknown;\n } | null;\n audioControl?: {\n mute?: boolean | null;\n volume?: boolean | null;\n [key: string]: unknown;\n } | null;\n capabilitiesVersion?: number | null;\n environmentSensors?: {\n ambientLight?: boolean | null;\n temperature?: boolean | null;\n [key: string]: unknown;\n } | null;\n inputControl?: {\n appSwitch?: boolean | null;\n hdmi?: boolean | null;\n [key: string]: unknown;\n } | null;\n isDeviceOwner?: boolean | null;\n managementCapabilities?: {\n clearCache?: boolean | null;\n installApk?: boolean | null;\n kioskMode?: boolean | null;\n reboot?: boolean | null;\n restart?: boolean | null;\n screenshot?: boolean | null;\n wipe?: boolean | null;\n [key: string]: unknown;\n } | null;\n mlCapabilities?: {\n availableRamMb?: number | null;\n chipsetName?: string | null;\n chipsetVendor?: string | null;\n cpuAbi?: string | null;\n densityDpi?: number | null;\n gpuDelegateSupported?: boolean | null;\n gpuName?: string | null;\n hasNpu?: boolean | null;\n maxVlmSizeMb?: number | null;\n nnapiSupported?: boolean | null;\n npuName?: string | null;\n osApiLevel?: number | null;\n recommendedModelTier?: string | null;\n screenHeightPx?: number | null;\n screenWidthPx?: number | null;\n totalRamMb?: number | null;\n [key: string]: unknown;\n } | null;\n powerControl?: {\n cec?: boolean | null;\n softBlackout?: boolean | null;\n wol?: boolean | null;\n [key: string]: unknown;\n } | null;\n wifiCsiSensing?: {\n csiAvailable?: boolean | null;\n csiHardwareType?: string | null;\n csiNodeCount?: number | null;\n [key: string]: unknown;\n } | null;\n [key: string]: unknown;\n};\n\nexport type DeviceSummary = {\n created_at?: string;\n device_id?: string;\n device_type?: string;\n display?: Record<string, unknown>;\n embed_url?: string;\n enrichment?: Record<string, unknown>;\n external_device_id?: string;\n fingerprint?: string;\n location?: Record<string, unknown>;\n name?: string;\n screen_id?: string;\n status?: string;\n updated_at?: string;\n venue?: Record<string, unknown>;\n};\n\nexport type DisplaySettingsInput = {\n /** Default ad duration in seconds */\n ad_duration_default?: number;\n /** Screen brightness percentage */\n brightness?: number;\n /** Ad display mode */\n display_mode?: \"fullscreen\" | \"l-bar\" | \"split\";\n /** What to show when no ads */\n idle_content?: \"default_stream\" | \"black\" | \"logo\";\n /** Mute audio */\n mute?: boolean;\n /** Screen orientation */\n orientation?: \"landscape\" | \"portrait\" | \"auto\";\n /** QR code position on screen */\n qr_code_position?: \"bottom-left\" | \"bottom-right\" | \"top-left\" | \"top-right\" | \"none\";\n /** Transition effect between ads */\n transition_effect?: \"fade\" | \"slide\" | \"none\";\n /** Audio volume percentage */\n volume?: number;\n};\n\nexport type DisplaySettingsResponse = {\n ad_duration_default?: number;\n ad_surfaces?: Array<{\n height_percent?: number;\n id?: string;\n position?: string;\n width_percent?: number;\n }>;\n brightness?: number;\n display_mode?: string;\n idle_content?: string;\n mute?: boolean;\n object?: string;\n orientation?: string;\n playback_policy?: {\n allow_skip?: boolean;\n max_duration_seconds?: number;\n min_break_between_ads?: number;\n };\n qr_code_position?: string;\n request_id?: string;\n screen_id?: string;\n transition_effect?: string;\n updated_at?: string;\n volume?: number;\n};\n\nexport type EarningsBreakdownResponse = {\n breakdown?: Array<{\n /** Date or screen_id depending on group_by */\n date?: string;\n earnings_cents?: number;\n impressions?: number;\n /** Screen ID (when grouped by screen) */\n screen_id?: string;\n }>;\n pending_programmatic?: {\n confirmation_date?: string;\n estimated_cents?: number;\n };\n period?: {\n end?: string;\n group_by?: \"day\" | \"week\" | \"screen\";\n start?: string;\n };\n summary?: {\n direct_cents?: number;\n programmatic_cents?: number;\n total_cents?: number;\n total_impressions?: number;\n };\n};\n\nexport type EarningsResponse = {\n /** Amount available for immediate payout */\n available_for_payout_cents?: number;\n breakdown?: {\n direct_campaigns?: number;\n programmatic_floodgates?: number;\n programmatic_google?: number;\n };\n next_payout_estimate?: {\n amount_cents?: number;\n date?: string;\n stripe_status?: string;\n };\n /** Minimum amount required for payout */\n payout_threshold_cents?: number;\n /** Programmatic earnings pending Net-60 confirmation */\n pending_confirmation_cents?: number;\n /** Partner's revenue share percentage */\n revenue_share_percent?: number;\n /** Estimated earnings for current month */\n this_month_cents?: number;\n /** Total earnings since partner started */\n total_lifetime_cents?: number;\n};\n\nexport type Error = {\n error?: string;\n message?: string;\n success?: boolean;\n};\n\nexport type HeaderBiddingSettings = {\n allocation?: number;\n enabled?: boolean;\n force_request?: boolean;\n min_interval_seconds?: number;\n prebid?: Record<string, unknown> | null;\n provider?: string;\n request_mode?: string;\n variant_name?: string;\n vast_tag_url?: string;\n} | null;\n\nexport type HttpProbeResult = {\n host: string;\n port?: number | null;\n server?: string | null;\n [key: string]: unknown;\n};\n\nexport type MdnsNetworkDevice = {\n host?: string | null;\n instanceName: string;\n mdnsModel?: string | null;\n mdnsSoftwareVersion?: string | null;\n mdnsVendor?: string | null;\n port?: number | null;\n serviceType: string;\n [key: string]: unknown;\n};\n\nexport type Pagination = {\n /** Whether more items exist */\n has_more?: boolean;\n /** Items per page */\n limit?: number;\n /** Current offset */\n offset?: number;\n /** Total number of items */\n total?: number;\n};\n\nexport type Partner = {\n integration_tier?: string;\n name?: string;\n partner_id?: string;\n partner_type?: string;\n revenue_share_percent?: number;\n sdk_config?: SDKConfig;\n slug?: string;\n stats?: PartnerStats;\n status?: \"pending\" | \"active\" | \"suspended\" | \"terminated\";\n stripe_account_status?: string;\n};\n\nexport type PartnerAdDeliveryProfile = {\n android_api_level?: number | null;\n auto_recovery_enabled?: boolean;\n ima_integration?: \"android_native\" | \"html5_webview\" | \"disabled\" | \"unknown\";\n mode?: \"ima_sdk\" | \"vast_fallback\";\n notes?: Array<string>;\n reason?: string;\n webview_chromium_major?: number | null;\n};\n\nexport type PartnerDefaultStream = {\n _id?: string;\n canva_url?: string;\n createdAt?: string;\n description?: string;\n duration_seconds?: number;\n embed_url?: string;\n generic_iframe_url?: string;\n google_slides_url?: string;\n iframe_config?: Record<string, unknown>;\n image_duration?: number;\n images?: Array<string>;\n is_active?: boolean;\n is_currently_playing?: boolean;\n name?: string;\n partner_id?: string;\n playback_order?: number;\n screenId?: string;\n social_wall_url?: string;\n stream_type?: string;\n twitch_url?: string;\n updatedAt?: string;\n video_url?: string;\n youtube_url?: string;\n};\n\nexport type PartnerDefaultStreamCreate = {\n canva_url?: string;\n description?: string;\n /** Optional explicit duration for iframe-based streams */\n duration_seconds?: number;\n embed_url?: string;\n generic_iframe_url?: string;\n google_slides_url?: string;\n iframe_config?: {\n allow_flags?: string;\n auto_advance?: boolean;\n refresh_interval_seconds?: number;\n sandbox_flags?: string;\n slide_delay_ms?: number;\n };\n /** Seconds per image */\n image_duration?: number;\n images?: Array<string>;\n name?: string;\n social_wall_url?: string;\n stream_type?: \"local\" | \"youtube\" | \"uploaded\" | \"images\" | \"twitch\" | \"google_slides\" | \"canva\" | \"social_wall\" | \"generic_iframe\";\n twitch_url?: string;\n video_url?: string;\n youtube_url?: string;\n};\n\nexport type PartnerDefaultStreamUpdate = PartnerDefaultStreamCreate;\n\n/**\n * Heartbeat payload from agent-core / agent-core-lite Android partner\n * SDKs. Only includes fields verified populated in production\n * `signal_observations` (last 30 days). Stub fields wired in Kotlin but\n * never observed in CH are intentionally excluded; re-add only after\n * telemetry confirms >1% population over 7 days.\n *\n */\nexport type PartnerDeviceHeartbeatBody = {\n advertisingId?: string | null;\n advertisingIdType?: \"gaid\" | \"idfa\" | null | null;\n bleDeviceCount?: number;\n capabilities?: DeviceCapabilityPayload;\n discoveredNetworkDevices?: Array<MdnsNetworkDevice> | null;\n fingerprint?: string;\n gatewayIpHash?: string | null;\n httpProbes?: Array<HttpProbeResult> | null;\n limitAdTracking?: boolean | null;\n metadata?: Record<string, unknown>;\n /** Capped at 50 devices (RSSI-sorted, strongest first). */\n nearbyBleDevices?: Array<BleScanResultData> | null;\n nearbyWifiNetworks?: Array<WifiScanResult> | null;\n networkDeviceCount?: number;\n /** Heartbeat schema version (1=baseline, 2=nativeSensorSnapshot) */\n schemaVersion?: number;\n screenId?: string | null;\n /** Per-source skip-reason counter map. Shape `{source: {reason: count}}`. */\n skipReasonCounts?: Record<string, Record<string, number>>;\n ssdpDevices?: Array<SsdpDeviceInfo> | null;\n status?: string;\n wifiBssidHash?: string | null;\n wifiEnvironment?: WifiEnvironmentSnapshot;\n wifiNetworkCount?: number;\n wifiSsidHash?: string | null;\n [key: string]: unknown;\n};\n\nexport type PartnerHeartbeatCommand = {\n /** Command normalized for partner SDK compatibility. */\n command?: string;\n id?: string;\n payload?: Record<string, unknown>;\n queued_at?: string;\n};\n\nexport type PartnerHeartbeatData = {\n ad_delivery_profile?: PartnerAdDeliveryProfile;\n commands?: Array<PartnerHeartbeatCommand>;\n last_seen_at?: string;\n status?: \"online\" | \"offline\";\n};\n\nexport type PartnerHeartbeatMeasurementMetadata = {\n ageSeconds?: number | null;\n cachedAt?: string | null;\n receivedAt?: string | null;\n source?: \"redis_twin\" | \"pg_fallback\" | \"unknown\";\n [key: string]: unknown;\n};\n\nexport type PartnerHeartbeatQueryData = {\n adDeliveryProfile?: PartnerAdDeliveryProfile;\n deviceId: string;\n lastHeartbeatAt?: string | null;\n measurementMetadata?: PartnerHeartbeatMeasurementMetadata;\n stalenessSeconds?: number | null;\n telemetry?: PartnerSafeHeartbeatTelemetry;\n [key: string]: unknown;\n};\n\nexport type PartnerHeartbeatQueryResponse = {\n data?: PartnerHeartbeatQueryData;\n success?: boolean;\n};\n\n/**\n * Optional heartbeat payload. Nested telemetry objects are preferred; legacy flat keys\n * are still accepted for backward compatibility.\n *\n */\nexport type PartnerHeartbeatRequest = {\n ad?: {\n last_vast_request_at?: string;\n last_vast_response_at?: string;\n proof_of_play_enabled?: boolean;\n };\n agent_status?: string;\n agent_version?: string;\n android_api_level?: number;\n brightness?: number;\n desugaring_enabled?: boolean;\n device?: {\n android_api_level?: number;\n make?: string;\n model?: string;\n os?: string;\n osv?: string;\n webview_chromium_major?: number;\n };\n ima_integration?: \"android_native\" | \"html5_webview\" | \"disabled\" | \"unknown\";\n ima_sdk_version?: string;\n ima_support_reason?: string;\n ima_supported?: boolean;\n input_source?: string;\n last_ima_error_code?: number;\n last_vast_error_code?: number;\n last_vast_request_at?: string;\n last_vast_response_at?: string;\n /** Alternate namespace for telemetry keys (legacy support). */\n metadata?: Record<string, unknown>;\n muted?: boolean;\n network?: {\n bandwidthMbps?: number;\n connectionType?: string;\n downlinkMbps?: number;\n effectiveType?: string;\n latencyRtt?: number;\n rtt?: number;\n saveData?: boolean;\n };\n network_strength_dbm?: number;\n power_state?: \"on\" | \"standby\" | \"off\" | \"unknown\";\n proof_of_play_enabled?: boolean;\n sdk?: {\n android_api_level?: number;\n desugaring_enabled?: boolean;\n ima_integration?: \"android_native\" | \"html5_webview\" | \"disabled\" | \"unknown\";\n ima_sdk_version?: string;\n ima_supported?: boolean;\n version?: string;\n webview_chromium_major?: number;\n };\n sdk_version?: string;\n telemetry?: PartnerHeartbeatTelemetry;\n temperature_c?: number;\n uptime_seconds?: number;\n volume?: number;\n webview_chromium_major?: number;\n};\n\nexport type PartnerHeartbeatResponse = {\n data?: PartnerHeartbeatData;\n success?: boolean;\n};\n\nexport type PartnerHeartbeatTelemetry = {\n agentStatus?: string;\n agentVersion?: string;\n android_api_level?: number;\n bandwidthMbps?: number;\n brightness?: number;\n connectionType?: string;\n desugaring_enabled?: boolean;\n downlinkMbps?: number;\n ima_integration?: \"android_native\" | \"html5_webview\" | \"disabled\" | \"unknown\";\n ima_sdk_version?: string;\n ima_support_reason?: string;\n ima_supported?: boolean;\n inputSource?: string;\n last_ima_error_code?: number;\n last_vast_error_code?: number;\n last_vast_request_at?: string;\n last_vast_response_at?: string;\n latencyRtt?: number;\n make?: string;\n model?: string;\n muted?: boolean;\n networkConnectionType?: string;\n networkEffectiveType?: string;\n networkStrengthDbm?: number;\n os?: string;\n osVersion?: string;\n osv?: string;\n powerState?: \"on\" | \"standby\" | \"off\" | \"unknown\";\n proof_of_play_enabled?: boolean;\n rtt?: number;\n saveData?: boolean;\n temperatureC?: number;\n uptimeSeconds?: number;\n volume?: number;\n webview_chromium_major?: number;\n [key: string]: unknown;\n};\n\nexport type PartnerLBarContent = {\n business_name?: string;\n contact_info?: Record<string, unknown>;\n current_promotion?: string;\n custom_messages?: Array<string>;\n display_settings?: Record<string, unknown>;\n enabled?: boolean;\n live_updates?: Record<string, unknown>;\n social_media?: Record<string, unknown>;\n store_hours?: Record<string, unknown>;\n};\n\nexport type PartnerLBarDisplayPreferences = {\n ad_surface_mode?: \"fullscreen\" | \"lbar\" | \"pip\" | \"all\";\n display_mode?: \"fullscreen\" | \"l-bar\";\n l_bar_ad_duration?: number;\n l_bar_ad_interval?: number;\n l_bar_ads_enabled?: boolean;\n l_bar_position?: \"bottom\" | \"right\";\n l_bar_size?: number;\n pip_settings?: {\n aspect_ratio?: number;\n enabled?: boolean;\n margin?: number;\n position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n size_ratio?: number;\n };\n};\n\nexport type PartnerLBarSettings = {\n ad_surfaces?: Record<string, unknown>;\n display_preferences?: PartnerLBarDisplayPreferences;\n l_bar_content?: PartnerLBarContent;\n playback_policy?: Record<string, unknown>;\n};\n\n/**\n * Partner-safe subset of device telemetry. Strips MDM compliance,\n * Vertex embeddings, identity-correction internals, partner identifiers,\n * and Mongo `_id` so partners only see what they need to decide\n * whether a device is healthy enough to receive ads.\n *\n */\nexport type PartnerSafeHeartbeatTelemetry = {\n agentStatus?: string | null;\n agentVersion?: string | null;\n bandwidthMbps?: number | null;\n brightness?: number | null;\n connectionType?: string | null;\n consecutiveAdFailures?: number | null;\n effectiveType?: string | null;\n latencyRtt?: number | null;\n make?: string | null;\n model?: string | null;\n muted?: boolean | null;\n networkStrengthDbm?: number | null;\n onlineStatus?: \"online\" | \"offline\" | \"standby\" | \"unknown\" | null;\n os?: string | null;\n osv?: string | null;\n powerState?: string | null;\n temperatureC?: number | null;\n ua?: string | null;\n uptimeSeconds?: number | null;\n visibilityState?: string | null;\n volume?: number | null;\n [key: string]: unknown;\n};\n\nexport type PartnerSelfPromoAd = {\n _id?: string;\n campaign_link?: string;\n createdAt?: string;\n description?: string;\n name?: string;\n photos?: Array<string>;\n status?: string;\n video?: string;\n};\n\nexport type PartnerSelfPromoCreate = {\n campaign_link?: string;\n description?: string;\n end_date?: string;\n image_url?: string;\n name: string;\n screen_ids?: Array<string>;\n start_date?: string;\n video_url?: string;\n};\n\nexport type PartnerSelfPromoPlacement = {\n ads?: Array<{\n advertisement?: PartnerSelfPromoAd;\n allocation_id?: string;\n end_date?: string;\n start_date?: string;\n status?: string;\n }>;\n screen?: {\n _id?: string;\n name?: string;\n };\n};\n\nexport type PartnerStats = {\n active_devices?: number;\n last_impression_at?: string;\n pending_payout_cents?: number;\n total_devices?: number;\n total_impressions?: number;\n total_revenue_cents?: number;\n};\n\nexport type PayoutResponse = {\n amount_cents?: number;\n estimated_arrival?: string;\n payout_id?: string;\n status?: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n stripe_transfer_id?: string | null;\n};\n\nexport type PlaygroundResult = {\n /** Whether the operation is safe for autonomous agents. */\n agent_safe: boolean;\n /** Billing tier: free, metered, or paid. */\n cost_tier: string;\n /** Whether the operation is idempotent. */\n idempotent: boolean;\n /** Object type identifier. */\n object: \"playground_result\";\n operation_id: string;\n /** Declared side effects of the operation. */\n side_effects: Array<string>;\n /** Whether the request body passed validation. */\n valid: boolean;\n /** The parsed/coerced body on success, null on failure. */\n validated_body?: unknown;\n /** Array of validation issues on failure, null on success. */\n validation_errors: Array<PlaygroundValidationError> | null;\n /** The HTTP method and path this operation maps to. */\n would_call: {\n method: string;\n path: string;\n };\n};\n\nexport type PlaygroundValidationError = {\n /** Zod issue code. */\n code: string;\n /** Human-readable validation message. */\n message: string;\n /** Dot-delimited path to the invalid field. */\n path: string;\n};\n\nexport type ProgrammaticSettingsInput = {\n /** Enable programmatic ads */\n enabled?: boolean;\n /** Minimum CPM in dollars */\n floor_price_cpm?: number;\n google_ima?: {\n ad_tag_url?: string;\n enabled?: boolean;\n max_duration?: number;\n };\n prebid?: {\n bidders?: Array<{\n name?: string;\n params?: Record<string, unknown>;\n }>;\n enabled?: boolean;\n };\n /** Ad source priority */\n priority?: \"direct_first\" | \"programmatic_first\" | \"highest_bid\";\n};\n\nexport type ProgrammaticSettingsResponse = {\n enabled?: boolean;\n floor_price_cpm?: number;\n google_ima?: {\n ad_tag_url?: string;\n enabled?: boolean;\n max_duration?: number;\n };\n object?: string;\n prebid?: {\n bidders?: Array<Record<string, unknown>>;\n enabled?: boolean;\n };\n priority?: string;\n request_id?: string;\n screen_id?: string;\n stats?: {\n avg_cpm?: number;\n fill_rate_percent?: number;\n impressions_today?: number;\n };\n updated_at?: string;\n};\n\nexport type RequestMetadataResponse = {\n duration_ms: number;\n /** Present only when the original request resulted in an error. */\n error?: {\n code: string;\n type: string;\n };\n method: string;\n /** Object type identifier. */\n object: \"request\";\n path: string;\n request_id: string;\n status_code: number;\n timestamp: string;\n};\n\n/**\n * Permission flags for each role. Owners have all permissions,\n * admins have operational permissions, viewers have read-only access.\n *\n */\nexport type RolePermissions = {\n /** Can configure webhooks */\n configure_webhooks?: boolean;\n /** Can edit screen settings */\n edit_screens?: boolean;\n /** Can invite/remove team members */\n manage_team?: boolean;\n /** Can request payouts */\n request_payouts?: boolean;\n /** Can rotate API keys */\n rotate_api_keys?: boolean;\n /** Can view impression analytics */\n view_analytics?: boolean;\n /** Can view earnings/revenue */\n view_earnings?: boolean;\n /** Can view impression data */\n view_impressions?: boolean;\n /** Can view payout history */\n view_payouts?: boolean;\n /** Can view online/offline status */\n view_screen_status?: boolean;\n /** Can view screen list */\n view_screens?: boolean;\n};\n\nexport type SDKConfig = {\n /** Seconds between ads */\n ad_interval?: number;\n allowed_ad_types?: Array<string>;\n cache_size?: number;\n /** Seconds to display image ads */\n image_duration?: number;\n max_ads_per_hour?: number;\n overlay_button_text?: string;\n sound_enabled?: boolean;\n};\n\nexport type ScreenAnalyticsResponse = {\n impressions?: {\n daily_average?: number;\n total?: number;\n /** Percentage change compared to previous period */\n trend_percent?: number;\n };\n period?: {\n days?: number;\n end?: string;\n start?: string;\n };\n screen?: {\n id?: string;\n location?: string;\n name?: string;\n online_status?: string;\n status?: string;\n };\n timeline?: Array<{\n avg_duration_ms?: number;\n date?: string;\n impressions?: number;\n }>;\n};\n\nexport type SsdpDeviceInfo = {\n friendlyName?: string | null;\n location: string;\n manufacturer?: string | null;\n modelName?: string | null;\n server?: string | null;\n st: string;\n udn?: string | null;\n [key: string]: unknown;\n};\n\nexport type TeamInviteResponse = {\n email?: string;\n /** When the invitation expires (7 days from creation) */\n expires_at?: string;\n membership_id?: string;\n role?: \"admin\" | \"viewer\";\n status?: \"pending\" | \"active\";\n};\n\nexport type TeamMember = {\n accepted_at?: string | null;\n email?: string;\n invited_at?: string;\n invited_by?: {\n email?: string;\n name?: string;\n } | null;\n last_portal_access?: string | null;\n /** Unique membership record ID */\n membership_id?: string;\n name?: string;\n permissions?: RolePermissions;\n photo?: string | null;\n role?: \"owner\" | \"admin\" | \"viewer\";\n status?: \"active\" | \"pending\" | \"revoked\";\n /** User ID (null if pending invitation) */\n user_id?: string;\n};\n\nexport type Transaction = {\n amount_cents?: number;\n created_at?: string;\n date?: string;\n id?: string;\n /** Number of impressions (for earning transactions) */\n impressions?: number;\n /** Source of the transaction (e.g., impressions, payout) */\n source?: string;\n /** Stripe transfer ID (for payout transactions) */\n stripe_transfer_id?: string;\n type?: \"earning\" | \"payout\";\n};\n\nexport type Webhook = {\n /** When webhook was created */\n created_at?: string;\n /** Subscribed event types */\n events?: Array<\"device.online\" | \"device.offline\" | \"impression.recorded\" | \"campaign.allocated\" | \"payout.processed\">;\n /** Total failed deliveries */\n failure_count?: number;\n /** Last time webhook was triggered */\n last_triggered_at?: string;\n /** Webhook status */\n status?: \"active\" | \"inactive\";\n /** Total successful deliveries */\n success_count?: number;\n /** Webhook endpoint URL */\n url?: string;\n /** Unique webhook identifier */\n webhook_id?: string;\n};\n\nexport type WebhookDelivery = {\n /** When delivery was first attempted */\n attempted_at?: string;\n /** When delivery succeeded */\n delivered_at?: string;\n /** Error message if failed */\n error_message?: string;\n /** Event that triggered this delivery */\n event_type?: string;\n /** HTTP status code from endpoint */\n http_status?: number;\n /** Delivery record ID */\n id?: string;\n /** Response time in milliseconds */\n response_time_ms?: number;\n /** Number of retry attempts */\n retry_count?: number;\n /** Delivery status */\n status?: \"pending\" | \"success\" | \"failed\" | \"retrying\";\n};\n\n/**\n * Standard webhook event payload sent to your endpoint.\n * All events follow this structure.\n *\n */\nexport type WebhookEvent = {\n /** Event-specific data */\n data?: Record<string, unknown>;\n /** Event type */\n event?: string;\n /** When event occurred */\n timestamp?: string;\n};\n\nexport type WifiEnvironmentSnapshot = {\n channelCongestionRatio?: number | null;\n connectedChannelWidthMhz?: number | null;\n connectedFrequencyMhz?: number | null;\n connectedLinkSpeedMbps?: number | null;\n connectedSignalDbm?: number | null;\n frequencyBand?: string | null;\n medianSignalDbm?: number | null;\n networkCount?: number | null;\n rssiVariance?: number | null;\n scanTimestampMs?: number | null;\n signalSpreadDbm?: number | null;\n uniqueBssidCount?: number | null;\n [key: string]: unknown;\n} | null;\n\nexport type WifiScanResult = {\n channelWidthMhz?: number | null;\n frequencyMhz: number;\n rawBssid: string;\n signalStrengthDbm: number;\n [key: string]: unknown;\n};\n\n\n// ─── Operations ──────────────────────────────────────────────────────────\n\n/**\n * List self-promo ads\n * GET /ads/self-promo\n */\nexport interface listPartnerSelfPromoAdsOperation {\n readonly path: \"/ads/self-promo\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Array<PartnerSelfPromoAd>;\n success?: boolean;\n};\n}\n\n/**\n * Create self-promo ad (URL-based)\n * POST /ads/self-promo\n */\nexport interface createPartnerSelfPromoAdOperation {\n readonly path: \"/ads/self-promo\";\n readonly method: \"POST\";\n request: PartnerSelfPromoCreate;\n response: {\n data?: PartnerSelfPromoAd;\n success?: boolean;\n};\n}\n\n/**\n * List self-promo placements by screen\n * GET /ads/self-promo/placements\n */\nexport interface listPartnerSelfPromoPlacementsOperation {\n readonly path: \"/ads/self-promo/placements\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Array<PartnerSelfPromoPlacement>;\n success?: boolean;\n};\n}\n\n/**\n * Schedule existing self-promo ad to screens\n * POST /ads/self-promo/schedule\n */\nexport interface schedulePartnerSelfPromoOperation {\n readonly path: \"/ads/self-promo/schedule\";\n readonly method: \"POST\";\n request: {\n ad_id: string;\n end_date?: string;\n screen_ids: Array<string>;\n start_date?: string;\n};\n response: {\n success?: boolean;\n};\n}\n\n/**\n * Create self-promo ad (upload)\n * POST /ads/self-promo/upload\n */\nexport interface createPartnerSelfPromoUploadOperation {\n readonly path: \"/ads/self-promo/upload\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: PartnerSelfPromoAd;\n success?: boolean;\n};\n}\n\n/**\n * Disable self-promo ad allocations\n * POST /ads/self-promo/{adId}/disable\n */\nexport interface disablePartnerSelfPromoOperation {\n readonly path: \"/ads/self-promo/{adId}/disable\";\n readonly method: \"POST\";\n request: {\n screen_ids?: Array<string>;\n};\n response: {\n success?: boolean;\n};\n}\n\n/**\n * Register an AI agent\n * POST /agent/register\n */\nexport interface registerAgentOperation {\n readonly path: \"/agent/register\";\n readonly method: \"POST\";\n request: {\n /** Type of agent being registered */\n agent_type: \"dsp_agent\" | \"ssp_agent\" | \"trading_desk\" | \"analytics_platform\" | \"developer\";\n /** Company name (optional) */\n company?: string;\n /** Brief description of the agent's purpose */\n description?: string;\n /** Contact email */\n email: string;\n /** Agent or company name */\n name: string;\n};\n response: {\n agent_type?: string;\n /** API key for authentication (display once — save it!) */\n api_key?: string;\n /** MCP tools available to this agent */\n available_tools?: Array<string>;\n docs_url?: string;\n /** Free tier limits per product */\n free_tiers?: Record<string, unknown>;\n mcp_endpoint?: string;\n mcp_transport?: string;\n /** Guidance for getting started */\n next_steps?: Array<string>;\n object?: string;\n /** Unique partner ID */\n partner_id?: string;\n pricing_url?: string;\n request_id?: string;\n sandbox?: {\n note?: string;\n screens?: Array<{\n device_id?: string;\n name?: string;\n venue_type?: string;\n }>;\n };\n tools_url?: string;\n};\n}\n\n/**\n * Get partner analytics\n * GET /analytics\n */\nexport interface getAnalyticsOperation {\n readonly path: \"/analytics\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n devices_by_status?: Array<Record<string, unknown>>;\n impressions_by_day?: Array<{\n /** Date (YYYY-MM-DD) */\n _id?: string;\n impressions?: number;\n }>;\n partner?: {\n active_devices?: number;\n pending_payout_cents?: number;\n total_devices?: number;\n total_impressions?: number;\n total_revenue_cents?: number;\n };\n period?: {\n end?: string;\n start?: string;\n };\n };\n success?: boolean;\n};\n}\n\n/**\n * Rotate API key\n * POST /api-key/rotate\n */\nexport interface rotateApiKeyOperation {\n readonly path: \"/api-key/rotate\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: {\n /** New API key — shown only once! */\n api_key?: string;\n grace_period_hours?: number;\n message?: string;\n /** When the old key stops working */\n previous_key_expires_at?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get partner-wide audience analytics\n * GET /audience-analytics\n */\nexport interface getAudienceAnalyticsOperation {\n readonly path: \"/audience-analytics\";\n readonly method: \"GET\";\n request: never;\n response: AudienceAnalyticsResponse;\n}\n\n/**\n * Export audience data\n * GET /audience-export\n */\nexport interface exportAudienceDataOperation {\n readonly path: \"/audience-export\";\n readonly method: \"GET\";\n request: never;\n response: AudienceExportResponse;\n}\n\n/**\n * Get audience heatmap data\n * GET /audience/heatmap\n */\nexport interface getAudienceHeatmapOperation {\n readonly path: \"/audience/heatmap\";\n readonly method: \"GET\";\n request: never;\n response: {\n cells?: number;\n heatmap?: Array<Record<string, unknown>>;\n lookback_days?: number;\n object?: string;\n request_id?: string;\n screens_included?: number;\n};\n}\n\n/**\n * Get live audience data for a screen\n * GET /audience/live/{screenId}\n */\nexport interface getLiveAudienceOperation {\n readonly path: \"/audience/live/{screenId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n /** Null when screen is offline */\n audience?: {\n ad_receptivity?: number | null;\n attention_score?: number;\n crowd_density?: number;\n dominant_ambience?: string | null;\n dwell_time_ms?: number | null;\n emotional_engagement?: number | null;\n face_count?: number;\n income_level?: string | null;\n lifestyle_segment?: string | null;\n mood?: string | null;\n noise_level?: number | null;\n occupancy?: string | null;\n purchase_intent?: \"NONE\" | \"BROWSING\" | \"CONSIDERING\" | \"COMPARING\" | \"READY_TO_BUY\" | null;\n } | null;\n last_updated?: string | null;\n /** Present when screen is offline */\n message?: string;\n object?: string;\n request_id?: string;\n screen_id?: string;\n status?: \"live\" | \"offline\";\n};\n}\n\n/**\n * Find lookalike screens\n * GET /audience/lookalikes/{screenId}\n */\nexport interface getLookalikeScreensOperation {\n readonly path: \"/audience/lookalikes/{screenId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n filters?: {\n country?: string | null;\n min_similarity?: number;\n venue_type?: string | null;\n };\n matches?: Array<Record<string, unknown>>;\n matches_count?: number;\n object?: string;\n request_id?: string;\n source_screen_id?: string;\n};\n}\n\n/**\n * Predict screen audience\n * GET /audience/predict/{screenId}\n */\nexport interface predictScreenAudienceOperation {\n readonly path: \"/audience/predict/{screenId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n day_of_week?: number;\n hour_utc?: number;\n lookback_days?: number;\n /** Present when prediction is null */\n message?: string;\n object?: string;\n /** Null if insufficient historical data */\n prediction?: Record<string, unknown> | null;\n request_id?: string;\n screen_id?: string;\n};\n}\n\n/**\n * List audience segments\n * GET /audience/segments\n */\nexport interface listAudienceSegmentsOperation {\n readonly path: \"/audience/segments\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Array<AudienceSegment>;\n has_more?: boolean;\n object?: string;\n request_id?: string;\n total_count?: number;\n};\n}\n\n/**\n * Create audience segment\n * POST /audience/segments\n */\nexport interface createAudienceSegmentOperation {\n readonly path: \"/audience/segments\";\n readonly method: \"POST\";\n request: {\n description?: string;\n /** Segment name */\n name: string;\n rules: Array<{\n /** Rule field (e.g., venue_type, country, city, state) */\n field: string;\n /** Comparison operator (e.g., eq, neq, in, gt, lt) */\n operator: string;\n /** Rule value */\n value: unknown;\n }>;\n};\n response: AudienceSegment;\n}\n\n/**\n * Delete audience segment\n * DELETE /audience/segments/{segmentId}\n */\nexport interface deleteAudienceSegmentOperation {\n readonly path: \"/audience/segments/{segmentId}\";\n readonly method: \"DELETE\";\n request: never;\n response: {\n deleted?: boolean;\n id?: string;\n object?: string;\n request_id?: string;\n};\n}\n\n/**\n * Get audience segment\n * GET /audience/segments/{segmentId}\n */\nexport interface getAudienceSegmentOperation {\n readonly path: \"/audience/segments/{segmentId}\";\n readonly method: \"GET\";\n request: never;\n response: AudienceSegment;\n}\n\n/**\n * Update audience segment\n * PATCH /audience/segments/{segmentId}\n */\nexport interface updateAudienceSegmentOperation {\n readonly path: \"/audience/segments/{segmentId}\";\n readonly method: \"PATCH\";\n request: {\n description?: string;\n is_active?: boolean;\n name?: string;\n rules?: Array<{\n field?: string;\n operator?: string;\n value?: unknown;\n }>;\n};\n response: AudienceSegment;\n}\n\n/**\n * Match screens to segment\n * POST /audience/segments/{segmentId}/match\n */\nexport interface matchAudienceSegmentOperation {\n readonly path: \"/audience/segments/{segmentId}/match\";\n readonly method: \"POST\";\n request: never;\n response: {\n matched_count?: number;\n matches?: Array<Record<string, unknown>>;\n object?: string;\n own_screens_only?: boolean;\n request_id?: string;\n segment_id?: string;\n segment_name?: string;\n};\n}\n\n/**\n * Estimate segment reach\n * POST /audience/segments/{segmentId}/reach\n */\nexport interface estimateSegmentReachOperation {\n readonly path: \"/audience/segments/{segmentId}/reach\";\n readonly method: \"POST\";\n request: never;\n response: {\n country_breakdown?: Record<string, number>;\n estimated_daily_cpm?: number;\n estimated_daily_impressions?: number;\n estimated_daily_revenue?: number;\n has_historical_data?: boolean;\n matched_screens?: number;\n object?: string;\n online_screens?: number;\n segment_id?: string;\n segment_name?: string;\n venue_breakdown?: Record<string, number>;\n};\n}\n\n/**\n * Generate VAST tag for segment\n * POST /audience/segments/{segmentId}/vast-tag\n */\nexport interface generateSegmentVastTagOperation {\n readonly path: \"/audience/segments/{segmentId}/vast-tag\";\n readonly method: \"POST\";\n request: {\n /** Click-through landing page URL */\n click_through?: string;\n /** Video creative URL */\n creative_url: string;\n /** Video duration in seconds */\n duration?: number;\n own_screens_only?: boolean;\n};\n response: {\n creative?: {\n click_through?: string | null;\n duration?: number;\n url?: string;\n };\n cust_params?: Array<string>;\n object?: string;\n screen_ids?: Array<string>;\n segment_id?: string;\n segment_name?: string;\n targeted_screens?: number;\n vast_tag_url?: string;\n};\n}\n\n/**\n * Get audience data statistics\n * GET /audience/stats\n */\nexport interface getAudienceStatsOperation {\n readonly path: \"/audience/stats\";\n readonly method: \"GET\";\n request: never;\n response: {\n data_access_tier?: \"basic\" | \"developer\" | \"enterprise\";\n newest_data?: string | null;\n object?: string;\n oldest_data?: string | null;\n request_id?: string;\n screens_with_data?: number;\n total_screens?: number;\n total_vectors?: number;\n};\n}\n\n/**\n * Purchase committed-use credits\n * POST /billing/credits\n */\nexport interface purchaseCreditsOperation {\n readonly path: \"/billing/credits\";\n readonly method: \"POST\";\n request: {\n /** Credit purchase tier */\n tier: \"tier_500\" | \"tier_2000\" | \"tier_5000\";\n};\n response: {\n /** Amount charged in cents */\n charged_cents?: number;\n /** Credits added to balance in cents */\n credits_added_cents?: number;\n /** Discount percentage applied */\n discount_pct?: number;\n object?: string;\n /** Stripe PaymentIntent ID */\n payment_intent_id?: string;\n request_id?: string;\n};\n}\n\n/**\n * Create Stripe Checkout session for credits\n * POST /billing/credits/checkout\n */\nexport interface createCreditCheckoutOperation {\n readonly path: \"/billing/credits/checkout\";\n readonly method: \"POST\";\n request: {\n /** URL to redirect if payment is cancelled */\n cancel_url?: string;\n /** URL to redirect after successful payment */\n success_url?: string;\n tier: \"tier_500\" | \"tier_2000\" | \"tier_5000\";\n};\n response: {\n /** Stripe Checkout URL — redirect user here */\n checkout_url?: string;\n message?: string;\n object?: string;\n request_id?: string;\n /** Stripe Checkout session ID */\n session_id?: string;\n};\n}\n\n/**\n * Set up usage-based billing\n * POST /billing/setup\n */\nexport interface setupBillingOperation {\n readonly path: \"/billing/setup\";\n readonly method: \"POST\";\n request: {\n /** Stripe payment method token obtained from Stripe.js or Stripe Elements */\n payment_method_id: string;\n};\n response: {\n billing_status?: string;\n message?: string;\n object?: string;\n request_id?: string;\n stripe_customer_id?: string;\n};\n}\n\n/**\n * Get current billing period usage\n * GET /billing/usage-summary\n */\nexport interface getUsageSummaryOperation {\n readonly path: \"/billing/usage-summary\";\n readonly method: \"GET\";\n request: never;\n response: {\n /** Current billing status */\n billing_status?: \"none\" | \"active\" | \"suspended\";\n /** Remaining prepaid credit balance in cents */\n credit_balance_cents?: number;\n object?: string;\n /** End of current billing period */\n period_end?: string;\n /** Start of current billing period */\n period_start?: string;\n /** Per-product usage breakdown */\n products?: Record<string, {\n meters?: Record<string, {\n billable?: number;\n cost_cents?: number;\n free_quota?: number;\n usage?: number;\n }>;\n }>;\n request_id?: string;\n /** Total cost in cents for current period */\n total_cost_cents?: number;\n};\n}\n\n/**\n * Get partner dashboard overview\n * GET /connect/dashboard\n */\nexport interface getConnectDashboardOperation {\n readonly path: \"/connect/dashboard\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n charts?: {\n daily_impressions?: Array<{\n date?: string;\n earnings_cents?: number;\n impressions?: number;\n }>;\n hourly_today?: Array<{\n hour?: number;\n impressions?: number;\n }>;\n };\n earnings?: {\n available_cents?: number;\n daily_average_cents?: number;\n lifetime_cents?: number;\n pending_payout_cents?: number;\n period_cents?: number;\n today_cents?: number;\n };\n impressions?: {\n all_time?: number;\n daily_average?: number;\n period?: number;\n today?: number;\n trend_percent?: number;\n };\n partner?: {\n cpm_cents?: number;\n name?: string;\n revenue_share_percent?: number;\n slug?: string;\n status?: string;\n stripe_status?: \"pending\" | \"active\" | \"restricted\" | \"not_connected\";\n };\n period?: {\n days?: number;\n end?: string;\n start?: string;\n };\n screens?: {\n offline?: number;\n online?: number;\n pending?: number;\n total?: number;\n };\n top_screens?: Array<{\n earnings_cents?: number;\n impressions?: number;\n location?: string | null;\n name?: string;\n screen_id?: string;\n status?: \"online\" | \"offline\" | \"unknown\";\n }>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get earnings chart data\n * GET /connect/earnings\n */\nexport interface getConnectEarningsChartOperation {\n readonly path: \"/connect/earnings\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n chart?: Array<{\n avg_view_duration_ms?: number;\n date?: string;\n earnings_cents?: number;\n impressions?: number;\n label?: string;\n unique_screens?: number;\n }>;\n period?: {\n days?: number;\n end?: string;\n start?: string;\n };\n summary?: {\n data_points?: number;\n group_by?: string;\n total_earnings_cents?: number;\n total_impressions?: number;\n };\n };\n success?: boolean;\n};\n}\n\n/**\n * Get screen health status\n * GET /connect/health\n */\nexport interface getConnectScreenHealthOperation {\n readonly path: \"/connect/health\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n checked_at?: string;\n filter?: string;\n screens?: Array<{\n device_id?: string;\n external_device_id?: string;\n fingerprint?: string;\n last_heartbeat?: string | null;\n last_seen?: string | null;\n location?: {\n city?: string | null;\n lat?: number | null;\n lng?: number | null;\n state?: string | null;\n };\n name?: string;\n registered_at?: string;\n screen_id?: string | null;\n screen_status?: \"pending\" | \"active\" | \"inactive\";\n status?: \"online\" | \"offline\" | \"never_connected\" | \"unknown\";\n time_since_last_seen_seconds?: number | null;\n uptime_24h_percent?: number | null;\n venue_type?: string | null;\n }>;\n summary?: {\n never_connected?: number;\n offline?: number;\n online?: number;\n total?: number;\n };\n };\n success?: boolean;\n};\n}\n\n/**\n * List content presets\n * GET /content-presets\n */\nexport interface listContentPresetsOperation {\n readonly path: \"/content-presets\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Array<ContentPreset>;\n has_more?: boolean;\n object?: string;\n total_count?: number;\n url?: string;\n};\n}\n\n/**\n * Get content preset\n * GET /content-presets/{presetId}\n */\nexport interface getContentPresetOperation {\n readonly path: \"/content-presets/{presetId}\";\n readonly method: \"GET\";\n request: never;\n response: ContentPreset;\n}\n\n/**\n * Get dashboard overview\n * GET /dashboard\n */\nexport interface getDashboardOperation {\n readonly path: \"/dashboard\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: DashboardResponse;\n success?: boolean;\n};\n}\n\n/**\n * Register a device\n * POST /device\n */\nexport interface registerDeviceOperation {\n readonly path: \"/device\";\n readonly method: \"POST\";\n request: {\n /** Any additional metadata for your records */\n custom_metadata?: Record<string, unknown>;\n /** Screen or venue description for enrichment */\n description?: string;\n /** Your internal device identifier */\n device_id: string;\n device_type?: \"vending_machine\" | \"kiosk\" | \"tablet\" | \"display\" | \"other\";\n /** Screen display specification. `width`/`height` are pixel resolution; `width_in`/`height_in` are physical inches. For accurate floor pricing we need physical inches — pass `width_in` + `height_in` if you've measured the screen, OR `ppi` so the server can derive inches from the pixel resolution. Pixel-only inputs (no `ppi`, no `*_in`) will NOT be recorded as physical size; they're still used for orientation detection and DSP slot dimensions. */\n display?: {\n /** Display resolution height in pixels (e.g. 1080) */\n height?: number;\n /** Physical screen height in INCHES. Pairs with `width_in`. */\n height_in?: number;\n orientation?: \"landscape\" | \"portrait\";\n /** Pixels per inch. Required if you want physical screen size derived from `width`/`height` (server computes widthInches = width / ppi). Typical: 40 (large TV), 96 (desktop monitor), 264 (tablet). */\n ppi?: number;\n /** Display resolution width in pixels (e.g. 1920) */\n width?: number;\n /** Physical screen width in INCHES. Overrides ppi-based derivation. Use this when you've measured the actual screen (most accurate for pricing). */\n width_in?: number;\n };\n location?: {\n address?: string;\n city?: string;\n country?: string;\n lat?: number;\n lng?: number;\n state?: string;\n timezone?: string;\n venue_name?: string;\n venue_type?: \"mall\" | \"airport\" | \"retail\" | \"restaurant\" | \"office\" | \"gym\" | \"hospital\" | \"school\" | \"other\";\n zip?: string;\n };\n /** Friendly name for the device */\n name?: string;\n /** Photo URL for enrichment context */\n photo_url?: string;\n /** Optional additional photos for enrichment */\n photos?: Array<{\n /** photo type (context, close, angle, other) */\n type?: string;\n url?: string;\n }>;\n /** Physical placement details (optional) */\n placement?: {\n height_from_floor_ft?: number;\n mounting_type?: \"wall\" | \"ceiling\" | \"tabletop\" | \"window\" | \"stand\" | \"freestanding\" | \"other\" | \"unknown\";\n orientation?: \"landscape\" | \"portrait\";\n viewing_distance_ft?: number;\n };\n /** Venue classification details (optional). Subcategory is free text and may be auto-enriched by AI. */\n venue?: {\n business_name?: string;\n category?: \"retail\" | \"restaurant\" | \"bar\" | \"cafe\" | \"hotel\" | \"office\" | \"gym\" | \"hospital\" | \"school\" | \"mall\" | \"airport\" | \"gas_station\" | \"convenience_store\" | \"laundromat\" | \"salon\" | \"auto_shop\" | \"other\";\n context_notes?: string;\n environment_type?: \"indoor\" | \"outdoor\" | \"semi_outdoor\" | \"transit\";\n placement_type?: \"digital_signage\" | \"point_of_sale\" | \"waiting_area\" | \"window_display\" | \"kiosk\" | \"other\";\n /** Free text subcategory (may be auto-enriched by AI) */\n subcategory?: string;\n };\n};\n response: {\n data?: {\n /** Our internal device ID */\n device_id?: string;\n /** Load this URL in your WebView */\n embed_url?: string;\n /** Enrichment completion state */\n enrichment_status?: string;\n /** Your device ID */\n external_device_id?: string;\n /** Device fingerprint for SDK */\n fingerprint?: string;\n /** Linked screen ID */\n screen_id?: string;\n status?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Delete a device\n * DELETE /device/{deviceId}\n */\nexport interface deleteDeviceOperation {\n readonly path: \"/device/{deviceId}\";\n readonly method: \"DELETE\";\n request: never;\n response: {\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get device info\n * GET /device/{deviceId}\n */\nexport interface getDeviceOperation {\n readonly path: \"/device/{deviceId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Device;\n success?: boolean;\n};\n}\n\n/**\n * Update device metadata\n * PATCH /device/{deviceId}\n */\nexport interface updateDeviceOperation {\n readonly path: \"/device/{deviceId}\";\n readonly method: \"PATCH\";\n request: {\n /** Any additional metadata for your records */\n custom_metadata?: Record<string, unknown>;\n /** Screen or venue description */\n description?: string;\n /** Screen display specification. `width`/`height` are pixels; pass `width_in`/`height_in` (inches) or `ppi` to record physical screen size for floor pricing. See POST /device for full unit semantics. */\n display?: {\n /** Display resolution height in pixels */\n height?: number;\n /** Physical screen height in inches (pairs with width_in) */\n height_in?: number;\n orientation?: \"landscape\" | \"portrait\";\n /** Pixels per inch (required to derive physical size from width/height) */\n ppi?: number;\n /** Display resolution width in pixels */\n width?: number;\n /** Physical screen width in inches (overrides ppi-based derivation) */\n width_in?: number;\n };\n /** Partner-owned device ID used for idempotent lookup and reconciliation */\n external_device_id?: string;\n location?: {\n address?: string;\n city?: string;\n country?: string;\n lat?: number;\n lng?: number;\n state?: string;\n timezone?: string;\n zip?: string;\n };\n /** Friendly name for the device */\n name?: string;\n photo_url?: string;\n photos?: Array<{\n type?: string;\n url?: string;\n }>;\n placement?: {\n height_from_floor_ft?: number;\n mounting_type?: \"wall\" | \"ceiling\" | \"tabletop\" | \"window\" | \"stand\" | \"freestanding\" | \"other\" | \"unknown\";\n orientation?: \"landscape\" | \"portrait\";\n viewing_distance_ft?: number;\n };\n venue?: {\n business_name?: string;\n category?: \"retail\" | \"restaurant\" | \"bar\" | \"cafe\" | \"hotel\" | \"office\" | \"gym\" | \"hospital\" | \"school\" | \"mall\" | \"airport\" | \"gas_station\" | \"convenience_store\" | \"laundromat\" | \"salon\" | \"auto_shop\" | \"other\";\n context_notes?: string;\n environment_type?: \"indoor\" | \"outdoor\" | \"semi_outdoor\" | \"transit\";\n placement_type?: \"digital_signage\" | \"point_of_sale\" | \"waiting_area\" | \"window_display\" | \"kiosk\" | \"other\";\n subcategory?: string;\n };\n};\n response: {\n data?: Device;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get ads for device\n * GET /device/{deviceId}/ads\n */\nexport interface getAdsForDeviceOperation {\n readonly path: \"/device/{deviceId}/ads\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n ads?: Array<Ad>;\n cache_until?: string;\n device?: {\n display?: Record<string, unknown>;\n fingerprint?: string;\n };\n header_bidding_settings?: HeaderBiddingSettings;\n screen_dimensions?: {\n height?: number;\n orientation?: \"portrait\" | \"landscape\";\n width?: number;\n };\n screen_id?: string;\n screen_orientation?: \"portrait\" | \"landscape\";\n settings?: AdSettings;\n };\n success?: boolean;\n};\n}\n\n/**\n * Acknowledge a device command\n * POST /device/{deviceId}/commands/{commandId}/ack\n */\nexport interface ackDeviceCommandOperation {\n readonly path: \"/device/{deviceId}/commands/{commandId}/ack\";\n readonly method: \"POST\";\n request: {\n /** Command execution result */\n result?: Record<string, unknown>;\n /** Acknowledgment status */\n status?: string;\n};\n response: {\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Read live device heartbeat state\n * GET /device/{deviceId}/heartbeat\n */\nexport interface getDeviceHeartbeatOperation {\n readonly path: \"/device/{deviceId}/heartbeat\";\n readonly method: \"GET\";\n request: never;\n response: PartnerHeartbeatQueryResponse;\n}\n\n/**\n * Device heartbeat\n * POST /device/{deviceId}/heartbeat\n */\nexport interface heartbeatOperation {\n readonly path: \"/device/{deviceId}/heartbeat\";\n readonly method: \"POST\";\n request: PartnerHeartbeatRequest | PartnerDeviceHeartbeatBody;\n response: PartnerHeartbeatResponse;\n}\n\n/**\n * Record programmatic ad event (Server-side Analytics)\n * POST /device/{deviceId}/programmatic-event\n */\nexport interface recordProgrammaticEventOperation {\n readonly path: \"/device/{deviceId}/programmatic-event\";\n readonly method: \"POST\";\n request: {\n ad_id?: string;\n error_code?: string;\n error_message?: string;\n event: \"ad_started\" | \"ad_ended\" | \"no_fill\" | \"error\";\n reason?: string;\n request_id?: string;\n screen_orientation?: \"portrait\" | \"landscape\";\n slot_height?: number;\n slot_width?: number;\n variant_name?: string;\n};\n response: {\n success?: boolean;\n};\n}\n\n/**\n * List all devices\n * GET /devices\n */\nexport interface listDevicesOperation {\n readonly path: \"/devices\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n devices?: Array<DeviceSummary>;\n limit?: number;\n offset?: number;\n total?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Bulk register devices\n * POST /devices/batch\n */\nexport interface registerDevicesBatchOperation {\n readonly path: \"/devices/batch\";\n readonly method: \"POST\";\n request: {\n /** Default fields applied to each device */\n defaults?: Record<string, unknown>;\n devices: Array<{\n device_id: string;\n device_type?: string;\n display?: Record<string, unknown>;\n location?: Record<string, unknown>;\n name?: string;\n placement?: Record<string, unknown>;\n venue?: Record<string, unknown>;\n }>;\n};\n response: {\n devices?: Array<{\n device_id?: string;\n fingerprint?: string;\n screen_id?: string;\n status?: string;\n trillboard_id?: string;\n }>;\n errors?: Array<{\n device_id?: string;\n error?: string;\n status?: string;\n }>;\n success?: boolean;\n summary?: {\n created?: number;\n failed?: number;\n total?: number;\n updated?: number;\n };\n};\n}\n\n/**\n * Batch update screen orientation\n * POST /devices/batch/orientation\n */\nexport interface batchUpdateDeviceOrientationOperation {\n readonly path: \"/devices/batch/orientation\";\n readonly method: \"POST\";\n request: {\n device_ids: Array<string>;\n screen_orientation: \"portrait\" | \"landscape\" | \"mixed\" | \"unknown\";\n};\n response: {\n matched_devices?: number;\n missing_device_ids?: Array<string>;\n success?: boolean;\n total_devices?: number;\n updated_screens?: number;\n};\n}\n\n/**\n * Get earnings summary\n * GET /earnings\n */\nexport interface getEarningsOperation {\n readonly path: \"/earnings\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: EarningsResponse;\n success?: boolean;\n};\n}\n\n/**\n * Get detailed earnings breakdown\n * GET /earnings/breakdown\n */\nexport interface getEarningsBreakdownOperation {\n readonly path: \"/earnings/breakdown\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: EarningsBreakdownResponse;\n success?: boolean;\n};\n}\n\n/**\n * Request a payout\n * POST /earnings/payout\n */\nexport interface requestPayoutOperation {\n readonly path: \"/earnings/payout\";\n readonly method: \"POST\";\n request: {\n /** Amount to payout in cents (optional, defaults to available balance) */\n amount_cents?: number;\n};\n response: {\n data?: PayoutResponse;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get transaction history\n * GET /earnings/transactions\n */\nexport interface getTransactionsOperation {\n readonly path: \"/earnings/transactions\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n pagination?: Pagination;\n transactions?: Array<Transaction>;\n };\n success?: boolean;\n};\n}\n\n/**\n * List active SSE connections\n * GET /events/connections\n */\nexport interface getActiveSSEConnectionsOperation {\n readonly path: \"/events/connections\";\n readonly method: \"GET\";\n request: never;\n response: {\n connections?: Array<{\n connected_at?: string;\n connection_id?: string;\n ip?: string;\n subscribed_events?: Array<string>;\n }>;\n count?: number;\n max_connections?: number;\n object?: string;\n};\n}\n\n/**\n * Subscribe to real-time events (SSE)\n * GET /events/stream\n */\nexport interface subscribeToEventsOperation {\n readonly path: \"/events/stream\";\n readonly method: \"GET\";\n request: never;\n response: unknown;\n}\n\n/**\n * Get fleet analytics\n * GET /fleet/analytics\n */\nexport interface getFleetAnalyticsOperation {\n readonly path: \"/fleet/analytics\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n /** Average attention score (0-1) */\n avg_attention?: number;\n /** Average CPM in dollars */\n avg_cpm?: number;\n /** Fill rate percentage (0-100) */\n fill_rate_pct?: number;\n impressions_24h?: number;\n screen_count?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Push command to fleet\n * POST /fleet/command\n */\nexport interface pushFleetCommandOperation {\n readonly path: \"/fleet/command\";\n readonly method: \"POST\";\n request: {\n command: {\n /** Command-specific data */\n payload?: Record<string, unknown>;\n type: \"reload\" | \"update_settings\" | \"restart\" | \"screenshot\" | \"clear_cache\" | \"update_content\" | \"refresh_ads\" | \"update_config\" | \"get_state\";\n };\n /** Optional filter to target specific devices */\n filter?: {\n country?: string;\n screenIds?: Array<string>;\n venueType?: string;\n };\n};\n response: {\n data?: {\n errors?: Array<{\n error?: string;\n screenId?: string;\n }>;\n /** Devices successfully queued */\n queued?: number;\n /** Total devices matching filter */\n targeted?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get fleet overview\n * GET /fleet/overview\n */\nexport interface getFleetOverviewOperation {\n readonly path: \"/fleet/overview\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n countries?: Record<string, number>;\n offline?: number;\n online?: number;\n programmatic_enabled?: number;\n total_devices?: number;\n venue_types?: Record<string, number>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Update fleet-wide settings\n * POST /fleet/settings\n */\nexport interface updateFleetSettingsOperation {\n readonly path: \"/fleet/settings\";\n readonly method: \"POST\";\n request: {\n filter?: {\n country?: string;\n screenIds?: Array<string>;\n venueType?: string;\n };\n /** Settings to update (merged with existing) */\n settings: {\n content_preferences?: Record<string, unknown>;\n display_settings?: Record<string, unknown>;\n header_bidding_settings?: {\n allocation?: number;\n enabled?: boolean;\n force_request?: boolean;\n min_interval_seconds?: number;\n };\n };\n};\n response: {\n data?: {\n errors?: Array<Record<string, unknown>>;\n targeted?: number;\n updated?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Record impression (pixel)\n * GET /impression\n */\nexport interface recordImpressionGetOperation {\n readonly path: \"/impression\";\n readonly method: \"GET\";\n request: never;\n response: {\n duplicate?: boolean;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Record impression (POST)\n * POST /impression\n */\nexport interface recordImpressionPostOperation {\n readonly path: \"/impression\";\n readonly method: \"POST\";\n request: {\n adid: string;\n aid?: string;\n completed?: boolean;\n did?: string;\n display_area_ratio?: number;\n display_mode?: \"fullscreen\" | \"l-bar\" | \"pip\";\n duration?: number;\n impid: string;\n lbar_position?: \"bottom\" | \"right\";\n lbar_size?: number;\n lbar_slot_count?: number;\n lbar_slot_index?: number;\n sid?: string;\n sig?: string;\n sig_ts?: number;\n};\n response: {\n duplicate?: boolean;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Batch record impressions\n * POST /impressions/batch\n */\nexport interface recordImpressionsBatchOperation {\n readonly path: \"/impressions/batch\";\n readonly method: \"POST\";\n request: {\n impressions: Array<{\n adid: string;\n aid?: string;\n completed?: boolean;\n device_fingerprint?: string;\n did?: string;\n display_area_ratio?: number;\n display_mode?: \"fullscreen\" | \"l-bar\" | \"pip\";\n duration?: number;\n impid: string;\n lbar_position?: \"bottom\" | \"right\";\n lbar_size?: number;\n lbar_slot_count?: number;\n lbar_slot_index?: number;\n sid?: string;\n sig?: string;\n sig_ts?: number;\n timestamp?: string;\n }>;\n};\n response: {\n data?: {\n errors?: Array<{\n error?: string;\n impid?: string;\n }>;\n failed?: number;\n recorded?: number;\n skipped?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get partner info\n * GET /info\n */\nexport interface getPartnerInfoOperation {\n readonly path: \"/info\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: Partner;\n success?: boolean;\n};\n}\n\n/**\n * List intent categories\n * GET /intent/categories\n */\nexport interface listIntentCategoriesOperation {\n readonly path: \"/intent/categories\";\n readonly method: \"GET\";\n request: never;\n response: {\n count?: number;\n data?: Array<{\n description?: string;\n id?: string;\n /** Minimum intent score to match this category */\n min_intent_score?: number;\n name?: string;\n /** CPM multiplier applied when this intent is detected */\n premium_multiplier?: number;\n purchase_stages?: Array<\"READY_TO_BUY\" | \"COMPARING\" | \"CONSIDERING\" | \"BROWSING\">;\n }>;\n object?: string;\n};\n}\n\n/**\n * Get intent category details\n * GET /intent/categories/{categoryId}\n */\nexport interface getIntentCategoryOperation {\n readonly path: \"/intent/categories/{categoryId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n description?: string;\n iab_segments?: Array<Record<string, unknown>>;\n id?: string;\n min_intent_score?: number;\n name?: string;\n object?: string;\n premium_multiplier?: number;\n purchase_stages?: Array<string>;\n triggers?: Array<string>;\n};\n}\n\n/**\n * Get intent-based pricing for a screen\n * GET /intent/pricing/{screenId}\n */\nexport interface getIntentPricingOperation {\n readonly path: \"/intent/pricing/{screenId}\";\n readonly method: \"GET\";\n request: never;\n response: {\n category_match?: {\n category_id?: string;\n category_name?: string;\n intent_score?: number;\n premium_multiplier?: number;\n purchase_stage?: string;\n } | null;\n current_intent?: {\n categories?: Array<string>;\n purchase_stage?: \"NONE\" | \"BROWSING\" | \"CONSIDERING\" | \"COMPARING\" | \"READY_TO_BUY\";\n /** Intent confidence score (0-1) */\n score?: number;\n /** Whether an ad swap should be triggered */\n should_trigger?: boolean;\n };\n object?: string;\n pricing?: {\n base_cpm?: number;\n category_id?: string;\n category_name?: string;\n /** Effective CPM after intent premium */\n intent_cpm?: number;\n /** Additional CPM from intent detection */\n intent_premium?: number;\n premium_multiplier?: number;\n };\n screen_id?: string;\n};\n}\n\n/**\n * Get network configuration\n * GET /network-config\n */\nexport interface getNetworkConfigOperation {\n readonly path: \"/network-config\";\n readonly method: \"GET\";\n request: never;\n response: {\n network_config?: {\n branding?: Record<string, unknown>;\n default_content_preferences?: Record<string, unknown>;\n default_waterfall?: Record<string, unknown>;\n };\n object?: string;\n parent_partner_id?: string | null;\n};\n}\n\n/**\n * Partial update network configuration\n * PATCH /network-config\n */\nexport interface patchNetworkConfigOperation {\n readonly path: \"/network-config\";\n readonly method: \"PATCH\";\n request: {\n branding?: Record<string, unknown>;\n default_content_preferences?: Record<string, unknown>;\n default_waterfall?: Record<string, unknown>;\n};\n response: {\n network_config?: Record<string, unknown>;\n object?: string;\n parent_partner_id?: string | null;\n};\n}\n\n/**\n * Update network configuration\n * PUT /network-config\n */\nexport interface updateNetworkConfigOperation {\n readonly path: \"/network-config\";\n readonly method: \"PUT\";\n request: {\n /** White-label branding settings */\n branding?: Record<string, unknown>;\n /** Default content preferences for new screens */\n default_content_preferences?: Record<string, unknown>;\n /** Default waterfall/ad serving configuration */\n default_waterfall?: Record<string, unknown>;\n};\n response: {\n network_config?: Record<string, unknown>;\n object?: string;\n parent_partner_id?: string | null;\n};\n}\n\n/**\n * Record ad completion (custom players)\n * POST /openrtb/v1/complete\n */\nexport interface recordAdCompleteOperation {\n readonly path: \"/openrtb/v1/complete\";\n readonly method: \"POST\";\n request: {\n /** Advertisement or creative ID (from VAST response) */\n adId: string;\n /** Device identifier (falls back to request IP if omitted) */\n deviceId?: string;\n /** Ad duration in seconds */\n duration?: number;\n /** Impression ID for correlation with `/impression` call. Auto-generated if omitted. */\n impressionId?: string;\n /** Screen mongo ID */\n screenId: string;\n};\n response: {\n /** The impression ID used (provided or auto-generated) */\n impressionId?: string;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get machine-readable pricing\n * GET /pricing\n */\nexport interface getPricingOperation {\n readonly path: \"/pricing\";\n readonly method: \"GET\";\n request: never;\n response: {\n agent_register_url?: string;\n billing_setup_url?: string;\n /** Volume discount tiers for prepaid credits */\n committed_use?: Record<string, {\n credits_usd?: number;\n discount_pct?: number;\n price_usd?: number;\n }>;\n currency?: string;\n description?: string;\n /** Free tier limits per product and meter */\n free_tiers?: Record<string, unknown>;\n model?: string;\n object?: string;\n /** Pricing details per product */\n products?: {\n attribution?: {\n description?: string;\n meters?: Record<string, {\n first_campaign_free?: boolean;\n per_unit?: string;\n unit_price_usd?: number;\n }>;\n name?: string;\n };\n data_api?: {\n description?: string;\n name?: string;\n notes?: string;\n tiers?: Array<{\n unit_price_usd?: number;\n /** null means unlimited (final tier) */\n up_to?: number | null;\n }>;\n unit?: string;\n };\n data_marketplace?: {\n description?: string;\n meters?: Record<string, {\n free_quota_per_month?: number;\n per_unit?: string;\n unit_price_usd?: number;\n }>;\n name?: string;\n notes?: string;\n revenue_share?: Record<string, unknown>;\n };\n fein_edge_ai?: {\n description?: string;\n name?: string;\n pricing?: string;\n };\n partner_platform?: {\n description?: string;\n name?: string;\n pricing?: string;\n revenue_share?: {\n distributor?: number;\n earner?: number;\n platform?: number;\n };\n };\n programmatic?: {\n description?: string;\n name?: string;\n pricing?: string;\n };\n proof_of_play?: {\n description?: string;\n name?: string;\n notes?: string;\n tiers?: Array<{\n unit_price_usd?: number;\n up_to?: number | null;\n }>;\n unit?: string;\n };\n };\n request_id?: string;\n};\n}\n\n/**\n * Quick start — register partner and first device in one call\n * POST /quick-start\n */\nexport interface quickStartOperation {\n readonly path: \"/quick-start\";\n readonly method: \"POST\";\n request: {\n /** Company or partner name */\n company_name: string;\n /** Display configuration for the first device */\n device_display?: Record<string, unknown>;\n /** Location for the first device */\n device_location?: Record<string, unknown>;\n /** Name for the first device */\n device_name?: string;\n email: string;\n partner_type?: string;\n};\n response: {\n data?: {\n credentials?: {\n /** Store securely — shown only once! */\n api_key?: string;\n api_key_prefix?: string;\n warning?: string;\n };\n device?: {\n device_id?: string;\n embed_url?: string;\n external_device_id?: string;\n fingerprint?: string;\n name?: string;\n screen_id?: string;\n status?: string;\n };\n integration?: {\n api_base?: string;\n docs_url?: string;\n embed_url?: string;\n iframe_snippet?: string;\n sdk_snippet?: string;\n sdk_url?: string;\n };\n next_steps?: Array<string>;\n partner?: {\n name?: string;\n partner_id?: string;\n revenue_share_percent?: number;\n slug?: string;\n status?: string;\n };\n sdk_config?: {\n ad_interval?: number;\n allowed_ad_types?: Array<string>;\n cache_size?: number;\n image_duration?: number;\n max_ads_per_hour?: number;\n sound_enabled?: boolean;\n };\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Register a new partner\n * POST /register\n */\nexport interface registerPartnerOperation {\n readonly path: \"/register\";\n readonly method: \"POST\";\n request: {\n /** Whitelist of allowed referrer domains */\n allowed_domains?: Array<string>;\n contact_email: string;\n contact_name?: string;\n /** Company or partner name */\n name: string;\n partner_type?: \"vending_machine\" | \"kiosk\" | \"digital_signage\" | \"retail_display\" | \"other\";\n /** Partner's revenue share percentage (negotiated per partner) */\n revenue_share_percent?: number;\n /** URL-safe identifier (lowercase, no spaces) */\n slug: string;\n};\n response: {\n data?: {\n /** Store this securely - only shown once! */\n api_key?: string;\n partner_id?: string;\n /** Optional portal onboarding details for the partner owner account */\n portal_access?: {\n claim_complete_endpoint?: string;\n claim_request_endpoint?: string;\n claim_required?: boolean;\n claim_verify_endpoint?: string;\n email?: string;\n message?: string;\n new_account?: boolean;\n portal_auth_url?: string;\n portal_url?: string;\n user_id?: string;\n };\n revenue_share_percent?: number;\n slug?: string;\n status?: \"pending\" | \"active\";\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Generate a test event\n * POST /sandbox/event\n */\nexport interface generateSandboxEventOperation {\n readonly path: \"/sandbox/event\";\n readonly method: \"POST\";\n request: {\n /** Event type to generate */\n event_type: string;\n /** Target sandbox screen (auto-selects first if omitted) */\n screen_id?: string;\n};\n response: {\n /** Event payload (varies by event type) */\n data?: Record<string, unknown>;\n event?: string;\n event_id?: string;\n is_sandbox?: boolean;\n object?: string;\n screen_id?: string | null;\n /** Number of SSE connections that received this event */\n sse_delivered?: number;\n timestamp?: string;\n};\n}\n\n/**\n * Reset sandbox data\n * POST /sandbox/reset\n */\nexport interface resetSandboxOperation {\n readonly path: \"/sandbox/reset\";\n readonly method: \"POST\";\n request: never;\n response: {\n events_cleared?: number;\n object?: string;\n reset_at?: string;\n screens_cleared?: number;\n success?: boolean;\n};\n}\n\n/**\n * Create a sandbox screen\n * POST /sandbox/screen\n */\nexport interface createSandboxScreenOperation {\n readonly path: \"/sandbox/screen\";\n readonly method: \"POST\";\n request: {\n /** Custom screen name */\n name?: string;\n /** Override venue type */\n venue_type?: string;\n};\n response: {\n audience?: {\n avg_dwell_time_sec?: number;\n current_viewers?: number;\n demographics?: Record<string, unknown>;\n };\n created_at?: string;\n device_id?: string;\n display_settings?: Record<string, unknown>;\n fingerprint?: string;\n id?: string;\n is_sandbox?: boolean;\n last_heartbeat?: string;\n location?: {\n city?: string;\n latitude?: number;\n longitude?: number;\n name?: string;\n state?: string;\n venue_type?: string;\n };\n name?: string;\n object?: string;\n partner_id?: string;\n screen_id?: string;\n status?: string;\n};\n}\n\n/**\n * Get sandbox status\n * GET /sandbox/status\n */\nexport interface getSandboxStatusOperation {\n readonly path: \"/sandbox/status\";\n readonly method: \"GET\";\n request: never;\n response: {\n last_activity?: string | null;\n object?: string;\n recent_events?: Array<{\n event?: string;\n event_id?: string;\n timestamp?: string;\n }>;\n sandbox_screens?: Array<{\n created_at?: string;\n id?: string;\n last_heartbeat?: string;\n location?: Record<string, unknown>;\n name?: string;\n status?: string;\n }>;\n total_screens?: number;\n total_test_events?: number;\n};\n}\n\n/**\n * Batch update content preferences\n * POST /screens/batch/content-preferences\n */\nexport interface batchUpdateContentPreferencesOperation {\n readonly path: \"/screens/batch/content-preferences\";\n readonly method: \"POST\";\n request: {\n preferences?: ContentPreferencesInput;\n /** Preset ID to apply (alternative to preferences) */\n preset_id?: string;\n /** Array of screen IDs to update */\n screen_ids: Array<string>;\n};\n response: BatchResult;\n}\n\n/**\n * Batch update display settings\n * POST /screens/batch/display-settings\n */\nexport interface batchUpdateDisplaySettingsOperation {\n readonly path: \"/screens/batch/display-settings\";\n readonly method: \"POST\";\n request: {\n screen_ids: Array<string>;\n settings: DisplaySettingsInput;\n};\n response: BatchResult;\n}\n\n/**\n * Batch update programmatic settings\n * POST /screens/batch/programmatic-settings\n */\nexport interface batchUpdateProgrammaticSettingsOperation {\n readonly path: \"/screens/batch/programmatic-settings\";\n readonly method: \"POST\";\n request: {\n screen_ids: Array<string>;\n settings: ProgrammaticSettingsInput;\n};\n response: BatchResult;\n}\n\n/**\n * Resolve screen ID by device identifier\n * GET /screens/resolve\n */\nexport interface resolvePartnerScreenOperation {\n readonly path: \"/screens/resolve\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n device_id?: string;\n external_device_id?: string;\n fingerprint?: string;\n screen_id?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get per-screen analytics\n * GET /screens/{screenId}/analytics\n */\nexport interface getScreenAnalyticsOperation {\n readonly path: \"/screens/{screenId}/analytics\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: ScreenAnalyticsResponse;\n success?: boolean;\n};\n}\n\n/**\n * Apply content preset to screen\n * POST /screens/{screenId}/apply-preset\n */\nexport interface applyContentPresetOperation {\n readonly path: \"/screens/{screenId}/apply-preset\";\n readonly method: \"POST\";\n request: {\n /** ID of the preset to apply */\n preset_id: string;\n};\n response: ContentPreferencesResponse & {\n preset_applied?: string;\n };\n}\n\n/**\n * Get real-time audience metrics\n * GET /screens/{screenId}/audience-metrics\n */\nexport interface getAudienceMetricsOperation {\n readonly path: \"/screens/{screenId}/audience-metrics\";\n readonly method: \"GET\";\n request: never;\n response: AudienceMetricsResponse;\n}\n\n/**\n * Get screen content preferences\n * GET /screens/{screenId}/content-preferences\n */\nexport interface getContentPreferencesOperation {\n readonly path: \"/screens/{screenId}/content-preferences\";\n readonly method: \"GET\";\n request: never;\n response: ContentPreferencesResponse;\n}\n\n/**\n * Update content preferences (partial)\n * PATCH /screens/{screenId}/content-preferences\n */\nexport interface patchContentPreferencesOperation {\n readonly path: \"/screens/{screenId}/content-preferences\";\n readonly method: \"PATCH\";\n request: ContentPreferencesInput;\n response: ContentPreferencesResponse;\n}\n\n/**\n * Update content preferences (full)\n * PUT /screens/{screenId}/content-preferences\n */\nexport interface updateContentPreferencesOperation {\n readonly path: \"/screens/{screenId}/content-preferences\";\n readonly method: \"PUT\";\n request: ContentPreferencesInput;\n response: ContentPreferencesResponse;\n}\n\n/**\n * List default streams for a screen\n * GET /screens/{screenId}/default-streams\n */\nexport interface listPartnerDefaultStreamsOperation {\n readonly path: \"/screens/{screenId}/default-streams\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n current?: PartnerDefaultStream;\n streams?: Array<PartnerDefaultStream>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Create a default stream (URL-based)\n * POST /screens/{screenId}/default-streams\n */\nexport interface createPartnerDefaultStreamOperation {\n readonly path: \"/screens/{screenId}/default-streams\";\n readonly method: \"POST\";\n request: PartnerDefaultStreamCreate;\n response: {\n data?: PartnerDefaultStream;\n success?: boolean;\n};\n}\n\n/**\n * Upload image carousel default stream\n * POST /screens/{screenId}/default-streams/images\n */\nexport interface createPartnerDefaultStreamImagesOperation {\n readonly path: \"/screens/{screenId}/default-streams/images\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: PartnerDefaultStream;\n success?: boolean;\n};\n}\n\n/**\n * Reorder default streams\n * PUT /screens/{screenId}/default-streams/order\n */\nexport interface reorderPartnerDefaultStreamsOperation {\n readonly path: \"/screens/{screenId}/default-streams/order\";\n readonly method: \"PUT\";\n request: {\n order: Array<string>;\n};\n response: {\n success?: boolean;\n};\n}\n\n/**\n * Upload a video default stream\n * POST /screens/{screenId}/default-streams/upload\n */\nexport interface createPartnerDefaultStreamUploadOperation {\n readonly path: \"/screens/{screenId}/default-streams/upload\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: PartnerDefaultStream;\n success?: boolean;\n};\n}\n\n/**\n * Delete a default stream\n * DELETE /screens/{screenId}/default-streams/{streamId}\n */\nexport interface deletePartnerDefaultStreamOperation {\n readonly path: \"/screens/{screenId}/default-streams/{streamId}\";\n readonly method: \"DELETE\";\n request: never;\n response: {\n success?: boolean;\n};\n}\n\n/**\n * Update a default stream\n * PUT /screens/{screenId}/default-streams/{streamId}\n */\nexport interface updatePartnerDefaultStreamOperation {\n readonly path: \"/screens/{screenId}/default-streams/{streamId}\";\n readonly method: \"PUT\";\n request: PartnerDefaultStreamUpdate;\n response: {\n data?: PartnerDefaultStream;\n success?: boolean;\n};\n}\n\n/**\n * Get screen demographics\n * GET /screens/{screenId}/demographics\n */\nexport interface getScreenDemographicsOperation {\n readonly path: \"/screens/{screenId}/demographics\";\n readonly method: \"GET\";\n request: never;\n response: DemographicsResponse;\n}\n\n/**\n * Get display settings\n * GET /screens/{screenId}/display-settings\n */\nexport interface getDisplaySettingsOperation {\n readonly path: \"/screens/{screenId}/display-settings\";\n readonly method: \"GET\";\n request: never;\n response: DisplaySettingsResponse;\n}\n\n/**\n * Update display settings (partial)\n * PATCH /screens/{screenId}/display-settings\n */\nexport interface patchDisplaySettingsOperation {\n readonly path: \"/screens/{screenId}/display-settings\";\n readonly method: \"PATCH\";\n request: DisplaySettingsInput;\n response: DisplaySettingsResponse;\n}\n\n/**\n * Update display settings (full)\n * PUT /screens/{screenId}/display-settings\n */\nexport interface updateDisplaySettingsOperation {\n readonly path: \"/screens/{screenId}/display-settings\";\n readonly method: \"PUT\";\n request: DisplaySettingsInput;\n response: DisplaySettingsResponse;\n}\n\n/**\n * Get L-Bar settings\n * GET /screens/{screenId}/l-bar\n */\nexport interface getPartnerLBarSettingsOperation {\n readonly path: \"/screens/{screenId}/l-bar\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: PartnerLBarSettings;\n success?: boolean;\n};\n}\n\n/**\n * Update L-Bar settings\n * PUT /screens/{screenId}/l-bar\n */\nexport interface updatePartnerLBarSettingsOperation {\n readonly path: \"/screens/{screenId}/l-bar\";\n readonly method: \"PUT\";\n request: {\n display_preferences?: PartnerLBarDisplayPreferences;\n l_bar_content?: PartnerLBarContent;\n};\n response: {\n data?: PartnerLBarSettings;\n success?: boolean;\n};\n}\n\n/**\n * Update L-Bar live updates\n * PUT /screens/{screenId}/l-bar/live-updates\n */\nexport interface updatePartnerLBarLiveUpdatesOperation {\n readonly path: \"/screens/{screenId}/l-bar/live-updates\";\n readonly method: \"PUT\";\n request: {\n custom_status?: string;\n promotion?: string;\n queue_number?: string;\n wait_time_minutes?: number;\n};\n response: {\n success?: boolean;\n};\n}\n\n/**\n * Get programmatic settings\n * GET /screens/{screenId}/programmatic-settings\n */\nexport interface getProgrammaticSettingsOperation {\n readonly path: \"/screens/{screenId}/programmatic-settings\";\n readonly method: \"GET\";\n request: never;\n response: ProgrammaticSettingsResponse;\n}\n\n/**\n * Update programmatic settings (partial)\n * PATCH /screens/{screenId}/programmatic-settings\n */\nexport interface patchProgrammaticSettingsOperation {\n readonly path: \"/screens/{screenId}/programmatic-settings\";\n readonly method: \"PATCH\";\n request: ProgrammaticSettingsInput;\n response: ProgrammaticSettingsResponse;\n}\n\n/**\n * Update programmatic settings (full)\n * PUT /screens/{screenId}/programmatic-settings\n */\nexport interface updateProgrammaticSettingsOperation {\n readonly path: \"/screens/{screenId}/programmatic-settings\";\n readonly method: \"PUT\";\n request: ProgrammaticSettingsInput;\n response: ProgrammaticSettingsResponse;\n}\n\n/**\n * Create Stripe Connect account\n * POST /stripe/connect\n */\nexport interface createStripeConnectAccountOperation {\n readonly path: \"/stripe/connect\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: {\n account_id?: string;\n charges_enabled?: boolean;\n country?: string;\n default_currency?: string;\n details_submitted?: boolean;\n next_step?: string | null;\n payouts_enabled?: boolean;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get Stripe dashboard login link\n * GET /stripe/login-link\n */\nexport interface getStripeLoginLinkOperation {\n readonly path: \"/stripe/login-link\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n account_id?: string;\n instructions?: string;\n login_url?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get Stripe onboarding link\n * GET /stripe/onboarding-link\n */\nexport interface getStripeOnboardingLinkOperation {\n readonly path: \"/stripe/onboarding-link\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n account_id?: string;\n expires_at?: string;\n instructions?: string;\n onboarding_url?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Request a payout\n * POST /stripe/payout\n */\nexport interface requestStripePayoutOperation {\n readonly path: \"/stripe/payout\";\n readonly method: \"POST\";\n request: {\n /** Payout amount in cents (minimum $5.00) */\n amount_cents: number;\n /** Optional description for the payout */\n description?: string;\n /** Deduplication key to prevent duplicate payouts */\n idempotency_key?: string;\n};\n response: {\n data?: {\n amount_cents?: number;\n created?: string;\n currency?: string;\n description?: string;\n destination?: string;\n /** Estimated arrival (2-3 business days) */\n estimated_arrival?: string;\n status?: \"pending\" | \"reversed\";\n transfer_id?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get payout history\n * GET /stripe/payouts\n */\nexport interface getStripePayoutHistoryOperation {\n readonly path: \"/stripe/payouts\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n has_more?: boolean;\n total?: number;\n transfers?: Array<{\n amount_cents?: number;\n created?: string;\n currency?: string;\n description?: string;\n status?: \"completed\" | \"reversed\";\n transfer_id?: string;\n }>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get Stripe account status\n * GET /stripe/status\n */\nexport interface getStripeAccountStatusOperation {\n readonly path: \"/stripe/status\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n account_id?: string | null;\n charges_enabled?: boolean;\n country?: string;\n default_currency?: string;\n details_submitted?: boolean;\n has_account?: boolean;\n payouts_enabled?: boolean;\n requirements?: {\n currently_due?: Array<string>;\n disabled_reason?: string | null;\n eventually_due?: Array<string>;\n past_due?: Array<string>;\n };\n status?: \"not_connected\" | \"pending\" | \"active\" | \"restricted\";\n };\n success?: boolean;\n};\n}\n\n/**\n * Stripe webhook receiver\n * POST /stripe/webhook\n */\nexport interface handleStripeWebhookOperation {\n readonly path: \"/stripe/webhook\";\n readonly method: \"POST\";\n request: Record<string, unknown>;\n response: {\n event_type?: string;\n received?: boolean;\n};\n}\n\n/**\n * List team members\n * GET /team\n */\nexport interface listTeamMembersOperation {\n readonly path: \"/team\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n members?: Array<TeamMember>;\n partner?: {\n name?: string;\n slug?: string;\n };\n total?: number;\n };\n success?: boolean;\n};\n}\n\n/**\n * Accept team invitation\n * POST /team/accept\n */\nexport interface acceptInvitationOperation {\n readonly path: \"/team/accept\";\n readonly method: \"POST\";\n request: {\n /** Invitation token from email link */\n token: string;\n};\n response: {\n data?: {\n partner?: {\n id?: string;\n name?: string;\n slug?: string;\n };\n permissions?: RolePermissions;\n portal_url?: string;\n role?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Invite a team member\n * POST /team/invite\n */\nexport interface inviteTeamMemberOperation {\n readonly path: \"/team/invite\";\n readonly method: \"POST\";\n request: {\n /** Email address of the invitee */\n email: string;\n /** Optional name of the invitee */\n name?: string;\n /** Role to assign to the team member */\n role?: \"admin\" | \"viewer\";\n};\n response: {\n data?: TeamInviteResponse;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get invitation details\n * GET /team/invite/{token}\n */\nexport interface getInvitationByTokenOperation {\n readonly path: \"/team/invite/{token}\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n email?: string;\n expires_at?: string;\n invited_at?: string;\n partner?: {\n name?: string;\n slug?: string;\n };\n role?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Resend invitation\n * POST /team/{membershipId}/resend\n */\nexport interface resendInvitationOperation {\n readonly path: \"/team/{membershipId}/resend\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: {\n email?: string;\n expires_at?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Remove a team member\n * DELETE /team/{userId}\n */\nexport interface removeTeamMemberOperation {\n readonly path: \"/team/{userId}\";\n readonly method: \"DELETE\";\n request: never;\n response: {\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Change team member role\n * PATCH /team/{userId}/role\n */\nexport interface changeTeamMemberRoleOperation {\n readonly path: \"/team/{userId}/role\";\n readonly method: \"PATCH\";\n request: {\n role: \"admin\" | \"viewer\";\n};\n response: {\n data?: {\n new_role?: string;\n old_role?: string;\n permissions?: RolePermissions;\n user_id?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get public key for proof verification\n * GET /tracking/.well-known/public-key\n */\nexport interface getTrackingPublicKeyOperation {\n readonly path: \"/tracking/.well-known/public-key\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n /** Signature algorithm (ed25519 for public key, sha256 for HMAC fallback) */\n algorithm?: \"ed25519\" | \"sha256\";\n documentation?: string;\n /** Key identifier for rotation support */\n keyId?: string;\n /** Hex-encoded Ed25519 public key (null if using HMAC fallback) */\n publicKey?: string | null;\n verificationUrl?: string;\n version?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Record batch impressions with proof generation\n * POST /tracking/batch\n */\nexport interface recordTrackingBatchOperation {\n readonly path: \"/tracking/batch\";\n readonly method: \"POST\";\n request: {\n impressions: Array<{\n /** Ad identifier from VAST response */\n ad_id: string;\n /** Optional audience metrics */\n audience?: {\n /** Attention score (0-1) */\n attention?: number;\n /** How long viewers were present */\n dwell_time_ms?: number;\n /** Number of viewers detected */\n face_count?: number;\n };\n /** Partner's device identifier */\n device_id: string;\n /** Video duration played in milliseconds */\n duration_ms?: number;\n /** VAST event type */\n event?: \"start\" | \"complete\" | \"error\" | \"firstQuartile\" | \"midpoint\" | \"thirdQuartile\";\n /** Optional client-generated ID (auto-generated if not provided) */\n impression_id?: string;\n /** When the event occurred (defaults to now) */\n timestamp?: string;\n }>;\n};\n response: {\n data?: {\n /** Number of duplicate impressions skipped */\n duplicates?: number;\n /** Details of failed impressions (max 10 shown) */\n errors?: Array<{\n error?: string;\n impression_id?: string;\n }>;\n /** Number of impressions that failed validation */\n failed?: number;\n /** Number of impressions successfully recorded */\n processed?: number;\n /** Time to process the batch */\n processing_time_ms?: number;\n /** Cryptographic proofs for each processed impression */\n proofs?: Array<{\n impression_id?: string;\n public_key_id?: string;\n /** Ed25519 signature (or SHA256 fallback) */\n signature?: string;\n }>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Self-service upgrade from Earner to Partner\n * POST /upgrade-to-partner\n */\nexport interface upgradeToPartnerOperation {\n readonly path: \"/upgrade-to-partner\";\n readonly method: \"POST\";\n request: {\n /** Must be true to accept API terms of service */\n api_agreement_accepted: boolean;\n /** Name of the partner organization */\n partner_name: string;\n /** URL-safe slug for the partner. Auto-generated from partner_name if not provided. Must be lowercase alphanumeric with hyphens. */\n partner_slug?: string;\n /** Type of integration */\n partner_type?: \"vending_machine\" | \"kiosk\" | \"digital_signage\" | \"retail_display\" | \"other\";\n};\n response: {\n /** **IMPORTANT:** This is shown only once! Save it securely. Cannot be retrieved after this response. */\n api_key?: string;\n docs_url?: string;\n message?: string;\n partner?: {\n id?: string;\n name?: string;\n slug?: string;\n };\n portal_url?: string;\n success?: boolean;\n warning?: string;\n};\n}\n\n/**\n * Get API usage summary\n * GET /usage\n */\nexport interface getUsageSummary__get__usageOperation {\n readonly path: \"/usage\";\n readonly method: \"GET\";\n request: never;\n response: {\n /** Average response time in milliseconds */\n avgResponseTime?: number;\n dailyBreakdown?: Array<{\n avg_response_ms?: number;\n date?: string;\n total_calls?: number;\n total_errors?: number;\n }>;\n /** Error rate percentage (0-100) */\n errorRate?: number;\n object?: string;\n period?: {\n end_date?: string;\n start_date?: string;\n };\n topEndpoints?: Array<{\n endpoint?: string;\n method?: string;\n total_calls?: number;\n total_errors?: number;\n }>;\n totalCalls?: number;\n totalErrors?: number;\n};\n}\n\n/**\n * Get real-time usage dashboard\n * GET /usage/dashboard\n */\nexport interface getUsageDashboardOperation {\n readonly path: \"/usage/dashboard\";\n readonly method: \"GET\";\n request: never;\n response: {\n last_7_days?: {\n avg_response_ms?: number;\n daily_breakdown?: Array<{\n avg_response_ms?: number;\n date?: string;\n total_calls?: number;\n total_errors?: number;\n }>;\n error_rate?: number;\n total_calls?: number;\n total_errors?: number;\n };\n object?: string;\n rate_limit?: {\n current_rate?: number;\n max_rate?: number;\n percent_used?: number;\n window_reset?: string;\n window_seconds?: number;\n };\n today?: {\n avg_response_ms?: number;\n error_rate?: number;\n top_endpoints?: Array<{\n avg_response_ms?: number;\n endpoint?: string;\n method?: string;\n total_calls?: number;\n total_errors?: number;\n }>;\n total_calls?: number;\n total_errors?: number;\n };\n};\n}\n\n/**\n * Get rate limit status\n * GET /usage/rate-limit\n */\nexport interface getRateLimitStatusOperation {\n readonly path: \"/usage/rate-limit\";\n readonly method: \"GET\";\n request: never;\n response: {\n current_rate?: number;\n max_rate?: number;\n object?: string;\n percent_used?: number;\n tier?: \"basic\" | \"developer\" | \"enterprise\";\n window_reset?: string;\n window_seconds?: number;\n};\n}\n\n/**\n * Query API changelog\n * GET /v1/changelog\n */\nexport interface queryChangelogOperation {\n readonly path: \"/v1/changelog\";\n readonly method: \"GET\";\n request: never;\n response: ChangelogResponse;\n}\n\n/**\n * Dry-run validate a request body against an operation schema\n * POST /v1/playground/{operation_id}\n */\nexport interface playgroundDryRunOperation {\n readonly path: \"/v1/playground/{operation_id}\";\n readonly method: \"POST\";\n request: never;\n response: PlaygroundResult;\n}\n\n/**\n * Look up metadata for a recent API request\n * GET /v1/requests/{request_id}\n */\nexport interface getRequestMetadataOperation {\n readonly path: \"/v1/requests/{request_id}\";\n readonly method: \"GET\";\n request: never;\n response: RequestMetadataResponse;\n}\n\n/**\n * Get VAST configuration for direct Google integration\n * GET /vast/config\n */\nexport interface getVastConfigOperation {\n readonly path: \"/vast/config\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n /** Google Ad Manager ad unit path */\n ad_unit?: string;\n /** IAB content categories to block */\n blocked_categories?: Array<string>;\n /** How long to cache this config */\n cache_ttl_seconds?: number;\n /** Floor price in cents (CPM) */\n floor_price_cpm?: number;\n integration_guide?: string;\n parameters?: {\n height?: number;\n /** Maximum ad duration in seconds */\n max_duration?: number;\n /** Minimum ad duration in seconds */\n min_duration?: number;\n /** Venue type code for targeting */\n venuetype?: number;\n width?: number;\n };\n /** Recommended VAST fetch timeout */\n timeout_ms?: number;\n tracking?: {\n batch_endpoint?: string;\n max_batch_size?: number;\n single_endpoint?: string;\n };\n /** Configuration variant name for debugging */\n variant?: string;\n /** VAST URL template with placeholders for {width} and {height}. Partner replaces placeholders and appends correlator. */\n vast_tag_template?: string;\n };\n success?: boolean;\n};\n}\n\n/**\n * Get venue intelligence report\n * GET /venues/{venueId}/intelligence\n */\nexport interface getVenueIntelligenceOperation {\n readonly path: \"/venues/{venueId}/intelligence\";\n readonly method: \"GET\";\n request: never;\n response: {\n dedup?: {\n camera_count?: number;\n method?: \"lincoln_petersen\" | \"single_camera\";\n raw_total?: number;\n unique_total?: number;\n };\n from?: string;\n interval?: string;\n summary?: {\n avg_attention?: number;\n buckets?: number;\n total_unique_viewers?: number;\n };\n timeseries?: Array<{\n age_distribution?: Record<string, number>;\n avg_attention?: number;\n avg_engagement?: number;\n avg_noise_level?: number | null;\n brand_mention_windows?: number;\n bucket?: string;\n gender_distribution?: {\n female?: number;\n male?: number;\n };\n income_level?: string | null;\n measurements?: number;\n mood?: string | null;\n peak_viewers?: number;\n raw_viewers?: number;\n screen_count?: number;\n /** Deduplicated viewer count */\n viewers?: number;\n weather?: {\n condition?: string | null;\n is_raining?: boolean;\n temperature_f?: number | null;\n };\n }>;\n to?: string;\n venue_id?: string;\n};\n}\n\n/**\n * List webhooks\n * GET /webhooks\n */\nexport interface listWebhooksOperation {\n readonly path: \"/webhooks\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n webhooks?: Array<Webhook>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Create webhook subscription\n * POST /webhooks\n */\nexport interface createWebhookOperation {\n readonly path: \"/webhooks\";\n readonly method: \"POST\";\n request: {\n /** Events to subscribe to */\n events: Array<\"device.online\" | \"device.offline\" | \"impression.recorded\" | \"campaign.allocated\" | \"payout.processed\" | \"programmatic.ad_started\" | \"programmatic.ad_ended\" | \"programmatic.no_fill\" | \"programmatic.error\">;\n /** Webhook endpoint URL (HTTPS required in production) */\n url: string;\n};\n response: {\n data?: {\n events?: Array<string>;\n /** Webhook signing secret (shown only once!) */\n secret?: string;\n status?: \"active\" | \"inactive\";\n url?: string;\n webhook_id?: string;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Delete webhook\n * DELETE /webhooks/{webhookId}\n */\nexport interface deleteWebhookOperation {\n readonly path: \"/webhooks/{webhookId}\";\n readonly method: \"DELETE\";\n request: never;\n response: {\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Update webhook\n * PATCH /webhooks/{webhookId}\n */\nexport interface updateWebhookOperation {\n readonly path: \"/webhooks/{webhookId}\";\n readonly method: \"PATCH\";\n request: {\n events?: Array<\"device.online\" | \"device.offline\" | \"impression.recorded\" | \"campaign.allocated\" | \"payout.processed\" | \"programmatic.ad_started\" | \"programmatic.ad_ended\" | \"programmatic.no_fill\" | \"programmatic.error\">;\n status?: \"active\" | \"inactive\";\n url?: string;\n};\n response: {\n data?: Webhook;\n message?: string;\n success?: boolean;\n};\n}\n\n/**\n * Get delivery history\n * GET /webhooks/{webhookId}/deliveries\n */\nexport interface getWebhookDeliveriesOperation {\n readonly path: \"/webhooks/{webhookId}/deliveries\";\n readonly method: \"GET\";\n request: never;\n response: {\n data?: {\n deliveries?: Array<WebhookDelivery>;\n };\n success?: boolean;\n};\n}\n\n/**\n * Test webhook\n * POST /webhooks/{webhookId}/test\n */\nexport interface testWebhookOperation {\n readonly path: \"/webhooks/{webhookId}/test\";\n readonly method: \"POST\";\n request: never;\n response: {\n data?: {\n error?: string;\n response_time_ms?: number;\n status?: number;\n };\n message?: string;\n success?: boolean;\n};\n}\n\n\n// ─── Type registry ───────────────────────────────────────────────────────\n\nexport const generatedTypes = {\n schemaCount: 67,\n operationCount: 132,\n 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\"] as const,\n 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\"] as const,\n} as const;\n\nexport type GeneratedSchemaName = (typeof generatedTypes.schemas)[number];\nexport type GeneratedOperationName = (typeof generatedTypes.operations)[number];\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trillboards/api-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Official TypeScript SDK for the Trillboards DOOH Partner API",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
],
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsup",
|
|
27
|
+
"generate": "node scripts/generate.js",
|
|
27
28
|
"test": "jest --runInBand --forceExit",
|
|
28
29
|
"typecheck": "tsc --noEmit",
|
|
29
|
-
"prepublishOnly": "npm run build"
|
|
30
|
+
"prepublishOnly": "npm run generate && npm run build"
|
|
30
31
|
},
|
|
31
32
|
"publishConfig": {
|
|
32
33
|
"access": "public"
|
|
@@ -50,6 +51,10 @@
|
|
|
50
51
|
],
|
|
51
52
|
"author": "Trillboards <engineering@trillboards.com>",
|
|
52
53
|
"license": "MIT",
|
|
54
|
+
"homepage": "https://trillboards.com/support/developers/api-client",
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/trillboards/packages/issues"
|
|
57
|
+
},
|
|
53
58
|
"repository": {
|
|
54
59
|
"type": "git",
|
|
55
60
|
"url": "https://github.com/trillboards/packages.git",
|