Class: TheTradeDeskAds::AdAccount

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

Overview

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

Constant Summary collapse

FIELDS =
%w[id account_id account_status age created_time currency name].freeze

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



8
9
10
# File 'lib/the_trade_desk_ads/ad_account.rb', line 8

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

.find_by(conditions) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/the_trade_desk_ads/ad_account.rb', line 12

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



87
88
89
# File 'lib/the_trade_desk_ads/ad_account.rb', line 87

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

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

has_many campaigns



23
24
25
# File 'lib/the_trade_desk_ads/ad_account.rb', line 23

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



65
66
67
# File 'lib/the_trade_desk_ads/ad_account.rb', line 65

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

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

has_many ad_images



44
45
46
47
48
49
50
# File 'lib/the_trade_desk_ads/ad_account.rb', line 44

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



93
94
95
96
97
# File 'lib/the_trade_desk_ads/ad_account.rb', line 93

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_sets(effective_status: ['ACTIVE'], limit: 100) ⇒ Object

has_many ad_sets



75
76
77
# File 'lib/the_trade_desk_ads/ad_account.rb', line 75

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



81
82
83
# File 'lib/the_trade_desk_ads/ad_account.rb', line 81

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

#applicationsObject

has_many applications



120
121
122
# File 'lib/the_trade_desk_ads/ad_account.rb', line 120

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

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

hash_many ad_audiences



126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/the_trade_desk_ads/ad_account.rb', line 126

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)


27
28
29
30
31
32
33
# File 'lib/the_trade_desk_ads/ad_account.rb', line 27

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



69
70
71
# File 'lib/the_trade_desk_ads/ad_account.rb', line 69

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

#create_ad_images(urls) ⇒ Object



52
53
54
55
56
57
58
59
60
61
# File 'lib/the_trade_desk_ads/ad_account.rb', line 52

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)


35
36
37
38
39
40
# File 'lib/the_trade_desk_ads/ad_account.rb', line 35

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)


99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/the_trade_desk_ads/ad_account.rb', line 99

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