Class: TheTradeDeskAds::AdAdvertiser

Inherits:
Base
  • Object
show all
Defined in:
lib/the_trade_desk_ads/ad_advertiser.rb

Overview

An ad advertiser has many ad campaigns, ad images, and ad creatives. developers.facebook.com/docs/marketing-api/reference/ad-account

Constant Summary collapse

FIELDS =
%w[PartnerId AdvertiserId AdvertiserName Description CurrencyCode AttributionClickLookbackWindowInSeconds AttributionImpressionLookbackWindowInSeconds ClickDedupWindowInSeconds ConversionDedupWindowInSeconds DefaultRightMediaOfferTypeId IndustryCategoryId Keywords FacebookAttributes Availability LogoURL DomainAddress].freeze
AVAILABILITIES =
%w[Available Archived]
SORTING_FIELDS =
{"Name": "Name",
"Description": "Description"}

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

auth, delete, #destroy, find, get, paginate, post, #save, #update

Class Method Details

.all(query = {}) ⇒ Object



21
22
23
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 21

def all(query = {})
  get('/me/adaccounts', query: query, objectify: true)
end

.facets(query = {}) ⇒ Object

facets = TheTradeDeskAds::AdAdvertiser.facets



17
18
19
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 17

def facets(query = {})
  get('advertiser/query/facets', query: query, objectify: false)
end

.find_by(conditions) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 25

def find_by(conditions)
  all.detect do |object|
    conditions.all? do |key, value|
      object.send(key) == value
    end
  end
end

Instance Method Details

#ad_audiencesObject

has_many ad_audiences



122
123
124
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 122

def ad_audiences
  AdAudience.paginate("/#{id}/customaudiences")
end

#ad_campaigns(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

has_many campaigns



58
59
60
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 58

def ad_campaigns(effective_status: ['ACTIVE'], limit: 100)
  AdCampaign.paginate("/#{id}/campaigns", query: { effective_status: effective_status, limit: limit })
end

#ad_creatives(limit: 100) ⇒ Object

has_many ad_creatives



100
101
102
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 100

def ad_creatives(limit: 100)
  AdCreative.paginate("/#{id}/adcreatives", query: { limit: limit })
end

#ad_images(hashes: nil, limit: 100) ⇒ Object

has_many ad_images



79
80
81
82
83
84
85
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 79

def ad_images(hashes: nil, limit: 100)
  if !hashes.nil?
    AdImage.get("/#{id}/adimages", query: { hashes: hashes }, objectify: true)
  else
    AdImage.paginate("/#{id}/adimages", query: { limit: limit })
  end
end

#ad_insights(range: Date.today..Date.today, level: 'ad', time_increment: 1) ⇒ Object

has_many ad_insights



128
129
130
131
132
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 128

def ad_insights(range: Date.today..Date.today, level: 'ad', time_increment: 1)
  ad_campaigns.map do |ad_campaign|
    ad_campaign.ad_insights(range: range, level: level, time_increment: time_increment)
  end.flatten
end

#ad_partnerObject

belongs_to partner



36
37
38
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 36

def ad_partner
  AdPartner.find(self.PartnerId)
end

#ad_sets(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

has_many ad_sets



110
111
112
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 110

def ad_sets(effective_status: ['ACTIVE'], limit: 100)
  AdSet.paginate("/#{id}/adsets", query: { effective_status: effective_status, limit: limit })
end

#ads(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

has_many ads



116
117
118
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 116

def ads(effective_status: ['ACTIVE'], limit: 100)
  Ad.paginate("/#{id}/ads", query: { effective_status: effective_status, limit: limit })
end

#applicationsObject

has_many applications



155
156
157
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 155

def applications
  self.class.get("/#{id}/advertisable_applications", objectify: false)
end

#audiences(search_terms: nil, sort_fields: nil, page_start_index: 0, page_size: 10) ⇒ Object

has_many audiences advertiser = TheTradeDeskAds::AdAdvertiser.find(“qckmczk”) advertiser_audiencess = advertiser.audiences



44
45
46
47
48
49
50
51
52
53
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 44

