UNPKG

@kadam-net/n8n-nodes-kadam

Version:

Kadam node for n8n to manage campaigns, creatives, and more.

1,049 lines 77.3 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Kadam = void 0; const axios_1 = __importDefault(require("axios")); const n8n_workflow_1 = require("n8n-workflow"); const handlers_1 = require("./handlers"); class Kadam { constructor() { this.description = { displayName: 'Kadam', name: 'kadam', icon: 'file:kadam.png', group: ['transform'], version: 1, subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}', description: 'Interact with Kadam API (v1.4.x) for managing campaigns, clients, creatives, and more.', defaults: { name: 'Kadam' }, inputs: [{ type: "main" }], outputs: [{ type: "main" }], credentials: [{ name: 'kadam', required: true }], properties: [ { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Campaign', value: 'campaign', }, { name: 'Creative', value: 'creative', }, { name: 'Stats', value: 'stats', }, { name: 'Targeting', value: 'targeting', }, ], default: 'stats', description: 'Resource to use', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: [ 'stats', ], }, }, options: [ { name: 'Get Campaign Stats', value: 'getCampaignStats', description: 'Retrieve campaign performance statistics', action: 'Get campaign stats', }, { name: 'Get Creative Stats By Campaign IDs', value: 'getCreativeStatsByCampaignIds', description: 'Retrieve creative stats filtered by Campaign IDs', action: 'Get creative stats by campaign IDs', }, { name: 'Get Creative Stats By Creative IDs', value: 'getCreativeStatsByCreativeIds', description: 'Retrieve creative stats filtered by Creative IDs', action: 'Get creative stats by creative IDs', }, { name: 'Get Placement Stats', value: 'getPlacementStats', description: 'Retrieve placement performance statistics', action: 'Get placement stats', }, ], default: 'getCampaignStats', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: [ 'campaign', ], }, }, options: [ { name: 'Create', value: 'createCampaign', description: 'Create a new advertising campaign', action: 'Create a campaign', }, { name: 'Delete', value: 'deleteCampaign', description: 'Delete an existing campaign', action: 'Delete a campaign', }, { name: 'Get', value: 'getCampaigns', description: 'Retrieve a list of campaigns', action: 'Get campaigns', }, { name: 'Get Ad Formats', value: 'getAdFormats', description: 'Retrieve available ad formats', action: 'Get ad formats', }, { name: 'Update Placement Multiplier', value: 'updatePlacementMultiplier', description: 'Modify bid multiplier for specific placement', action: 'Update placement multiplier', }, { name: 'Get Categories', value: 'getCampaignCategories', description: 'Retrieve campaign categories', action: 'Get campaign categories', }, { name: 'Update', value: 'updateCampaign', description: 'Update an existing campaign', action: 'Update a campaign', }, ], default: 'getCampaigns', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: [ 'targeting', ], }, }, options: [ { name: 'Get Browsers', value: 'getBrowsers', description: 'Retrieve available browsers for targeting', action: 'Get browsers', }, { name: 'Get Countries', value: 'getCountries', description: 'Retrieve available countries for targeting', action: 'Get countries', }, { name: 'Get Devices', value: 'getDevices', description: 'Retrieve available device types for targeting', action: 'Get devices', }, { name: 'Get Geo Countries', value: 'getGeoCountries', description: 'Retrieve geo-targeted countries', action: 'Get geo countries', }, { name: 'Get Languages', value: 'getLanguages', description: 'Retrieve available languages for targeting', action: 'Get languages', }, { name: 'Get Platforms', value: 'getPlatforms', description: 'Retrieve available platforms for targeting', action: 'Get platforms', }, { name: 'Get Server Time', value: 'getServerTime', description: 'Retrieve current server time', action: 'Get server time', }, ], default: 'getCountries', }, { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, displayOptions: { show: { resource: [ 'creative', ], }, }, options: [ { name: 'Create', value: 'createCreative', description: 'Create a new ad creative', action: 'Create a creative', }, { name: 'Delete', value: 'deleteCreative', description: 'Delete an existing creative', action: 'Delete a creative', }, { name: 'Get', value: 'getCreatives', description: 'Retrieve a list of creatives', action: 'Get creatives', }, { name: 'Get Banner Sizes', value: 'getBannerSizes', description: 'Retrieve available banner dimensions', action: 'Get banner sizes', }, { name: 'Update', value: 'updateCreative', description: 'Update an existing creative', action: 'Update a creative', }, { name: 'Upload Media', value: 'uploadMedia', description: 'Upload media file for use in creatives', action: 'Upload media', }, ], default: 'getCreatives', }, { displayName: 'Campaigns', name: 'campaigns', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getCampaignsOptions', loadOptionsDependsOn: ['clientId'], }, required: true, description: 'List of campaign IDs to retrieve stats for. Use "Get Campaigns" to retrieve IDs.', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds'] } }, }, { displayName: 'Creatives', name: 'creatives', type: 'string', default: '', required: true, description: 'Comma-separated list of creative IDs (e.g., "789,101"). Use "Get Creatives" to retrieve IDs.', displayOptions: { show: { operation: ['getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Group By', name: 'group', type: 'options', options: [ { name: 'Date', value: 'date', description: 'Group statistics by date' }, { name: 'Campaign', value: 'campaign', description: 'Group statistics by campaign (only for campaign stats)' }, { name: 'Creative', value: 'creative', description: 'Group statistics by creative (only for creative stats)' }, ], default: 'date', required: true, description: 'How to group the statistics data.', displayOptions: { show: { operation: ['getCampaignStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Date From', name: 'dateFrom', type: 'dateTime', default: '={{ $today.minus({ days: 7 }).format("yyyy-MM-dd") }}', required: true, description: 'Start date for statistics (set to 7 days ago by default)', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Date To', name: 'dateTo', type: 'dateTime', default: '={{ $today.format("yyyy-MM-dd") }}', required: true, description: 'End date for statistics (set to today by default)', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Sort', name: 'sort', type: 'string', default: '', description: 'Sort parameters (e.g., "views,-clicks"). Prefix with "-" for descending order.', hint: 'Example: "views,-clicks" (ascending views, descending clicks)', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Campaign ID', name: 'campaignId', type: 'options', default: '', required: true, typeOptions: { loadOptionsMethod: 'getCampaignsOptions' }, description: 'ID of the campaign to update or get codes for. Use "Get Campaigns" to retrieve IDs.', displayOptions: { show: { operation: ['updatePlacementMultiplier', 'createCreative', 'updateCampaign'] } }, }, { displayName: 'Multiplier', name: 'multiplier', type: 'number', typeOptions: { minValue: 0, }, default: 1, required: true, description: 'New multiplier value (e.g., 0.8 or 1.2). The \'x\' prefix will be added automatically.', displayOptions: { show: { operation: ['updatePlacementMultiplier'] } }, }, { displayName: 'Placement ID', name: 'placement', type: 'string', default: '', required: true, description: 'ID of the placement to update the multiplier for.', displayOptions: { show: { operation: ['updatePlacementMultiplier'] } }, }, { displayName: 'Campaign Name', name: 'campaignName', type: 'string', required: true, default: '', description: 'The name of the new campaign', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, }, }, { displayName: 'Ad Format', name: 'adFormatId', type: 'options', required: true, typeOptions: { loadOptionsMethod: 'getAdFormats', }, default: '', description: 'Select the ad format for the campaign', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, hide: { operation: ['updateCampaign'], } }, }, { displayName: 'Price Model', name: 'priceModel', type: 'options', required: true, default: 'cpc', options: [ { name: 'CPC (Cost Per Click)', value: 'cpc' }, { name: 'CPM (Cost Per Mille)', value: 'cpm' }, ], description: 'The pricing model for the campaign.', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, hide: { operation: ['updateCampaign'], } }, }, { displayName: 'Target URL', name: 'targetUrl', type: 'string', required: true, default: '', placeholder: 'https://example.com/landing?param=value', description: 'The destination URL for the ads', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, }, }, { displayName: 'Status', name: 'status', type: 'options', options: [ { name: '(No Change / Default)', value: '' }, { name: 'Active', value: 1 }, { name: 'Paused', value: 0 }, ], default: '', required: false, description: 'Set the status of the campaign (Active/Paused). Optional.', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, }, }, { displayName: 'Country Targeting', name: 'countryTargetCollection', type: 'fixedCollection', typeOptions: { multipleValues: true, }, default: {}, placeholder: 'Add Country Target', required: true, displayOptions: { show: { operation: ['createCampaign'], resource: ['campaign'], }, }, options: [ { name: 'countryTargetValues', displayName: 'Country Target', values: [ { displayName: 'Country', name: 'countryId', type: 'options', typeOptions: { loadOptionsMethod: 'getCountries', }, default: '', description: 'The country to target', required: true, }, { displayName: 'Bid', name: 'bid', type: 'number', typeOptions: { minValue: 0.0001, numberPrecision: 4, }, default: 0.0001, description: 'The bid amount for this country', required: true, }, ], }, ], description: 'Target specific countries with bids', }, { displayName: 'Categories', name: 'categories', type: 'multiOptions', required: true, typeOptions: { loadOptionsMethod: 'getCampaignCategoriesOptions', }, default: [], description: 'Select relevant categories for the campaign (required)', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, }, }, { displayName: 'Additional Options', name: 'additionalOptions', type: 'collection', placeholder: 'Add Campaign Option', default: {}, description: 'Specify additional campaign settings like limits, targeting, etc.', displayOptions: { show: { resource: ['campaign'], operation: ['createCampaign'], }, }, options: [ { displayName: 'Daily Budget Limit', name: 'dayLimit', type: 'number', typeOptions: { numberSubtype: 'float', minValue: 0 }, default: 0, description: 'Maximum daily spend (0 for unlimited)', }, { displayName: 'Total Budget Limit', name: 'allLimit', type: 'number', typeOptions: { numberSubtype: 'float', minValue: 0 }, default: 0, description: 'Maximum total spend for the campaign (0 for unlimited)', }, { displayName: 'Total Clicks Limit', name: 'clickLimit', type: 'number', typeOptions: { minValue: 0 }, default: 0, description: 'Total clicks limit for the campaign (0 for unlimited)', }, { displayName: 'Languages', name: 'langTarget', type: 'multiOptions', typeOptions: { loadOptionsMethod: 'getLanguages', }, default: [], description: 'Target specific browser languages', }, { displayName: 'Devices', name: 'deviceTarget', type: 'multiOptions', typeOptions: { loadOptionsMethod: 'getDevices', }, default: [], description: 'Target specific device types', }, ], }, { displayName: 'Additional Options', name: 'additionalOptions', type: 'collection', placeholder: 'Add Option', default: {}, description: 'Specify additional optional parameters to update', displayOptions: { show: { resource: ['campaign'], operation: ['updateCampaign'], }, }, options: [ { displayName: 'Status', name: 'status', type: 'options', options: [ { name: '(No Change / Default)', value: '' }, { name: 'Active', value: 1 }, { name: 'Paused', value: 0 }, ], default: '', required: false, description: 'Set the status of the campaign (Active/Paused). Optional.', }, { displayName: 'Categories', name: 'categories', type: 'multiOptions', description: 'Select campaign categories', typeOptions: { loadOptionsMethod: 'getCampaignCategoriesOptions', }, default: [], }, { displayName: 'Real URL', name: 'realUrl', type: 'string', default: '', description: 'Link to the real domain of the advertised object in format: http://yoursite.com', }, { displayName: 'Budget Limit Day', name: 'dayLimit', type: 'number', typeOptions: { minValue: 0, numberPrecision: 2 }, default: '', description: 'Maximum daily budget in rubles (0 for unlimited)', }, { displayName: 'Budget Limit Total', name: 'allLimit', type: 'number', typeOptions: { minValue: 0, numberPrecision: 2 }, default: '', description: 'Total budget for the campaign in rubles (0 for unlimited)', }, { displayName: 'Click Limit', name: 'clickLimit', type: 'number', typeOptions: { minValue: 0 }, default: '', description: 'Maximum number of clicks for the campaign', }, { displayName: 'Conversion Limit', name: 'conversionLimit', type: 'number', typeOptions: { minValue: 0 }, default: '', description: 'Maximum number of conversions for the campaign', }, { displayName: 'Campaign Name', name: 'name', type: 'string', default: '', description: 'New name for the campaign (optional)', }, { displayName: 'Price Model', name: 'priceModel', type: 'options', description: 'Select the price model (CPC or CPM) (optional, change may not be possible)', options: [ { name: 'CPC (Cost Per Click)', value: 'cpc' }, { name: 'CPM (Cost Per Mille)', value: 'cpm' }, ], default: '', }, { displayName: 'Target URL', name: 'targetUrl', type: 'string', default: '', description: 'New target URL for the campaign (optional)', }, { displayName: 'Country Targeting', name: 'countryTargetCollection', type: 'fixedCollection', typeOptions: { multipleValues: true, }, default: {}, placeholder: 'Add Country Target', description: 'Target specific countries with bids', options: [ { name: 'countryTargetValues', displayName: 'Country Target', values: [ { displayName: 'Country', name: 'countryId', type: 'options', typeOptions: { loadOptionsMethod: 'getCountries', }, default: '', description: 'The country to target', required: true, }, { displayName: 'Bid', name: 'bid', type: 'number', typeOptions: { minValue: 0.0001, numberPrecision: 4, }, default: 0.0001, description: 'The bid amount for this country', required: true, }, ], }, ], }, { displayName: 'Device Target', name: 'deviceTarget', type: 'string', default: '', placeholder: '1,2,3', description: 'Comma-separated list of device IDs to target', }, { displayName: 'Language Target', name: 'langTarget', type: 'string', default: '', placeholder: '1,2,3', description: 'Comma-separated list of language IDs to target', }, { displayName: 'Platforms', name: 'platforms', type: 'string', default: '', placeholder: '1,2,4,16', description: 'Comma-separated list of platform IDs to target', }, { displayName: 'Browsers', name: 'browsers', type: 'string', default: '', placeholder: '1,2,4,16,32,128', description: 'Comma-separated list of browser IDs to target', }, { displayName: 'Black List Sites', name: 'blackList', type: 'string', default: '', placeholder: '1001,1002,1003', description: 'Comma-separated list of site IDs to exclude from ad display', }, { displayName: 'White List Sites', name: 'whiteList', type: 'string', default: '', placeholder: '2001,2002,2003', description: 'Comma-separated list of site IDs to include for ad display', }, { displayName: 'Black List IPs', name: 'blackListIp', type: 'string', default: '', placeholder: '192.168.1.1,192.168.1.2', description: 'Comma-separated list of IP addresses to block', }, { displayName: 'Languages', name: 'languages', type: 'multiOptions', description: 'Target specific languages', typeOptions: { loadOptionsMethod: 'getLanguagesOptions', }, default: [], }, { displayName: 'Devices', name: 'devices', type: 'multiOptions', description: 'Target specific device types', typeOptions: { loadOptionsMethod: 'getDevicesOptions', }, default: [], }, ], }, { displayName: 'IDs', name: 'ids', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getCampaignsOptions' }, description: 'List of campaign IDs to delete. Use "Get Campaigns" to retrieve IDs.', displayOptions: { show: { operation: ['deleteCampaign'] } }, }, { displayName: 'IDs', name: 'ids', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getClients' }, description: 'List of client IDs to delete. Use "Get Clients" to retrieve IDs.', displayOptions: { show: { operation: ['deleteClient'] } }, }, { displayName: 'Creative IDs', name: 'ids', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getCreativesOptions' }, description: 'Select the creatives to delete. Multiple IDs can be selected.', displayOptions: { show: { operation: ['deleteCreative'] } }, }, { displayName: 'Include Additional Data', name: 'includeDataOptions', type: 'multiOptions', options: [ { name: 'Include Archived Campaigns', value: 'includeArchive' }, { name: 'With Black/White Lists', value: 'withBwlist' }, { name: 'With Creatives (Ads)', value: 'withCreatives' }, ], default: [], description: 'Select additional data types to include in the campaign results.', displayOptions: { show: { resource: ['campaign'], operation: ['getCampaigns'] } }, }, { displayName: 'Campaign IDs', name: 'campaignIds', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getCampaignsOptions' }, description: 'List of campaign IDs to filter by. Use "Get Campaigns" to retrieve IDs.', displayOptions: { show: { operation: ['getCampaigns', 'getCreatives'] } }, }, { displayName: 'Ad Format', name: 'adFormat', type: 'options', default: '', required: true, typeOptions: { loadOptionsMethod: 'getAdFormats' }, description: 'Ad format ID (e.g., 10 for Teaser). Use "Get Ad Formats" to retrieve options.', displayOptions: { show: { operation: ['getCampaignCategories', 'getCreatives', 'uploadMedia'] } }, }, { displayName: 'Category ID', name: 'categoryId', type: 'string', default: '', description: 'Optional category ID to filter categories.', displayOptions: { show: { operation: ['getCampaignCategories'] } }, }, { displayName: 'Client IDs', name: 'clientIds', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getClients' }, description: 'List of client IDs to filter by. Use "Get Clients" to retrieve IDs.', displayOptions: { show: { operation: ['getClients'] } }, }, { displayName: 'Email', name: 'email', type: 'string', default: '', required: true, description: 'Email address of the client to bind.', displayOptions: { show: { operation: ['bindClient'] } }, }, { displayName: 'Password', name: 'password', type: 'string', default: '', required: true, description: 'Password of the client to bind.', displayOptions: { show: { operation: ['bindClient'] } }, }, { displayName: 'Sum', name: 'sum', type: 'number', default: 0, required: true, description: 'Amount in USD to deposit or transfer.', displayOptions: { show: { operation: ['depositClientBalance', 'transferFunds'] } }, }, { displayName: 'Payment System ID', name: 'systemId', type: 'options', default: '', required: true, typeOptions: { loadOptionsMethod: 'getPaymentSystems' }, description: 'ID of the payment system to use for deposit. Use "Get Payment Systems" to retrieve options.', displayOptions: { show: { operation: ['depositClientBalance'] } }, }, { displayName: 'Back URL', name: 'backUrl', type: 'string', default: '', description: 'URL to redirect the client to after payment.', displayOptions: { show: { operation: ['depositClientBalance'] } }, }, { displayName: 'Comment', name: 'comment', type: 'string', default: '', description: 'Optional comment for the funds transfer.', displayOptions: { show: { operation: ['transferFunds'] } }, }, { displayName: 'Creative IDs', name: 'creativeIds', type: 'multiOptions', default: [], typeOptions: { loadOptionsMethod: 'getCreativesOptions', loadOptionsDependsOn: ['adFormat'] }, description: 'Select specific creatives to retrieve. Leave empty to get all creatives.', displayOptions: { show: { operation: ['getCreatives'] } }, }, { displayName: 'Binary Property', name: 'file', type: 'string', default: 'data', required: true, description: 'Name of the binary property containing the file to upload. Connect an upstream node that produces file data.', displayOptions: { show: { operation: ['uploadMedia'] } }, }, { displayName: 'Country ID', name: 'countryId', type: 'options', default: '', required: true, typeOptions: { loadOptionsMethod: 'getCountries' }, description: 'ID of the country to filter regions by. Use "Get Countries" to retrieve options.', displayOptions: { show: { operation: ['getRegions', 'getGeoRegions'] } }, }, { displayName: 'Retry on Failure', name: 'retryOnFailure', type: 'boolean', default: false, description: 'Retry the request up to 3 times on temporary failures (e.g., rate limits or network issues).', }, { displayName: 'Return All', name: 'returnAll', type: 'boolean', default: false, description: 'Return all results by automatically paginating through the data (ignores limit/offset).', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds', 'getCampaigns', 'getClients', 'getCreatives'] } }, }, { displayName: 'Limit', name: 'limit', type: 'number', default: 100, description: 'Maximum number of items to return per request (used if "Return All" is false).', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds', 'getCampaigns', 'getClients', 'getCreatives'], returnAll: [false] } }, }, { displayName: 'Offset', name: 'offset', type: 'number', default: 0, description: 'Number of items to skip before starting to return results (used if "Return All" is false).', displayOptions: { show: { operation: ['getCampaignStats', 'getPlacementStats', 'getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds', 'getCampaigns', 'getClients', 'getCreatives'], returnAll: [false] } }, }, { displayName: 'Output Fields', name: 'outputFields', type: 'string', default: '', placeholder: 'id,name,status,link_url', description: 'Optional. Comma-separated list of fields to include in the output. If empty, all fields are returned.', displayOptions: { show: { resource: ['campaign'], operation: ['getCampaigns'] } }, }, { displayName: 'Output Fields', name: 'outputFields', type: 'string', default: '', placeholder: 'id,name,cost,impressions,ctr', description: 'Optional. Comma-separated list of fields to include in the output. Use dot notation for nested fields (e.g., stats.impressions). If empty, all fields are returned.', displayOptions: { show: { resource: ['stats'], operation: ['getCampaignStats'] } }, }, { displayName: 'Output Fields', name: 'outputFields', type: 'string', default: '', placeholder: 'placement,impressions,clicks,ctr', description: 'Optional. Comma-separated list of fields to include in the output. Use dot notation for nested fields (e.g., stats.impressions). If empty, all fields are returned.', displayOptions: { show: { resource: ['stats'], operation: ['getPlacementStats'] } }, }, { displayName: 'Output Fields', name: 'outputFields', type: 'string', default: '', placeholder: 'creative_id,impressions,clicks,ctr', description: 'Optional. Comma-separated list of fields to include in the output. Use dot notation for nested fields (e.g., stats.impressions). If empty, all fields are returned.', displayOptions: { show: { resource: ['stats'], operation: ['getCreativeStatsByCampaignIds', 'getCreativeStatsByCreativeIds'] } }, }, { displayName: 'Title', name: 'title', type: 'string', default: '', required: true, description: 'Title of the creative (headline)', displayOptions: { show: { operation: ['createCreative'] } }, }, { displayName: 'Ad Format', name: 'adFormat', type: 'options', default: '', required: true, typeOptions: { loadOptionsMethod: 'getAdFormats' }, description: 'Format of the ad creative', displayOptions: { show: { operation: ['createCreative'] } }, }, { displayName: 'Text', name: 'text', type: 'string', default: '', description: 'Description text for the creative (required for push notifications, not used for teasers)', displayOptions: { show: { operation: ['createCreative'] } }, }, { displayName: 'Target URL', name: 'linkUrl', type: 'string', default: '', required: true, description: 'URL of the advertised object, e.g., http: