Google Ads API — thin REST helpers (search + mutate).
Base: https://googleads.googleapis.com/v17/
Requires:
- OAuth access token with adwords scope
developer-tokenheader (opts:developer_tokenor app env:developer_token)- Optional
login-customer-idfor MCC (opts:login_customer_id)
Mutates support :validate_only / :dry_run (maps to API validateOnly) so
callers can preview without applying.
Docs: https://developers.google.com/google-ads/api/docs/start
Summary
Functions
Create a conversion action via mutate.
Convenience: list campaigns (read-only) via GAQL.
Convenience: list conversion actions via GAQL.
POST customers/{customerId}/googleAds:mutate
POST customers/{customerId}/googleAds:search
Types
@type result() :: {:ok, term()} | {:error, Noizu.Google.Error.t()}
Functions
Create a conversion action via mutate.
Options:
:name(required):type— default"WEBPAGE":category— default"DEFAULT":status— default"ENABLED":dry_run— validate only- developer token / login customer as usual
Convenience: list campaigns (read-only) via GAQL.
Convenience: list conversion actions via GAQL.
Customers.list_conversion_actions("1234567890", client: client, developer_token: "…")
POST customers/{customerId}/googleAds:mutate
Body must include mutateOperations (list). Optional opts:
:dry_run/:validate_only— when true, setsvalidateOnly: true(no apply):partial_failure— default true
Example
Customers.mutate("1234567890", %{
mutateOperations: [
%{
campaignOperation: %{
update: %{
resourceName: "customers/1234567890/campaigns/1",
status: "PAUSED"
},
updateMask: "status"
}
}
]
}, dry_run: true, developer_token: "…", client: client)
POST customers/{customerId}/googleAds:search
customer_id is digits only (no dashes). Body is a map, typically:
%{query: "SELECT campaign.id, campaign.name FROM campaign LIMIT 10"}