A Ruby client for Bing Ads API that includes a proxy to all Bing Ads API web services and abstracts low level details of authentication with OAuth.
Add this line to your application's Gemfile:
gem 'bing-ads'
And then execute:
$ bundle
Or install it yourself as:
$ gem install bing-ads
# Authentication token is not supported in sandbox, use `username` and `password` instead
# https://msdn.microsoft.com/en-us/library/dn277356.aspx
options = {
environment: :sandbox,
authentication_token: '39b290146bea6ce975c37cfc23',
developer_token: 'BBD37VB98',
customer_id: '21027149',
# client_settings: { logger: LOGGER::STDOUT }
}
service = Bing::Ads::API::V11::Services::CustomerManagement.new(options)
response = service.get_accounts_info
# Authentication token is not supported in sandbox, use `username` and `password` instead
# https://msdn.microsoft.com/en-us/library/dn277356.aspx
options = {
environment: :sandbox,
authentication_token: '39b290146bea6ce975c37cfc23',
developer_token: 'BBD37VB98',
customer_id: '21027149',
account_id: '5278183',
# client_settings: { logger: LOGGER::STDOUT }
}
service = Bing::Ads::API::V11::Services::CampaignManagement.new(options)
account_id = 5278183
response = service.get_campaigns_by_account_id(account_id)
account_id = 5278183
campaign_ids = [813721838, 813721849, 813721850]
response = service.get_campaigns_by_ids(account_id, campaign_ids)
account_id = 5278183
campaigns = [
{
budget_type: Bing::Ads::API::V11.constants.campaign_management.budget_limit_type.daily_budget_standard,
daily_budget: 2000,
description: 'Amsterdam-based global campaign',
name: '51 - Global - Chain - Mixed - N -en- Amsterdam - 100 - 26479',
status: Bing::Ads::API::V11.constants.campaign_management.campaign_status.paused,
time_zone: Bing::Ads::API::V11.constants.time_zones.amsterdam_berlin_bern_rome_stockholm_vienna
},
# ...
]
response = service.add_campaigns(account_id, campaigns)
account_id = 5278183
campaigns = [
{
id: 813721838,
budget_type: Bing::Ads::API::V11.constants.campaign_management.budget_limit_type.daily_budget_standard,
},
{
id: 813721849,
budget_type: Bing::Ads::API::V11.constants.campaign_management.budget_limit_type.daily_budget_standard,
},
# ...
]
response = service.update_campaigns(account_id, campaigns)
account_id = 5278183
campaign_ids_to_delete = [813721838, 813721813, 813721911]
response = service.delete_campaigns(account_id, campaign_ids_to_delete)
campaign_id = 813721838
response = service.get_ad_groups_by_campaign_id(campaign_id)
campaign_id = 813721838
ad_group_ids = [9866221838, 9866221813, 9866221911]
response = service.get_ad_groups_by_ids(campaign_id, ad_group_ids)
# You can add a maximum of 1,000 ad groups in a single call.
# Each campaign can have up to 20,000 ad groups.
campaign_id = 813721838
ad_groups = [
{
ad_distribution: Bing::Ads::API::V11.constants.campaign_management.ad_distribution.search, # required
ad_rotation: Bing::Ads::API::V11.constants.campaign_management.ad_rotation.optimize_for_clicks, # optional
bidding_scheme: Bing::Ads::API::V11.constants.campaign_management.bidding_scheme.inherit_from_parent, # optional
content_match_bid: 100, # optional
end_date: '31/12/2020',
status: Bing::Ads::API::V11.constants.campaign_management.ad_group_status.paused,
language: Bing::Ads::API::V11.constants.languages.english,
name: 'H=WHotelAmsterdam&AG=1723812002',
native_bid_adjustment: -50, # optional (-100 to 900)
remarketing_targeting_setting: Bing::Ads::API::V11.constants.campaign_management.remarketing_target_setting.bid_only, # optional
search_bid: 100, # optional
start_date: '5/7/2017',
},
# ...
# https://msdn.microsoft.com/en-us/library/bing-ads-campaign-management-adgroup.aspx
]
response = service.add_ad_groups(campaign_id, ad_groups)
# You can add a maximum of 1,000 ad groups in a single call.
# Each campaign can have up to 20,000 ad groups.
campaign_id = 813721838
ad_groups = [
{
id: 9866221838,
status: Bing::Ads::API::V11.constants.campaign_management.ad_group_status.active
},
# ...
]
response = service.update_ad_groups(campaign_id, ad_groups)
campaign_id = 813721838
ad_group_ids_to_delete = [9866221838, 9866221839, 9866221840]
response = service.delete_ad_groups(campaign_id, ad_group_ids_to_delete)
ad_group_id = 9866221838
response = service.get_ads_by_ad_group_id(ad_group_id)
ad_group_id = 9866221838
ad_ids = [454873284248, 454873284249, 454873284250]
response = service.get_ads_by_ids(ad_group_id, ad_ids)
# You can add a maximum of 50 ads in an ad group.
ad_group_id = 9866221838
expanded_text_ads = [
{
type: Bing::Ads::API::V11.constants.campaign_management.ad_types.expanded_text_ad, # ExpandedTextAd
path_1: 'Amsterdam',
path_2: 'Hotels',
text: 'Compare over 150 booking sites! Find guaranteed low hotel rates.',
title_part_1: 'Hotels in Amsterdam',
title_part_2: 'Best Deals. Book now',
final_urls: [
'http://www.findhotel.net/Places/Amsterdam.htm'
]
},
# ...
# Expanded text ads
# https://msdn.microsoft.com/en-us/library/bing-ads-campaign-management-expandedtextad.aspx
# For other ad types:
# https://msdn.microsoft.com/en-us/library/bing-ads-campaign-management-ad.aspx
]
# Returns IDs of ads added to ad group
# { ad_ids: [], partial_errors: [] }
response = service.add_ads(ad_group_id, expanded_text_ads)
ad_group_id = 9866221838
updated_expanded_text_ads = [
{
id: 454873284248,
final_urls: [
'https://www.findhotel.net/Places/Amsterdam.htm'
]
},
# ...
]
response = service.update_ads(ad_group_id, updated_expanded_text_ads)
ad_group_id = 9866221838
ad_ids_to_delete = [454873284248, 454873284249, 454873284250]
response = service.delete_ads(ad_group_id, ad_ids_to_delete)
ad_group_id = 9866221838
response = service.get_keywords_by_ad_group_id(ad_group_id)
ad_group_id = 9866221838
keyword_ids = [234873284248, 234873284249, 234873284250]
response = service.get_keywords_by_ids(ad_group_id, keyword_ids)
ad_group_id = 9866221838
keywords = [
{
bidding_scheme: Bing::Ads::API::V11.constants.campaign_management.bidding_scheme.inherit_from_parent,
bid: 5,
# optional, ad final urls used if this is not set
final_urls: [
'https://www.findhotel.net/Places/Amsterdam.htm?attrs=pet-friendly'
],
match_type: Bing::Ads::API::V11.constants.campaign_management.match_types.exact, # also broad, content, phrase
status: Bing::Ads::API::V11.constants.campaign_management.keyword_statuses.active,
text: 'Pet-friendly Hotels in Amsterdam'
},
# ...
# https://msdn.microsoft.com/en-us/library/bing-ads-campaign-management-keyword.aspx
# https://msdn.microsoft.com/en-us/library/bing-ads-campaign-management-addkeywords.aspx
]
# Returns IDs of keywords added to ad group
# { keyword_ids: [], partial_errors: [] }
response = service.add_keywords(ad_group_id, keywords)
ad_group_id = 9866221838
updated_keywords = [
{
id: 234873284248,
# updated attributes
},
# ...
]
response = service.update_keywords(ad_group_id, updated_keywords)
ad_group_id = 9866221838
keyword_ids_to_delete = [234873284248, 234873284249, 234873284250]
response = service.delete_keywords(ad_group_id, keyword_ids_to_delete)
# Authentication token is not supported in sandbox, use `username` and `password` instead
# https://msdn.microsoft.com/en-us/library/dn277356.aspx
options = {
environment: :sandbox,
authentication_token: '39b290146bea6ce975c37cfc23',
developer_token: 'BBD37VB98',
customer_id: '21027149',
account_id: '5278183',
# client_settings: { logger: LOGGER::STDOUT }
}
service = Bing::Ads::API::V11::Services::Bulk.new(options)
response = service.get_bulk_upload_url
# @return
# {
# request_id: 4981237213
# upload_url: '-'
# }
response = service.get_bulk_upload_status(request_id)
# @return
# {
# errors: [],
# percent_complete: 100,
# request_status: '-',
# result_file_url: '-'
# }
# Authentication token is not supported in sandbox, use `username` and `password` instead
# https://msdn.microsoft.com/en-us/library/dn277356.aspx
options = {
environment: :sandbox,
authentication_token: '39b290146bea6ce975c37cfc23',
developer_token: 'BBD37VB98',
customer_id: '21027149',
# client_settings: { logger: LOGGER::STDOUT }
}
service = Bing::Ads::API::V11::Services::Reporting.new(options)
To get reports from Bing, you must first submit a report generation request.
The method submit_generate_report
receive two params as input, first the report_type
and then a hash with the report options.
Example:
response = service.submit_generate_report(:keyword_performance, {
exclude_column_headers: false,
exclude_report_footer: false,
exclude_report_header: false,
language: 'English',
format: 'Tsv',
report_name: 'keyword_performance_report',
return_only_complete_data: false,
aggregation: 'Daily',
columns: [:destination_url, :average_cpc],
from_date: '2017-10-23',
to_date: '2017-10-25'
account_ids: [144012349, 224002158]
})
The required options depend on the report type you are using.
Response example:
{:report_request_id=>"30000000999745662", :@xmlns=>"https://bingads.microsoft.com/Reporting/v11"}
To retrieve the report generated you have a few options:
You can check if the report is ready and then get the url:
service.report_url(report_request_id) if service.report_ready?(report_request_id)
Or you can download the body of the report when it's ready. (and then write to a file for example)
service.report_body(report_request_id) if service.report_ready?(report_request_id)
You can also get the entire poll_generate_reportl report object:
service.poll_generate_report(report_request_id)
Bing::Ads::API::Errors::AuthenticationParamsMissing
No username/password or authentication_token.Bing::Ads::API::Errors::AuthenticationTokenExpired
Authentication token needs to be refreshed.Bing::Ads::API::Errors::LimitError
An API limit has been exceeded on a specific request. Check message for details.Bing::Ads::API::Errors::DownloadError
Error when downloading a report body.After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
.
Endpoints were manually tested but although RSpec is installed as a test framework, there are no tests written yet.
Bug reports and pull requests are welcome on GitHub at https://github.com/FindHotel/bing-ads.