def audiences(search_terms: nil, sort_fields: nil, page_start_index: 0, page_size: 10)
  query = { "AdvertiserId": self.AdvertiserId,
            "SearchTerms": search_terms,
            "SortFields": sort_fields,
            "PageStartIndex": page_start_index,
            "PageSize": page_size
           }
  query.delete_if { |_k, v| v.nil? }
  AdAudience.post('audience/query/advertiser', query: query, objectify: true)
end

#create_ad_audience_with_pixel(name:, pixel_id:, event_name:, subtype: 'WEBSITE', retention_days: 15) ⇒ Object

has_many ad_audiences



161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 161

def create_ad_audience_with_pixel(name:, pixel_id:, event_name:, subtype: 'WEBSITE', retention_days: 15)
  query = {
    name: name,
    pixel_id: pixel_id,
    subtype: subtype,
    retention_days: retention_days,
    rule: { event: { i_contains: event_name } }.to_json,
    prefill: 1
  }

  result = AdAudience.post("/#{id}/customaudiences", query: query)
  AdAudience.find(result['id'])
end

#create_ad_campaign(name:, objective:, status: 'ACTIVE') ⇒ Object

Raises:

  • (Exception)


62
63
64
65
66
67
68
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 62

def create_ad_campaign(name:, objective:, status: 'ACTIVE')
  raise Exception, "Objective must be one of: #{AdCampaign::OBJECTIVES.join(', ')}" unless AdCampaign::OBJECTIVES.include?(objective)
  raise Exception, "Status must be one of: #{AdCampaign::STATUSES.join(', ')}" unless AdCampaign::STATUSES.include?(status)
  query = { name: name, objective: objective, status: status }
  result = AdCampaign.post("/#{id}/campaigns", query: query)
  AdCampaign.find(result['id'])
end

#create_ad_creative(creative, carousel: true) ⇒ Object



104
105
106
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 104

def create_ad_creative(creative, carousel: true)
  carousel ? create_carousel_ad_creative(creative) : create_image_ad_creative(creative)
end

#create_ad_images(urls) ⇒ Object



87
88
89
90
91
92
93
94
95
96
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 87

def create_ad_images(urls)
  files = urls.map do |url|
    name, path = download(url)
    [name, File.open(path)]
  end.to_h

  response = AdImage.post("/#{id}/adimages", query: files)
  files.values.each { |file| File.delete(file.path) }
  !response['images'].nil? ? ad_images(hashes: response['images'].map { |_key, hash| hash['hash'] }) : []
end

#create_dynamic_ad_campaign(name:, product_catalog_id:, status: 'ACTIVE') ⇒ Object

Raises:

  • (Exception)


70
71
72
73
74
75
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 70

def create_dynamic_ad_campaign(name:, product_catalog_id:, status: 'ACTIVE')
  raise Exception, "Status must be one of: #{AdCampaign::STATUSES.join(', ')}" unless AdCampaign::STATUSES.include?(status)
  query = { name: name, objective: 'PRODUCT_CATALOG_SALES', status: status, promoted_object: { product_catalog_id: product_catalog_id } }
  result = AdCampaign.post("/#{id}/campaigns", query: query)
  AdCampaign.find(result['id'])
end

#reach_estimate(targeting:, optimization_goal:, currency: 'USD') ⇒ Object

Raises:

  • (Exception)


134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/the_trade_desk_ads/ad_advertiser.rb', line 134

def reach_estimate(targeting:, optimization_goal:, currency: 'USD')
  raise Exception, "Optimization goal must be one of: #{AdSet::OPTIMIZATION_GOALS.join(', ')}" unless AdSet::OPTIMIZATION_GOALS.include?(optimization_goal)

  if targeting.is_a?(AdTargeting)
    if targeting.validate!
      targeting = targeting.to_hash
    else
      raise Exception, 'The provided targeting spec is not valid.'
    end
  end

  query = {
    targeting_spec: targeting.to_json,
    optimize_for: optimization_goal,
    currency: currency
  }
  self.class.get("/#{id}/reachestimate", query: query, objectify: false)
end