taboola-backstage-sdk 0.1.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/README.md +478 -0
- package/dist/index.cjs +2337 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3454 -0
- package/dist/index.d.ts +3454 -0
- package/dist/index.js +2309 -0
- package/dist/index.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/auth/oauth.ts","../src/utils/http.ts","../src/api/accounts.ts","../src/api/campaigns.ts","../src/api/items.ts","../src/api/dictionary.ts","../src/api/publishers.ts","../src/api/targeting.ts","../src/api/combined-audiences.ts","../src/api/first-party-audiences.ts","../src/api/pixel.ts","../src/api/reports.ts","../src/client.ts"],"names":["ky","HTTPError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Custom error classes for Taboola Backstage SDK\n */\n\n/**\n * Base error class for all Taboola SDK errors\n */\nexport class TaboolaError extends Error {\n /** HTTP status code if applicable */\n readonly statusCode: number | undefined;\n /** Original error response body */\n readonly response: unknown;\n /** Request URL that caused the error */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { cause: options?.cause });\n this.name = 'TaboolaError';\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n this.url = options?.url;\n }\n}\n\n/**\n * Authentication error (401)\n * Thrown when OAuth token is invalid or expired\n */\nexport class TaboolaAuthError extends TaboolaError {\n constructor(\n message = 'Authentication failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 401, ...options });\n this.name = 'TaboolaAuthError';\n }\n}\n\n/**\n * Validation error (400)\n * Thrown when request parameters are invalid\n */\nexport class TaboolaValidationError extends TaboolaError {\n /** Specific field errors if available */\n readonly fieldErrors: Record<string, string[]> | undefined;\n\n constructor(\n message = 'Validation failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n fieldErrors?: Record<string, string[]>;\n }\n ) {\n super(message, { statusCode: 400, ...options });\n this.name = 'TaboolaValidationError';\n this.fieldErrors = options?.fieldErrors;\n }\n}\n\n/**\n * Not found error (404)\n * Thrown when requested resource doesn't exist\n */\nexport class TaboolaNotFoundError extends TaboolaError {\n /** The resource type that wasn't found */\n readonly resourceType: string | undefined;\n /** The resource ID that wasn't found */\n readonly resourceId: string | undefined;\n\n constructor(\n message = 'Resource not found',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n resourceType?: string;\n resourceId?: string;\n }\n ) {\n super(message, { statusCode: 404, ...options });\n this.name = 'TaboolaNotFoundError';\n this.resourceType = options?.resourceType;\n this.resourceId = options?.resourceId;\n }\n}\n\n/**\n * Rate limit error (429)\n * Thrown when API rate limits are exceeded\n */\nexport class TaboolaRateLimitError extends TaboolaError {\n /** Seconds until rate limit resets */\n readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n retryAfter?: number;\n }\n ) {\n super(message, { statusCode: 429, ...options });\n this.name = 'TaboolaRateLimitError';\n this.retryAfter = options?.retryAfter;\n }\n}\n\n/**\n * Forbidden error (403)\n * Thrown when access to resource is denied\n */\nexport class TaboolaForbiddenError extends TaboolaError {\n constructor(\n message = 'Access forbidden',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 403, ...options });\n this.name = 'TaboolaForbiddenError';\n }\n}\n\n/**\n * Server error (5xx)\n * Thrown when Taboola servers encounter an error\n */\nexport class TaboolaServerError extends TaboolaError {\n constructor(\n message = 'Server error',\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: options?.statusCode ?? 500, ...options });\n this.name = 'TaboolaServerError';\n }\n}\n\n/**\n * Parse API error response and throw appropriate error class\n */\nexport function parseApiError(\n statusCode: number,\n response: unknown,\n url: string\n): TaboolaError {\n const message = extractErrorMessage(response);\n\n switch (statusCode) {\n case 400: {\n const fieldErrors = extractFieldErrors(response);\n return new TaboolaValidationError(message, {\n response,\n url,\n ...(fieldErrors !== undefined ? { fieldErrors } : {}),\n });\n }\n case 401:\n return new TaboolaAuthError(message, { response, url });\n case 403:\n return new TaboolaForbiddenError(message, { response, url });\n case 404:\n return new TaboolaNotFoundError(message, { response, url });\n case 429: {\n const retryAfter = extractRetryAfter(response);\n return new TaboolaRateLimitError(message, {\n response,\n url,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n });\n }\n default:\n if (statusCode >= 500) {\n return new TaboolaServerError(message, { statusCode, response, url });\n }\n return new TaboolaError(message, { statusCode, response, url });\n }\n}\n\n/**\n * Extract error message from API response\n */\nfunction extractErrorMessage(response: unknown): string {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.message === 'string') {\n return resp.message;\n }\n if (typeof resp.error === 'string') {\n return resp.error;\n }\n if (typeof resp.error_description === 'string') {\n return resp.error_description;\n }\n }\n return 'Unknown error';\n}\n\n/**\n * Extract field-level validation errors from API response\n */\nfunction extractFieldErrors(response: unknown): Record<string, string[]> | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (resp.errors && typeof resp.errors === 'object') {\n return resp.errors as Record<string, string[]>;\n }\n }\n return undefined;\n}\n\n/**\n * Extract retry-after value from rate limit response\n */\nfunction extractRetryAfter(response: unknown): number | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.retry_after === 'number') {\n return resp.retry_after;\n }\n }\n return undefined;\n}\n","/**\n * OAuth2 authentication module for Taboola Backstage API\n */\n\nimport type { TokenResponse, StoredToken } from '../types/auth.js';\nimport { TaboolaAuthError } from '../errors/index.js';\n\n/** OAuth token endpoint */\nconst TOKEN_URL = 'https://backstage.taboola.com/backstage/oauth/token';\n\n/** Buffer time before token expiry to trigger refresh (5 minutes) */\nconst TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\n/**\n * OAuth2 authentication manager\n * Handles token acquisition and automatic refresh\n */\nexport class OAuthManager {\n private readonly clientId: string;\n private readonly clientSecret: string;\n private storedToken: StoredToken | null = null;\n private tokenPromise: Promise<string> | null = null;\n\n constructor(clientId: string, clientSecret: string) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n }\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n async getAccessToken(): Promise<string> {\n // If we have a valid cached token, return it\n if (this.storedToken && !this.isTokenExpired(this.storedToken)) {\n return this.storedToken.accessToken;\n }\n\n // If a token request is already in progress, wait for it\n if (this.tokenPromise) {\n return this.tokenPromise;\n }\n\n // Fetch a new token\n this.tokenPromise = this.fetchToken();\n\n try {\n const token = await this.tokenPromise;\n return token;\n } finally {\n this.tokenPromise = null;\n }\n }\n\n /**\n * Force refresh the token (e.g., after a 401 response)\n */\n async refreshToken(): Promise<string> {\n this.storedToken = null;\n return this.getAccessToken();\n }\n\n /**\n * Clear the stored token\n */\n clearToken(): void {\n this.storedToken = null;\n this.tokenPromise = null;\n }\n\n /**\n * Check if a token is expired or about to expire\n */\n private isTokenExpired(token: StoredToken): boolean {\n return Date.now() >= token.expiresAt - TOKEN_EXPIRY_BUFFER_MS;\n }\n\n /**\n * Fetch a new token from the OAuth endpoint\n */\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n client_id: this.clientId,\n client_secret: this.clientSecret,\n grant_type: 'client_credentials',\n });\n\n let response: Response;\n try {\n response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new TaboolaAuthError('Failed to connect to authentication server', {\n ...(cause ? { cause } : {}),\n });\n }\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = await response.text();\n }\n\n throw new TaboolaAuthError(\n `Authentication failed: ${String(response.status)} ${response.statusText}`,\n { response: errorBody }\n );\n }\n\n let tokenResponse: TokenResponse;\n try {\n tokenResponse = (await response.json()) as TokenResponse;\n } catch {\n throw new TaboolaAuthError('Invalid token response from server');\n }\n\n if (!tokenResponse.access_token) {\n throw new TaboolaAuthError('No access token in response', {\n response: tokenResponse,\n });\n }\n\n // Store the token with expiry time\n this.storedToken = {\n accessToken: tokenResponse.access_token,\n expiresAt: Date.now() + tokenResponse.expires_in * 1000,\n };\n\n return this.storedToken.accessToken;\n }\n}\n","/**\n * HTTP client wrapper using ky\n */\n\nimport ky, { type KyInstance, type Options as KyOptions, HTTPError } from 'ky';\nimport type { OAuthManager } from '../auth/oauth.js';\nimport { parseApiError, TaboolaAuthError } from '../errors/index.js';\n\n/** Default API base URL */\nexport const DEFAULT_BASE_URL = 'https://backstage.taboola.com/backstage/api/1.0';\n\n/** Default request timeout (30 seconds) */\nconst DEFAULT_TIMEOUT = 30000;\n\n/** Default retry count */\nconst DEFAULT_RETRIES = 3;\n\nexport interface HttpClientOptions {\n baseUrl?: string | undefined;\n timeout?: number | undefined;\n retries?: number | undefined;\n debug?: boolean | undefined;\n}\n\n/**\n * HTTP client for Taboola API requests\n */\nexport class HttpClient {\n private readonly client: KyInstance;\n private readonly authManager: OAuthManager;\n private readonly debug: boolean;\n\n constructor(authManager: OAuthManager, options: HttpClientOptions = {}) {\n this.authManager = authManager;\n this.debug = options.debug ?? false;\n\n this.client = ky.create({\n prefixUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n limit: options.retries ?? DEFAULT_RETRIES,\n methods: ['get', 'post', 'put', 'patch', 'delete'],\n statusCodes: [408, 429, 500, 502, 503, 504],\n backoffLimit: 10000,\n },\n hooks: {\n beforeRequest: [\n async (request: Request) => {\n const token = await this.authManager.getAccessToken();\n request.headers.set('Authorization', `Bearer ${token}`);\n request.headers.set('Accept', 'application/json');\n },\n ],\n afterResponse: [\n async (request, _options, response) => {\n if (this.debug) {\n console.log(`[Taboola SDK] ${request.method} ${String(response.status)} ${request.url}`);\n }\n\n // Handle 401 by refreshing token and retrying once\n if (response.status === 401) {\n try {\n const newToken = await this.authManager.refreshToken();\n request.headers.set('Authorization', `Bearer ${newToken}`);\n return await ky(request);\n } catch {\n throw new TaboolaAuthError('Token refresh failed');\n }\n }\n\n return response;\n },\n ],\n },\n });\n }\n\n /**\n * Make a GET request\n */\n async get<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('get', path, options);\n }\n\n /**\n * Make a POST request\n */\n async post<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('post', path, { ...options, json: body });\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('put', path, { ...options, json: body });\n }\n\n /**\n * Make a PATCH request\n */\n async patch<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('patch', path, { ...options, json: body });\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('delete', path, options);\n }\n\n /**\n * Internal request handler\n */\n private async request<T>(\n method: 'get' | 'post' | 'put' | 'patch' | 'delete',\n path: string,\n options?: KyOptions\n ): Promise<T> {\n try {\n const response = await this.client[method](path, options);\n\n // Handle empty responses (204 No Content, etc.)\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n } catch (error: unknown) {\n if (error instanceof HTTPError) {\n const url = error.request.url;\n let responseBody: unknown;\n\n try {\n responseBody = await error.response.json();\n } catch {\n try {\n responseBody = await error.response.text();\n } catch {\n responseBody = null;\n }\n }\n\n throw parseApiError(error.response.status, responseBody, url);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Account API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Account,\n AdvertiserAccount,\n AllowedAccountsResponse,\n NetworkAdvertisersResponse,\n} from '../types/index.js';\n\n/**\n * Account management API\n */\nexport class AccountsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current account details\n *\n * Returns details of your primary account including the account_id\n * needed for most API operations.\n *\n * @example\n * ```typescript\n * const account = await client.accounts.getCurrent();\n * console.log(account.account_id); // 'my-account-id'\n * ```\n */\n async getCurrent(): Promise<Account> {\n return this.http.get<Account>('users/current/account');\n }\n\n /**\n * Get all allowed accounts for the current user\n *\n * Returns all accounts the current API credentials have access to.\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getAllowed();\n * for (const account of results) {\n * console.log(account.name, account.account_id);\n * }\n * ```\n */\n async getAllowed(): Promise<AllowedAccountsResponse> {\n return this.http.get<AllowedAccountsResponse>('users/current/allowed-accounts');\n }\n\n /**\n * Get advertiser accounts in a network\n *\n * For network accounts, returns all advertiser accounts within the network.\n *\n * @param accountId - Network account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getNetworkAdvertisers('my-network');\n * for (const advertiser of results) {\n * console.log(advertiser.name);\n * }\n * ```\n */\n async getNetworkAdvertisers(accountId: string): Promise<NetworkAdvertisersResponse> {\n return this.http.get<NetworkAdvertisersResponse>(`${accountId}/advertisers`);\n }\n\n /**\n * Get a specific advertiser account\n *\n * @param accountId - Account ID to retrieve\n *\n * @example\n * ```typescript\n * const account = await client.accounts.get('my-account-id');\n * console.log(account.currency);\n * ```\n */\n async get(accountId: string): Promise<AdvertiserAccount> {\n // Use the allowed accounts endpoint and filter\n const allowed = await this.getAllowed();\n const account = allowed.results.find((a) => a.account_id === accountId);\n if (!account) {\n throw new Error(`Account not found: ${accountId}`);\n }\n return account;\n }\n}\n","/**\n * Campaigns API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCampaignUpdateRequest,\n Campaign,\n CampaignListResponse,\n CampaignPatchRequest,\n CampaignReachEstimatorRequest,\n CampaignReachEstimatorResponse,\n CreateCampaignRequest,\n UpdateCampaignRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaigns\n */\nexport interface ListCampaignsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign management API\n */\nexport class CampaignsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all campaigns for an account\n *\n * @param accountId - Account ID\n * @param options - Pagination and filter options\n *\n * @example\n * ```typescript\n * const { results } = await client.campaigns.list('my-account');\n * for (const campaign of results) {\n * console.log(campaign.name, campaign.status);\n * }\n * ```\n */\n async list(accountId: string, options: ListCampaignsOptions = {}): Promise<CampaignListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignListResponse>(path);\n }\n\n /**\n * Get a single campaign by ID\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n *\n * @example\n * ```typescript\n * const campaign = await client.campaigns.get('my-account', '12345');\n * console.log(campaign.name, campaign.cpc);\n * ```\n */\n async get(accountId: string, campaignId: string): Promise<Campaign> {\n return this.http.get<Campaign>(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Create a new campaign\n *\n * @param accountId - Account ID\n * @param campaign - Campaign data\n *\n * @example\n * ```typescript\n * const campaign = await client.campaigns.create('my-account', {\n * name: 'My New Campaign',\n * branding_text: 'My Brand',\n * cpc: 0.50,\n * spending_limit: 1000,\n * spending_limit_model: 'MONTHLY',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * });\n * console.log('Created campaign:', campaign.id);\n * ```\n */\n async create(accountId: string, campaign: CreateCampaignRequest): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/`, campaign);\n }\n\n /**\n * Update an existing campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param updates - Fields to update\n *\n * @example\n * ```typescript\n * const campaign = await client.campaigns.update('my-account', '12345', {\n * cpc: 0.75,\n * daily_cap: 500,\n * });\n * ```\n */\n async update(\n accountId: string,\n campaignId: string,\n updates: UpdateCampaignRequest\n ): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/${campaignId}`, updates);\n }\n\n /**\n * Delete a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n *\n * @example\n * ```typescript\n * await client.campaigns.delete('my-account', '12345');\n * ```\n */\n async delete(accountId: string, campaignId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Duplicate a campaign\n *\n * Creates a copy of an existing campaign with a new name.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID to duplicate\n * @param newName - Name for the new campaign\n *\n * @example\n * ```typescript\n * const newCampaign = await client.campaigns.duplicate(\n * 'my-account',\n * '12345',\n * 'My Campaign - Copy'\n * );\n * ```\n */\n async duplicate(accountId: string, campaignId: string, newName: string): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/${campaignId}/duplicate`, {\n name: newName,\n });\n }\n\n /**\n * Pause a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n *\n * @example\n * ```typescript\n * await client.campaigns.pause('my-account', '12345');\n * ```\n */\n async pause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: false });\n }\n\n /**\n * Unpause (resume) a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n *\n * @example\n * ```typescript\n * await client.campaigns.unpause('my-account', '12345');\n * ```\n */\n async unpause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: true });\n }\n\n /**\n * Bulk update multiple campaigns\n *\n * @param accountId - Account ID\n * @param updates - Array of campaign updates\n *\n * @example\n * ```typescript\n * await client.campaigns.bulkUpdate('my-account', {\n * campaigns: [\n * { campaign_id: '12345', update: { is_active: false } },\n * { campaign_id: '12346', update: { is_active: false } },\n * ],\n * });\n * ```\n */\n async bulkUpdate(\n accountId: string,\n updates: BulkCampaignUpdateRequest\n ): Promise<CampaignListResponse> {\n return this.http.post<CampaignListResponse>(`${accountId}/campaigns/bulk`, updates);\n }\n\n /**\n * Patch a campaign collection (targeting, bid modifiers, etc.)\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param collection - Collection name (e.g., 'publisher_targeting')\n * @param patches - Patch operations\n *\n * @example\n * ```typescript\n * await client.campaigns.patch('my-account', '12345', 'publisher_targeting', [\n * { op: 'ADD', path: '/value', value: ['pub-123'] },\n * ]);\n * ```\n */\n async patch(\n accountId: string,\n campaignId: string,\n collection: string,\n patches: CampaignPatchRequest[]\n ): Promise<Campaign> {\n return this.http.patch<Campaign>(`${accountId}/campaigns/${campaignId}/${collection}`, patches);\n }\n\n /**\n * Get all campaigns across a network\n *\n * @param networkAccountId - Network account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.campaigns.listNetwork('my-network');\n * ```\n */\n async listNetwork(networkAccountId: string): Promise<CampaignListResponse> {\n return this.http.get<CampaignListResponse>(`network/${networkAccountId}/campaigns`);\n }\n\n /**\n * Estimate campaign reach\n *\n * Get estimated impressions, clicks, and reach for a campaign configuration.\n *\n * @param accountId - Account ID\n * @param params - Targeting and budget parameters\n *\n * @example\n * ```typescript\n * const estimate = await client.campaigns.estimateReach('my-account', {\n * country_targeting: ['US'],\n * platform_targeting: ['DESK', 'PHON'],\n * daily_cap: 100,\n * cpc: 0.50,\n * });\n * console.log('Estimated clicks:', estimate.estimated_clicks);\n * ```\n */\n async estimateReach(\n accountId: string,\n params: CampaignReachEstimatorRequest\n ): Promise<CampaignReachEstimatorResponse> {\n return this.http.post<CampaignReachEstimatorResponse>(\n `${accountId}/campaigns/reach-estimate`,\n params\n );\n }\n}\n","/**\n * Campaign Items (Ads) API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCreateItemsRequest,\n BulkCreateItemsResponse,\n BulkDeleteItemsRequest,\n BulkUpdateItemsRequest,\n CampaignItem,\n CampaignItemListResponse,\n CreateItemRequest,\n RSSChildItem,\n RSSChildrenListResponse,\n UpdateItemRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaign items\n */\nexport interface ListItemsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign Items (Ads) management API\n */\nexport class ItemsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all items for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param options - Pagination and filter options\n *\n * @example\n * ```typescript\n * const { results } = await client.items.list('my-account', '12345');\n * for (const item of results) {\n * console.log(item.title, item.status);\n * }\n * ```\n */\n async list(\n accountId: string,\n campaignId: string,\n options: ListItemsOptions = {}\n ): Promise<CampaignItemListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${campaignId}/items/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignItemListResponse>(path);\n }\n\n /**\n * Get a single item by ID\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * const item = await client.items.get('my-account', '12345', '67890');\n * console.log(item.title, item.url);\n * ```\n */\n async get(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.http.get<CampaignItem>(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Create a new item (ad) in a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param item - Item data\n *\n * @example\n * ```typescript\n * const item = await client.items.create('my-account', '12345', {\n * url: 'https://example.com/landing-page',\n * title: 'Check Out Our Amazing Product!',\n * thumbnail_url: 'https://example.com/image.jpg',\n * description: 'Learn more about our product',\n * cta: { cta_type: 'LEARN_MORE' },\n * });\n * console.log('Created item:', item.id);\n * ```\n */\n async create(\n accountId: string,\n campaignId: string,\n item: CreateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(`${accountId}/campaigns/${campaignId}/items/`, item);\n }\n\n /**\n * Update an existing item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n * @param updates - Fields to update\n *\n * @example\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * title: 'Updated Title!',\n * is_active: true,\n * });\n * ```\n */\n async update(\n accountId: string,\n campaignId: string,\n itemId: string,\n updates: UpdateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}`,\n updates\n );\n }\n\n /**\n * Delete an item from a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.delete('my-account', '12345', '67890');\n * ```\n */\n async delete(accountId: string, campaignId: string, itemId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Pause an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.pause('my-account', '12345', '67890');\n * ```\n */\n async pause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: false });\n }\n\n /**\n * Unpause (resume) an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.unpause('my-account', '12345', '67890');\n * ```\n */\n async unpause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: true });\n }\n\n /**\n * Create multiple items at once (mass create)\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param items - Array of items to create\n *\n * @example\n * ```typescript\n * const response = await client.items.bulkCreate('my-account', '12345', {\n * items: [\n * { url: 'https://example.com/page1', title: 'Title 1', thumbnail_url: '...' },\n * { url: 'https://example.com/page2', title: 'Title 2', thumbnail_url: '...' },\n * ],\n * });\n * console.log('Created', response.results.length, 'items');\n * ```\n */\n async bulkCreate(\n accountId: string,\n campaignId: string,\n request: BulkCreateItemsRequest\n ): Promise<BulkCreateItemsResponse> {\n return this.http.post<BulkCreateItemsResponse>(\n `${accountId}/campaigns/${campaignId}/items/mass`,\n request\n );\n }\n\n /**\n * Bulk create items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param items - Array of items with campaign IDs\n *\n * @example\n * ```typescript\n * await client.items.bulkCreateAcrossCampaigns('my-account', [\n * { campaign_id: '12345', url: '...', title: '...' },\n * { campaign_id: '12346', url: '...', title: '...' },\n * ]);\n * ```\n */\n async bulkCreateAcrossCampaigns(\n accountId: string,\n items: (CreateItemRequest & { campaign_id: string })[]\n ): Promise<BulkCreateItemsResponse> {\n return this.http.put<BulkCreateItemsResponse>(`${accountId}/items/bulk`, { items });\n }\n\n /**\n * Bulk update items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk update request\n *\n * @example\n * ```typescript\n * await client.items.bulkUpdate('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345', update: { is_active: false } },\n * { id: '67891', campaign_id: '12346', update: { is_active: false } },\n * ],\n * });\n * ```\n */\n async bulkUpdate(\n accountId: string,\n request: BulkUpdateItemsRequest\n ): Promise<CampaignItemListResponse> {\n return this.http.post<CampaignItemListResponse>(`${accountId}/items/bulk`, request);\n }\n\n /**\n * Bulk delete items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk delete request\n *\n * @example\n * ```typescript\n * await client.items.bulkDelete('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345' },\n * { id: '67891', campaign_id: '12346' },\n * ],\n * });\n * ```\n */\n async bulkDelete(accountId: string, request: BulkDeleteItemsRequest): Promise<void> {\n await this.http.delete(`${accountId}/items/bulk`, {\n json: request,\n });\n }\n\n /**\n * Get children of an RSS item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n *\n * @example\n * ```typescript\n * const { results } = await client.items.listRSSChildren('my-account', '12345', '67890');\n * ```\n */\n async listRSSChildren(\n accountId: string,\n campaignId: string,\n itemId: string\n ): Promise<RSSChildrenListResponse> {\n return this.http.get<RSSChildrenListResponse>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/`\n );\n }\n\n /**\n * Get a specific RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n */\n async getRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string\n ): Promise<RSSChildItem> {\n return this.http.get<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`\n );\n }\n\n /**\n * Update an RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n * @param updates - Fields to update\n */\n async updateRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string,\n updates: UpdateItemRequest\n ): Promise<RSSChildItem> {\n return this.http.post<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`,\n updates\n );\n }\n}\n","/**\n * Dictionary API\n *\n * Reference data and enum values for the Taboola Backstage API.\n * Provides lists of countries, platforms, operating systems, browsers,\n * audience segments, and other reference data needed for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Country,\n Region,\n DMA,\n PostalCode,\n Platform,\n OperatingSystemInfo,\n OSVersion,\n Browser,\n DayOfWeek,\n MinimumCPC,\n MarketplaceAudience,\n LookalikeAudience,\n ContextualSegment,\n DictionaryListResponse,\n CampaignEnums,\n ItemEnums,\n PostalCodeSearchParams,\n ImageLibraryLanguage,\n ImageTaxonomy,\n} from '../types/dictionary.js';\n\n/**\n * Dictionary API for reference data\n */\nexport class DictionaryAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Geographic =====\n\n /**\n * Get list of all supported countries\n */\n async getCountries(): Promise<Country[]> {\n const response = await this.http.get<DictionaryListResponse<Country>>(\n 'resources/countries'\n );\n return response.results;\n }\n\n /**\n * Get regions/states within a country\n *\n * @param countryCode - Country code (e.g., 'US', 'GB')\n */\n async getRegions(countryCode: string): Promise<Region[]> {\n const response = await this.http.get<DictionaryListResponse<Region>>(\n `resources/countries/${countryCode}/regions`\n );\n return response.results;\n }\n\n /**\n * Get DMAs (Designated Market Areas) for a country\n * Note: Only available for US\n *\n * @param countryCode - Country code (typically 'US')\n */\n async getDMAs(countryCode: string): Promise<DMA[]> {\n const response = await this.http.get<DictionaryListResponse<DMA>>(\n `resources/countries/${countryCode}/dma`\n );\n return response.results;\n }\n\n /**\n * Get postal codes for a country\n *\n * @param countryCode - Country code (e.g., 'US', 'GB')\n * @param params - Optional search and pagination parameters\n */\n async getPostalCodes(\n countryCode: string,\n params?: PostalCodeSearchParams\n ): Promise<PostalCode[]> {\n const searchParams = new URLSearchParams();\n if (params?.search) {\n searchParams.set('search', params.search);\n }\n if (params?.page !== undefined) {\n searchParams.set('page', String(params.page));\n }\n if (params?.page_size !== undefined) {\n searchParams.set('page_size', String(params.page_size));\n }\n\n const queryString = searchParams.toString();\n const path = `resources/countries/${countryCode}/postal`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n const response = await this.http.get<DictionaryListResponse<PostalCode>>(url);\n return response.results;\n }\n\n // ===== Device Targeting =====\n\n /**\n * Get list of supported platforms\n */\n async getPlatforms(): Promise<Platform[]> {\n const response = await this.http.get<DictionaryListResponse<Platform>>(\n 'resources/platforms'\n );\n return response.results;\n }\n\n /**\n * Get list of supported operating systems\n */\n async getOperatingSystems(): Promise<OperatingSystemInfo[]> {\n const response = await this.http.get<DictionaryListResponse<OperatingSystemInfo>>(\n 'resources/operating-systems'\n );\n return response.results;\n }\n\n /**\n * Get list of iOS versions for targeting\n */\n async getIOSVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/operating-systems/IOS/versions'\n );\n return response.results;\n }\n\n /**\n * Get list of Android versions for targeting\n */\n async getAndroidVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/operating-systems/ANDROID/versions'\n );\n return response.results;\n }\n\n /**\n * Get list of supported browsers\n */\n async getBrowsers(): Promise<Browser[]> {\n const response = await this.http.get<DictionaryListResponse<Browser>>(\n 'resources/browsers'\n );\n return response.results;\n }\n\n // ===== Enums =====\n\n /**\n * Get campaign property enums (statuses, bid strategies, etc.)\n */\n async getCampaignEnums(): Promise<CampaignEnums> {\n return this.http.get<CampaignEnums>('resources/campaigns-properties/enums');\n }\n\n /**\n * Get item property enums (statuses, types, etc.)\n */\n async getItemEnums(): Promise<ItemEnums> {\n return this.http.get<ItemEnums>('resources/items-properties/enums');\n }\n\n /**\n * Get days of week for activity scheduling\n */\n async getDaysOfWeek(): Promise<DayOfWeek[]> {\n const response = await this.http.get<DictionaryListResponse<DayOfWeek>>(\n 'resources/days-of-week'\n );\n return response.results;\n }\n\n // ===== Possible Values =====\n\n /**\n * Get possible values for campaign category\n */\n async getCampaignCategories(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/campaigns-properties/category/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item status\n */\n async getItemStatuses(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/status/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item CTA (call-to-action)\n */\n async getItemCTAs(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/cta/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get minimum CPC values per country/platform\n */\n async getMinimumCPCs(): Promise<MinimumCPC[]> {\n const response = await this.http.get<DictionaryListResponse<MinimumCPC>>(\n 'resources/minimum-cpc'\n );\n return response.results;\n }\n\n // ===== Image Library =====\n\n /**\n * Get supported languages for image library search\n */\n async getImageLibraryLanguages(): Promise<ImageLibraryLanguage[]> {\n const response = await this.http.get<DictionaryListResponse<ImageLibraryLanguage>>(\n 'resources/image-library/languages'\n );\n return response.results;\n }\n\n /**\n * Get image taxonomies for categorizing images\n *\n * @param accountId - Account ID\n */\n async getImageTaxonomies(accountId: string): Promise<ImageTaxonomy[]> {\n const response = await this.http.get<DictionaryListResponse<ImageTaxonomy>>(\n `${accountId}/images/taxonomies`\n );\n return response.results;\n }\n\n // ===== Audience Targeting =====\n\n /**\n * Get marketplace audience segments available for targeting\n *\n * @param accountId - Account ID\n */\n async getMarketplaceAudiences(accountId: string): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience/segments`\n );\n return response.results;\n }\n\n /**\n * Get marketplace audience segments for a specific country\n *\n * @param accountId - Account ID\n * @param countryCode - Country code (e.g., 'US', 'GB')\n */\n async getMarketplaceAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience/segments/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences available for targeting\n *\n * @param accountId - Account ID\n */\n async getLookalikeAudiences(accountId: string): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike-audiences`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences for a specific country\n *\n * @param accountId - Account ID\n * @param countryCode - Country code (e.g., 'US', 'GB')\n */\n async getLookalikeAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike-audiences/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get contextual segments available for targeting\n *\n * @param accountId - Account ID\n */\n async getContextualSegments(accountId: string): Promise<ContextualSegment[]> {\n const response = await this.http.get<DictionaryListResponse<ContextualSegment>>(\n `${accountId}/dictionary/contextual-segments`\n );\n return response.results;\n }\n}\n","/**\n * Publishers API\n *\n * Manage publisher targeting and blocking for Taboola campaigns.\n * Allows listing available publishers and managing blocked publishers\n * at the account level.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Publisher,\n PublisherListResponse,\n BlockedPublisher,\n BlockedPublishersResponse,\n UpdateBlockedPublishersRequest,\n} from '../types/publisher.js';\n\n/**\n * Publishers API for managing publisher targeting\n */\nexport class PublishersAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available publishers for an account\n *\n * @param accountId - Account ID\n * @returns List of publishers with blocking status\n *\n * @example\n * ```typescript\n * const publishers = await client.publishers.list('my-account');\n * console.log(`Found ${publishers.length} publishers`);\n * ```\n */\n async list(accountId: string): Promise<Publisher[]> {\n const response = await this.http.get<PublisherListResponse>(\n `${accountId}/publishers`\n );\n return response.results;\n }\n\n /**\n * Get blocked publishers at the account level\n *\n * @param accountId - Account ID\n * @returns List of blocked publishers\n *\n * @example\n * ```typescript\n * const blocked = await client.publishers.getBlocked('my-account');\n * console.log(`${blocked.length} publishers blocked at account level`);\n * ```\n */\n async getBlocked(accountId: string): Promise<BlockedPublisher[]> {\n const response = await this.http.get<BlockedPublishersResponse | BlockedPublisher[]>(\n `${accountId}/block-publisher`\n );\n // Handle both array and object response formats\n if (Array.isArray(response)) {\n return response;\n }\n // Defensive fallback for unexpected API responses\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return response.results ?? [];\n }\n\n /**\n * Update blocked publishers at the account level\n *\n * This replaces the current list of blocked publishers with the\n * provided list. To add to existing blocks, first get the current\n * list and append.\n *\n * @param accountId - Account ID\n * @param sites - Array of site names to block\n * @returns Updated list of blocked publishers\n *\n * @example\n * ```typescript\n * // Block specific publishers\n * await client.publishers.updateBlocked('my-account', {\n * sites: ['site1.com', 'site2.com']\n * });\n *\n * // Add to existing blocks\n * const current = await client.publishers.getBlocked('my-account');\n * const currentSites = current.map(p => p.site);\n * await client.publishers.updateBlocked('my-account', {\n * sites: [...currentSites, 'newsite.com']\n * });\n * ```\n */\n async updateBlocked(\n accountId: string,\n request: UpdateBlockedPublishersRequest\n ): Promise<BlockedPublisher[]> {\n const response = await this.http.post<BlockedPublishersResponse>(\n `${accountId}/block-publisher`,\n request\n );\n return response.results;\n }\n\n /**\n * Block a single publisher at the account level\n *\n * Convenience method that adds a publisher to the existing block list.\n *\n * @param accountId - Account ID\n * @param site - Site name to block\n * @returns Updated list of blocked publishers\n */\n async blockPublisher(accountId: string, site: string): Promise<BlockedPublisher[]> {\n const current = await this.getBlocked(accountId);\n const currentSites = current.map((p) => p.site);\n\n if (currentSites.includes(site)) {\n return current; // Already blocked\n }\n\n return this.updateBlocked(accountId, {\n sites: [...currentSites, site],\n });\n }\n\n /**\n * Unblock a single publisher at the account level\n *\n * Convenience method that removes a publisher from the block list.\n *\n * @param accountId - Account ID\n * @param site - Site name to unblock\n * @returns Updated list of blocked publishers\n */\n async unblockPublisher(accountId: string, site: string): Promise<BlockedPublisher[]> {\n const current = await this.getBlocked(accountId);\n const filteredSites = current\n .map((p) => p.site)\n .filter((s) => s !== site);\n\n return this.updateBlocked(accountId, {\n sites: filteredSites,\n });\n }\n\n /**\n * Clear all blocked publishers at the account level\n *\n * @param accountId - Account ID\n * @returns Empty list\n */\n async clearBlocked(accountId: string): Promise<BlockedPublisher[]> {\n return this.updateBlocked(accountId, { sites: [] });\n }\n}\n","/**\n * Targeting API\n *\n * Manage campaign-level targeting including postal codes,\n * audience segments (marketplace, custom, lookalike), and\n * contextual targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n PostalCodeTargeting,\n UpdatePostalCodeTargetingRequest,\n AudienceTargeting,\n UpdateAudienceTargetingRequest,\n ContextualTargeting,\n UpdateContextualTargetingRequest,\n FirstPartyAudienceTargeting,\n UpdateFirstPartyAudienceTargetingRequest,\n} from '../types/targeting.js';\n\n/**\n * Targeting API for campaign-level targeting configuration\n */\nexport class TargetingAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Postal Code Targeting =====\n\n /**\n * Get postal code targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns Postal code targeting configuration\n *\n * @example\n * ```typescript\n * const targeting = await client.targeting.getPostalCodes('my-account', '12345');\n * console.log(`Targeting type: ${targeting.type}`);\n * console.log(`Postal codes: ${targeting.values.length}`);\n * ```\n */\n async getPostalCodes(\n accountId: string,\n campaignId: string\n ): Promise<PostalCodeTargeting> {\n return this.http.get<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`\n );\n }\n\n /**\n * Update postal code targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - Postal code targeting configuration\n * @returns Updated targeting configuration\n *\n * @example\n * ```typescript\n * await client.targeting.updatePostalCodes('my-account', '12345', {\n * type: 'INCLUDE',\n * values: [\n * { postal_code: '10001', country: 'US' },\n * { postal_code: '10002', country: 'US' },\n * ]\n * });\n * ```\n */\n async updatePostalCodes(\n accountId: string,\n campaignId: string,\n targeting: UpdatePostalCodeTargetingRequest\n ): Promise<PostalCodeTargeting> {\n return this.http.post<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`,\n targeting\n );\n }\n\n // ===== Marketplace Audience Targeting =====\n\n /**\n * Get marketplace audience targeting for a campaign\n *\n * Marketplace audiences are third-party audience segments\n * available for targeting through Taboola's marketplace.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns Audience targeting configuration\n */\n async getMarketplaceAudiences(\n accountId: string,\n campaignId: string\n ): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`\n );\n }\n\n /**\n * Update marketplace audience targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - Audience targeting configuration\n * @returns Updated targeting configuration\n *\n * @example\n * ```typescript\n * await client.targeting.updateMarketplaceAudiences('my-account', '12345', {\n * type: 'INCLUDE',\n * collection: [\n * { id: 'segment-1', name: null },\n * { id: 'segment-2', name: null },\n * ]\n * });\n * ```\n */\n async updateMarketplaceAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`,\n targeting\n );\n }\n\n // ===== Custom Audience Targeting =====\n\n /**\n * Get custom audience targeting for a campaign\n *\n * Custom audiences are audiences created from pixel data\n * or uploaded lists.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns Audience targeting configuration\n */\n async getCustomAudiences(\n accountId: string,\n campaignId: string\n ): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`\n );\n }\n\n /**\n * Update custom audience targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - Audience targeting configuration\n * @returns Updated targeting configuration\n */\n async updateCustomAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`,\n targeting\n );\n }\n\n // ===== Lookalike Audience Targeting =====\n\n /**\n * Get lookalike audience targeting for a campaign\n *\n * Lookalike audiences are modeled after your existing\n * custom audiences to find similar users.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns Audience targeting configuration\n */\n async getLookalikeAudiences(\n accountId: string,\n campaignId: string\n ): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`\n );\n }\n\n /**\n * Update lookalike audience targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - Audience targeting configuration\n * @returns Updated targeting configuration\n */\n async updateLookalikeAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`,\n targeting\n );\n }\n\n // ===== Contextual Targeting =====\n\n /**\n * Get contextual targeting for a campaign\n *\n * Contextual targeting allows you to target based on the\n * content of the pages where your ads appear.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns Contextual targeting configuration\n */\n async getContextual(\n accountId: string,\n campaignId: string\n ): Promise<ContextualTargeting> {\n return this.http.get<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`\n );\n }\n\n /**\n * Update contextual targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - Contextual targeting configuration\n * @returns Updated targeting configuration\n *\n * @example\n * ```typescript\n * await client.targeting.updateContextual('my-account', '12345', {\n * type: 'INCLUDE',\n * collection: [\n * { id: 'context-1', name: null },\n * { id: 'context-2', name: null },\n * ]\n * });\n * ```\n */\n async updateContextual(\n accountId: string,\n campaignId: string,\n targeting: UpdateContextualTargetingRequest\n ): Promise<ContextualTargeting> {\n return this.http.post<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`,\n targeting\n );\n }\n\n // ===== First Party Audience Targeting =====\n\n /**\n * Get first party audience targeting for a campaign\n *\n * First party audiences are your own uploaded audience data.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @returns First party audience targeting configuration\n */\n async getFirstPartyAudiences(\n accountId: string,\n campaignId: string\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.get<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`\n );\n }\n\n /**\n * Update first party audience targeting for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param targeting - First party audience targeting configuration\n * @returns Updated targeting configuration\n */\n async updateFirstPartyAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateFirstPartyAudienceTargetingRequest\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.post<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`,\n targeting\n );\n }\n}\n","/**\n * Combined Audiences API\n *\n * Manage combined audiences that combine multiple audience types\n * (custom, lookalike, marketplace, first-party) with AND/OR logic.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n CombinedAudience,\n CombinedAudienceListResponse,\n CreateCombinedAudienceRequest,\n UpdateCombinedAudienceRequest,\n AvailableAudience,\n AvailableAudiencesResponse,\n} from '../types/audience.js';\n\n/**\n * Combined Audiences API for managing combined audiences\n */\nexport class CombinedAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List available audiences for combining\n *\n * Returns all audiences that can be used in combined audience rules,\n * including custom, lookalike, marketplace, and first-party audiences.\n *\n * @param accountId - Account ID\n * @returns List of available audiences\n *\n * @example\n * ```typescript\n * const available = await client.combinedAudiences.listAvailable('my-account');\n * console.log(`${available.length} audiences available for combining`);\n * ```\n */\n async listAvailable(accountId: string): Promise<AvailableAudience[]> {\n const response = await this.http.get<AvailableAudiencesResponse>(\n `${accountId}/combined-audiences/available`\n );\n return response.results;\n }\n\n /**\n * List all combined audiences\n *\n * @param accountId - Account ID\n * @returns List of combined audiences\n *\n * @example\n * ```typescript\n * const audiences = await client.combinedAudiences.list('my-account');\n * for (const audience of audiences) {\n * console.log(`${audience.name}: ${audience.status}`);\n * }\n * ```\n */\n async list(accountId: string): Promise<CombinedAudience[]> {\n const response = await this.http.get<CombinedAudienceListResponse>(\n `${accountId}/combined-audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single combined audience\n *\n * @param accountId - Account ID\n * @param audienceId - Combined audience ID\n * @returns Combined audience details\n */\n async get(accountId: string, audienceId: string): Promise<CombinedAudience> {\n return this.http.get<CombinedAudience>(\n `${accountId}/combined-audiences/${audienceId}`\n );\n }\n\n /**\n * Create a combined audience\n *\n * @param accountId - Account ID\n * @param audience - Combined audience configuration\n * @returns Created combined audience\n *\n * @example\n * ```typescript\n * const audience = await client.combinedAudiences.create('my-account', {\n * name: 'High-Value Engaged Users',\n * description: 'Users who are both high-value and engaged',\n * include_rules: [\n * {\n * audience_type: 'CUSTOM_AUDIENCE',\n * audiences: [{ id: 'custom-1', name: null }]\n * },\n * {\n * audience_type: 'LOOKALIKE_AUDIENCE',\n * audiences: [{ id: 'lookalike-1', name: null }]\n * }\n * ],\n * exclude_rules: [\n * {\n * audience_type: 'CUSTOM_AUDIENCE',\n * audiences: [{ id: 'converters', name: null }]\n * }\n * ]\n * });\n * ```\n */\n async create(\n accountId: string,\n audience: CreateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(\n `${accountId}/combined-audiences`,\n audience\n );\n }\n\n /**\n * Update a combined audience\n *\n * @param accountId - Account ID\n * @param audienceId - Combined audience ID\n * @param updates - Fields to update\n * @returns Updated combined audience\n */\n async update(\n accountId: string,\n audienceId: string,\n updates: UpdateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(\n `${accountId}/combined-audiences/${audienceId}`,\n updates\n );\n }\n}\n","/**\n * First Party Audiences API\n *\n * Manage first party audience onboarding, allowing you to upload\n * your own customer data (email, phone, device IDs) for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n FirstPartyAudience,\n CreateFirstPartyAudienceRequest,\n AddRemoveUsersRequest,\n AddRemoveUsersResponse,\n} from '../types/audience.js';\nimport type { ListResponse } from '../types/common.js';\n\n/**\n * First Party Audiences API for audience onboarding\n */\nexport class FirstPartyAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all first party audiences\n *\n * @param accountId - Account ID\n * @returns List of first party audiences\n *\n * @example\n * ```typescript\n * const audiences = await client.firstPartyAudiences.list('my-account');\n * for (const audience of audiences) {\n * console.log(`${audience.name}: ${audience.status} (${audience.size} users)`);\n * }\n * ```\n */\n async list(accountId: string): Promise<FirstPartyAudience[]> {\n const response = await this.http.get<ListResponse<FirstPartyAudience>>(\n `${accountId}/audience-onboarding/first-party-audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single first party audience\n *\n * @param accountId - Account ID\n * @param audienceId - Audience ID\n * @returns First party audience details\n */\n async get(accountId: string, audienceId: string): Promise<FirstPartyAudience> {\n return this.http.get<FirstPartyAudience>(\n `${accountId}/audience-onboarding/first-party-audiences/${audienceId}`\n );\n }\n\n /**\n * Create a first party audience\n *\n * After creation, use addUsers() to populate the audience with identifiers.\n *\n * @param accountId - Account ID\n * @param audience - Audience configuration\n * @returns Created audience\n *\n * @example\n * ```typescript\n * const audience = await client.firstPartyAudiences.create('my-account', {\n * name: 'High-Value Customers',\n * description: 'Customers with LTV > $1000',\n * source_type: 'CRM',\n * ttl_days: 90\n * });\n *\n * // Then add users\n * await client.firstPartyAudiences.addUsers('my-account', audience.id, {\n * add: [\n * { identifier_type: 'EMAIL_SHA256', identifier_value: 'sha256hash1' },\n * { identifier_type: 'EMAIL_SHA256', identifier_value: 'sha256hash2' },\n * ]\n * });\n * ```\n */\n async create(\n accountId: string,\n audience: CreateFirstPartyAudienceRequest\n ): Promise<FirstPartyAudience> {\n return this.http.post<FirstPartyAudience>(\n `${accountId}/audience-onboarding/first-party-audiences`,\n audience\n );\n }\n\n /**\n * Add or remove users from a first party audience\n *\n * Users are identified by hashed identifiers (email, phone, device ID).\n * It's recommended to use SHA256 hashed values for privacy.\n *\n * @param accountId - Account ID\n * @param audienceId - Audience ID\n * @param request - Add/remove request with user identifiers\n * @returns Operation result with counts\n *\n * @example\n * ```typescript\n * // Add users\n * const result = await client.firstPartyAudiences.addUsers('my-account', 'audience-1', {\n * add: [\n * { identifier_type: 'EMAIL_SHA256', identifier_value: 'sha256hash1' },\n * { identifier_type: 'EMAIL_SHA256', identifier_value: 'sha256hash2' },\n * ]\n * });\n * console.log(`Added ${result.added_count} users`);\n *\n * // Remove users\n * const result2 = await client.firstPartyAudiences.addUsers('my-account', 'audience-1', {\n * remove: [\n * { identifier_type: 'EMAIL_SHA256', identifier_value: 'sha256hash3' },\n * ]\n * });\n * console.log(`Removed ${result2.removed_count} users`);\n * ```\n */\n async addUsers(\n accountId: string,\n audienceId: string,\n request: AddRemoveUsersRequest\n ): Promise<AddRemoveUsersResponse> {\n return this.http.post<AddRemoveUsersResponse>(\n `${accountId}/audience-onboarding/first-party-audiences/${audienceId}/add-remove`,\n request\n );\n }\n\n /**\n * Remove users from a first party audience\n *\n * Convenience method that wraps addUsers with only remove operations.\n *\n * @param accountId - Account ID\n * @param audienceId - Audience ID\n * @param request - Remove request with user identifiers\n * @returns Operation result with counts\n */\n async removeUsers(\n accountId: string,\n audienceId: string,\n request: Pick<AddRemoveUsersRequest, 'remove'>\n ): Promise<AddRemoveUsersResponse> {\n return this.addUsers(accountId, audienceId, request);\n }\n}\n","/**\n * Pixel API\n *\n * Manage Taboola Universal Pixel conversion rules and custom audience rules.\n * Conversion rules track conversions on your site, while custom audience\n * rules build retargeting audiences based on pixel events.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n ConversionRule,\n ConversionRuleListResponse,\n CreateConversionRuleRequest,\n UpdateConversionRuleRequest,\n CustomAudienceRule,\n CustomAudienceRuleListResponse,\n CreateCustomAudienceRuleRequest,\n UpdateCustomAudienceRuleRequest,\n ConversionRuleWithData,\n ConversionRuleWithDataListResponse,\n} from '../types/pixel.js';\n\n/**\n * Pixel API for managing conversion and custom audience rules\n */\nexport class PixelAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Conversion Rules =====\n\n /**\n * List all conversion rules\n *\n * @param accountId - Account ID\n * @returns List of conversion rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listConversionRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.status}`);\n * }\n * ```\n */\n async listConversionRules(accountId: string): Promise<ConversionRule[]> {\n const response = await this.http.get<ConversionRuleListResponse>(\n `${accountId}/universal_pixel/conversion_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Conversion rule details\n */\n async getConversionRule(\n accountId: string,\n ruleId: string\n ): Promise<ConversionRule> {\n return this.http.get<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${ruleId}`\n );\n }\n\n /**\n * List conversion rules with performance data\n *\n * Returns conversion rules with additional data like 30-day conversion\n * counts and values.\n *\n * @param accountId - Account ID\n * @returns List of conversion rules with data\n */\n async listConversionRulesWithData(\n accountId: string\n ): Promise<ConversionRuleWithData[]> {\n const response = await this.http.get<ConversionRuleWithDataListResponse>(\n `${accountId}/universal_pixel/conversion_rule/data`\n );\n return response.results;\n }\n\n /**\n * Create a conversion rule\n *\n * @param accountId - Account ID\n * @param rule - Conversion rule configuration\n * @returns Created conversion rule\n *\n * @example\n * ```typescript\n * // URL-based conversion rule\n * const rule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Purchase Completed',\n * type: 'URL_BASED',\n * category: 'PURCHASE',\n * conditions: [\n * {\n * type: 'URL',\n * operator: 'CONTAINS',\n * value: '/thank-you'\n * }\n * ],\n * effect: {\n * type: 'DYNAMIC_VALUE',\n * value: null,\n * currency: 'USD',\n * value_parameter: 'order_total'\n * },\n * conversion_window_days: 30,\n * view_through_window_days: 1\n * });\n *\n * // Event-based conversion rule\n * const eventRule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Add to Cart',\n * type: 'EVENT_BASED',\n * category: 'ADD_TO_CART',\n * event_name: 'add_to_cart',\n * conditions: [],\n * effect: {\n * type: 'FIXED_VALUE',\n * value: 10,\n * currency: 'USD',\n * value_parameter: null\n * }\n * });\n * ```\n */\n async createConversionRule(\n accountId: string,\n rule: CreateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule`,\n rule\n );\n }\n\n /**\n * Update a conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @param updates - Fields to update\n * @returns Updated conversion rule\n */\n async updateConversionRule(\n accountId: string,\n ruleId: string,\n updates: UpdateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${ruleId}`,\n updates\n );\n }\n\n /**\n * Archive a conversion rule\n *\n * Archived rules stop tracking conversions but remain in the account\n * for historical reporting.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Archived conversion rule\n */\n async archiveConversionRule(\n accountId: string,\n ruleId: string\n ): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n\n /**\n * Unarchive a conversion rule\n *\n * Reactivates an archived conversion rule.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Reactivated conversion rule\n */\n async unarchiveConversionRule(\n accountId: string,\n ruleId: string\n ): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n // ===== Custom Audience Rules =====\n\n /**\n * List all custom audience rules\n *\n * Custom audience rules build retargeting audiences based on pixel\n * events and page visits.\n *\n * @param accountId - Account ID\n * @returns List of custom audience rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listCustomAudienceRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.size} users`);\n * }\n * ```\n */\n async listCustomAudienceRules(accountId: string): Promise<CustomAudienceRule[]> {\n const response = await this.http.get<CustomAudienceRuleListResponse>(\n `${accountId}/universal_pixel/custom_audience_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Custom audience rule details\n */\n async getCustomAudienceRule(\n accountId: string,\n ruleId: string\n ): Promise<CustomAudienceRule> {\n return this.http.get<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`\n );\n }\n\n /**\n * Create a custom audience rule\n *\n * @param accountId - Account ID\n * @param rule - Custom audience rule configuration\n * @returns Created custom audience rule\n *\n * @example\n * ```typescript\n * // All visitors audience\n * const allVisitors = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'All Visitors - 30 Days',\n * conditions: [],\n * ttl_days: 30\n * });\n *\n * // Product page visitors\n * const productViewers = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'Product Page Viewers',\n * conditions: [\n * {\n * type: 'URL',\n * operator: 'CONTAINS',\n * value: '/products/'\n * }\n * ],\n * ttl_days: 14\n * });\n *\n * // Cart abandoners\n * const cartAbandoners = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'Cart Abandoners',\n * conditions: [\n * {\n * type: 'EVENT_NAME',\n * operator: 'EQUALS',\n * value: 'add_to_cart'\n * }\n * ],\n * ttl_days: 7\n * });\n * ```\n */\n async createCustomAudienceRule(\n accountId: string,\n rule: CreateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule`,\n rule\n );\n }\n\n /**\n * Update a custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @param updates - Fields to update\n * @returns Updated custom audience rule\n */\n async updateCustomAudienceRule(\n accountId: string,\n ruleId: string,\n updates: UpdateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`,\n updates\n );\n }\n\n /**\n * Pause a custom audience rule\n *\n * Paused rules stop adding new users but retain existing audience members.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Paused custom audience rule\n */\n async pauseCustomAudienceRule(\n accountId: string,\n ruleId: string\n ): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'PAUSED' });\n }\n\n /**\n * Resume a paused custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Resumed custom audience rule\n */\n async resumeCustomAudienceRule(\n accountId: string,\n ruleId: string\n ): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n /**\n * Archive a custom audience rule\n *\n * Archived rules stop building and the audience becomes inaccessible\n * for targeting.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Archived custom audience rule\n */\n async archiveCustomAudienceRule(\n accountId: string,\n ruleId: string\n ): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n}\n","/**\n * Reports API\n *\n * Access Taboola Backstage reporting data including Campaign Summary,\n * Top Campaign Content, and Realtime reports.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type { ReportDimension } from '../types/common.js';\nimport type {\n CampaignSummaryReport,\n CampaignSummaryReportParams,\n TopCampaignContentReport,\n TopCampaignContentReportParams,\n RealtimeCampaignReport,\n RealtimeAdsReport,\n RealtimeReportParams,\n} from '../types/report.js';\n\n/**\n * Reports API for accessing reporting data\n */\nexport class ReportsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get Campaign Summary Report\n *\n * The Campaign Summary report provides aggregated performance metrics\n * across various dimensions like day, week, month, campaign, site, etc.\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension (day, week, month, campaign, site, etc.)\n * @param params - Report parameters including date range and filters\n * @returns Campaign summary report with metrics\n *\n * @example\n * ```typescript\n * // Daily report for last 30 days\n * const report = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.date}: ${row.clicks} clicks, $${row.spent} spent`);\n * }\n *\n * // Campaign-level report with conversion data\n * const campaignReport = await client.reports.campaignSummary('my-account', 'campaign', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * include_conversions: 'all',\n * });\n *\n * // Filtered by specific campaign\n * const filteredReport = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * campaign: '12345',\n * });\n * ```\n */\n async campaignSummary(\n accountId: string,\n dimension: ReportDimension,\n params: CampaignSummaryReportParams\n ): Promise<CampaignSummaryReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.site) {\n searchParams.set('site', params.site);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n\n return this.http.get<CampaignSummaryReport>(\n `${accountId}/reports/campaign-summary/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Top Campaign Content Report\n *\n * The Top Campaign Content report shows performance metrics for individual\n * items (ads) across campaigns.\n *\n * @param accountId - Account ID\n * @param params - Report parameters including date range and filters\n * @returns Top campaign content report with item metrics\n *\n * @example\n * ```typescript\n * const report = await client.reports.topCampaignContent('my-account', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * limit: 100,\n * });\n *\n * for (const item of report.results) {\n * console.log(`${item.item_name}: ${item.clicks} clicks, CTR: ${item.ctr}%`);\n * }\n * ```\n */\n async topCampaignContent(\n accountId: string,\n params: TopCampaignContentReportParams\n ): Promise<TopCampaignContentReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.limit !== undefined) {\n searchParams.set('limit', String(params.limit));\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n\n return this.http.get<TopCampaignContentReport>(\n `${accountId}/reports/top-campaign-content/dimensions/item_breakdown?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Realtime Campaign Report\n *\n * The Realtime Campaign report shows current day performance metrics\n * for campaigns, updated frequently throughout the day.\n *\n * @param accountId - Account ID\n * @param params - Optional filter parameters\n * @returns Realtime campaign report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeCampaign('my-account');\n * console.log(`Data as of: ${report.timestamp}`);\n *\n * for (const campaign of report.results) {\n * console.log(`${campaign.campaign_name}: ${campaign.clicks} clicks today`);\n * }\n * ```\n */\n async realtimeCampaign(\n accountId: string,\n params?: RealtimeReportParams\n ): Promise<RealtimeCampaignReport> {\n const searchParams = new URLSearchParams();\n\n if (params?.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n\n const queryString = searchParams.toString();\n const path = `${accountId}/reports/realtime/campaign-summary`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n return this.http.get<RealtimeCampaignReport>(url);\n }\n\n /**\n * Get Realtime Ads Report\n *\n * The Realtime Ads report shows current day performance metrics\n * for individual items (ads), updated frequently throughout the day.\n *\n * @param accountId - Account ID\n * @param params - Optional filter parameters\n * @returns Realtime ads report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeAds('my-account');\n * console.log(`Data as of: ${report.timestamp}`);\n *\n * for (const ad of report.results) {\n * console.log(`${ad.item_name}: ${ad.clicks} clicks, ${ad.impressions} impressions`);\n * }\n * ```\n */\n async realtimeAds(\n accountId: string,\n params?: RealtimeReportParams\n ): Promise<RealtimeAdsReport> {\n const searchParams = new URLSearchParams();\n\n if (params?.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n\n const queryString = searchParams.toString();\n const path = `${accountId}/reports/realtime/ads`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n return this.http.get<RealtimeAdsReport>(url);\n }\n}\n","/**\n * Taboola Backstage SDK Client\n *\n * Main entry point for the SDK. Creates and configures all API modules.\n */\n\nimport { OAuthManager } from './auth/oauth.js';\nimport { HttpClient, DEFAULT_BASE_URL } from './utils/http.js';\nimport { AccountsAPI } from './api/accounts.js';\nimport { CampaignsAPI } from './api/campaigns.js';\nimport { ItemsAPI } from './api/items.js';\nimport { DictionaryAPI } from './api/dictionary.js';\nimport { PublishersAPI } from './api/publishers.js';\nimport { TargetingAPI } from './api/targeting.js';\nimport { CombinedAudiencesAPI } from './api/combined-audiences.js';\nimport { FirstPartyAudiencesAPI } from './api/first-party-audiences.js';\nimport { PixelAPI } from './api/pixel.js';\nimport { ReportsAPI } from './api/reports.js';\nimport type { TaboolaConfig } from './types/index.js';\n\n/**\n * Taboola Backstage API Client\n *\n * The main client for interacting with the Taboola Backstage API.\n * Provides access to all API modules through namespaced properties.\n *\n * @example\n * ```typescript\n * import { TaboolaClient } from 'taboola-backstage-sdk';\n *\n * const client = new TaboolaClient({\n * clientId: 'your-client-id',\n * clientSecret: 'your-client-secret',\n * });\n *\n * // Get current account\n * const account = await client.accounts.getCurrent();\n * console.log('Account ID:', account.account_id);\n *\n * // List campaigns\n * const { results: campaigns } = await client.campaigns.list(account.account_id);\n * console.log('Found', campaigns.length, 'campaigns');\n *\n * // Create a new campaign\n * const campaign = await client.campaigns.create(account.account_id, {\n * name: 'My Campaign',\n * branding_text: 'My Brand',\n * cpc: 0.50,\n * spending_limit: 1000,\n * spending_limit_model: 'MONTHLY',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * });\n * ```\n */\nexport class TaboolaClient {\n /**\n * Account management API\n */\n readonly accounts: AccountsAPI;\n\n /**\n * Campaign management API\n */\n readonly campaigns: CampaignsAPI;\n\n /**\n * Campaign items (ads) management API\n */\n readonly items: ItemsAPI;\n\n /**\n * Dictionary/reference data API\n */\n readonly dictionary: DictionaryAPI;\n\n /**\n * Publishers management API\n */\n readonly publishers: PublishersAPI;\n\n /**\n * Campaign targeting API\n */\n readonly targeting: TargetingAPI;\n\n /**\n * Combined audiences API\n */\n readonly combinedAudiences: CombinedAudiencesAPI;\n\n /**\n * First party audiences API\n */\n readonly firstPartyAudiences: FirstPartyAudiencesAPI;\n\n /**\n * Pixel conversion and custom audience rules API\n */\n readonly pixel: PixelAPI;\n\n /**\n * Reports and analytics API\n */\n readonly reports: ReportsAPI;\n\n /**\n * Internal OAuth manager (for advanced use cases)\n */\n private readonly authManager: OAuthManager;\n\n /**\n * Internal HTTP client (for advanced use cases)\n */\n private readonly httpClient: HttpClient;\n\n /**\n * Create a new Taboola client\n *\n * @param config - Client configuration\n */\n constructor(config: TaboolaConfig) {\n if (!config.clientId) {\n throw new Error('clientId is required');\n }\n if (!config.clientSecret) {\n throw new Error('clientSecret is required');\n }\n\n // Initialize authentication\n this.authManager = new OAuthManager(config.clientId, config.clientSecret);\n\n // Initialize HTTP client\n this.httpClient = new HttpClient(this.authManager, {\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout,\n retries: config.retries,\n debug: config.debug,\n });\n\n // Initialize API modules\n this.accounts = new AccountsAPI(this.httpClient);\n this.campaigns = new CampaignsAPI(this.httpClient);\n this.items = new ItemsAPI(this.httpClient);\n this.dictionary = new DictionaryAPI(this.httpClient);\n this.publishers = new PublishersAPI(this.httpClient);\n this.targeting = new TargetingAPI(this.httpClient);\n this.combinedAudiences = new CombinedAudiencesAPI(this.httpClient);\n this.firstPartyAudiences = new FirstPartyAudiencesAPI(this.httpClient);\n this.pixel = new PixelAPI(this.httpClient);\n this.reports = new ReportsAPI(this.httpClient);\n }\n\n /**\n * Get the base URL used for API requests\n */\n get baseUrl(): string {\n return DEFAULT_BASE_URL;\n }\n\n /**\n * Force refresh the access token\n *\n * Useful if you need to ensure a fresh token before a series of operations.\n */\n async refreshToken(): Promise<void> {\n await this.authManager.refreshToken();\n }\n\n /**\n * Clear the cached access token\n *\n * Forces a new token to be fetched on the next request.\n */\n clearToken(): void {\n this.authManager.clearToken();\n }\n}\n\n/**\n * Create a new Taboola client\n *\n * Convenience function for creating a new client instance.\n *\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * import { createClient } from 'taboola-backstage-sdk';\n *\n * const client = createClient({\n * clientId: process.env.TABOOLA_CLIENT_ID!,\n * clientSecret: process.env.TABOOLA_CLIENT_SECRET!,\n * });\n * ```\n */\nexport function createClient(config: TaboolaConfig): TaboolaClient {\n return new TaboolaClient(config);\n}\n"]}
|