A Ruby client for the Amazon Ads API.
Add to your Gemfile:
gem "amazon-ads"Or install directly:
gem install amazon-adsSet your app credentials at the module level or via environment variables:
AmazonAds.client_id = "your_client_id"
AmazonAds.client_secret = "your_client_secret"Or set AMAZON_ADS_CLIENT_ID and AMAZON_ADS_CLIENT_SECRET.
Request an access token via Login with Amazon (LWA):
data = AmazonAds::LWA.request(refresh_token: "your_refresh_token")
access_token = data.fetch("access_token")The caller owns token caching. Store and reuse the token until it expires.
Make requests:
# List advertising profiles
profiles = AmazonAds::Profiles.new(region: "NA", access_token:)
profiles.list_profiles
# List campaigns under a profile
campaigns = AmazonAds::Campaigns.new(
region: "NA",
access_token:,
profile_id: "123456789",
)
campaigns.list_campaignsPass http: to inject a configured HTTP client (e.g. http: HTTP.use(logging: { logger: Logger.new($stdout) })). Note that debug logging prints request headers, exposing access tokens.
Responses with a 4xx or 5xx status raise AmazonAds::Error, which carries the full response:
begin
campaigns.list_campaigns
rescue AmazonAds::Error => e
e.status # 400
e.code # "FIELD_VALUE_IS_INVALID"
e.response.body # Amazon's error document
endWhen the response carries one of Amazon's documented error codes, the error is a matching subclass under AmazonAds::Errors:
begin
campaigns.list_campaigns
rescue AmazonAds::Errors::TooManyRequests
backoff
rescue AmazonAds::Errors::Unauthorized
refresh_token
endUnknown or missing codes raise the base AmazonAds::Error. Reporting sends the HTTP status as its code, so its errors are always the base class.
The error supports pattern matching on status and code:
case error
in code: "TOO_MANY_REQUESTS" then backoff
in status: 500..599 then retry
endNetwork failures (HTTP::ConnectionError, HTTP::TimeoutError) raise as-is, whether or not retries are configured.
See AGENTS.md.