Google Ads API报USER_PERMISSION_DENIED 客户ID配置咨询
USER_PERMISSION_DENIED错误90%以上的诱因都是login-customer-id和client-customer-id漏传、错传,或账号权限不匹配,以下是对应问题的明确解答:
1. 两个ID的核心区别
- login-customer-id:是API调用的身份归属主体,对应你持有访问权限、已开通Google Ads API访问资格的经理账号(MCC账号)ID。Google服务端收到请求后会第一时间校验这个ID对应的账号是否有API调用权限、是否获得了目标操作账号的授权,相当于你进入Google Ads系统的「准入工牌」。
- client-customer-id:是API调用的操作目标主体,对应你实际要拉取数据、修改配置的具体广告账号ID。所有报表查询、广告系列调整、关键词增删等操作,最终都会生效在这个ID对应的账号上,相当于你持工牌要进入的「具体办公室」。
直白类比:你用A公司的员工工牌(login-customer-id),申请进入A公司代管的B客户广告账户后台查数据(client-customer-id),工牌是准入凭证,B账户是操作落点。
2. 两个ID的获取方式
- 获取login-customer-id:
- 登录Google Ads网页后台,右上角账号切换入口选中你拥有管理员权限的MCC经理账号,页面右上角显示的10位客户ID(去掉格式里的横杠)就是;也可以从账号设置页的「账户信息」栏直接复制客户ID。注意这个ID对应的账号必须已经完成Google Ads API启用流程,且你生成OAuth凭证用的谷歌账号对该MCC拥有至少标准访问以上权限。
- 获取client-customer-id:
- 在MCC账号的代管账号列表里找到你要操作的目标广告账号,点进该账号详情后,右上角显示的10位客户ID(去掉横杠)就是;如果是没有挂靠MCC的直客广告账号,你登录直客后台看到的自身账号ID就是client-customer-id,这种场景下如果直客本身开了API权限,两个ID可以填同一个值。
注意:所有传入API的ID都必须去掉原生格式里的横杠,比如页面显示的
123-456-7890要处理成1234567890,传带横杠的ID也会触发权限类报错。
3. 需要同时传入两个ID的场景
- 你使用MCC经理账号生成的OAuth凭证,操作该MCC代管的任意子广告账号时,必须同时传两个ID
- 你生成OAuth凭证所归属的谷歌账号,和你要操作的目标广告账号不是同一个主体时,必须同时传两个ID
- 你使用MCC层级的开发者令牌做跨账号批量操作(比如批量拉取MCC下所有子账号的日报数据)时,必须传MCC ID作为login-customer-id,单账号请求时传入对应子账号ID作为client-customer-id
不需要同时传的场景:你操作的就是OAuth凭证直接归属的直客广告账号,没有经过MCC代管链路,这种场景只传client-customer-id即可,login-customer-id留空也能正常调用。
Java客户端库配置使用示例
import com.google.ads.googleads.lib.GoogleAdsClient; import com.google.ads.googleads.v15.services.GoogleAdsServiceClient; import com.google.ads.googleads.v15.services.SearchPagedResponse; import java.io.FileNotFoundException; import java.io.IOException; public class GoogleAdsIdConfigDemo { public static void main(String[] args) { GoogleAdsClient baseClient; try { // 从本地ads.properties配置文件加载基础凭证(开发者令牌、OAuth信息等) baseClient = GoogleAdsClient.newBuilder().fromPropertiesFile().build(); } catch (FileNotFoundException e) { System.err.println("配置文件不存在,请检查ads.properties路径"); System.exit(1); return; } catch (IOException e) { System.err.println("读取配置文件失败:" + e.getMessage()); System.exit(1); return; } // 配置两个核心ID(均为去掉横杠的10位数字) Long loginCustomerId = 1234567890L; // 替换为实际的MCC账号ID Long clientCustomerId = 9876543210L; // 替换为实际要操作的目标广告账号ID // 构建带login-customer-id配置的客户端实例 try (GoogleAdsServiceClient adsServiceClient = baseClient.toBuilder() .setLoginCustomerId(loginCustomerId) .build() .getLatestVersion() .createGoogleAdsServiceClient()) { // 执行GAQL查询时传入client-customer-id作为操作目标 String gaql = "SELECT campaign.id, campaign.name, campaign.status FROM campaign LIMIT 20"; SearchPagedResponse response = adsServiceClient.search(String.valueOf(clientCustomerId), gaql); // 遍历处理返回结果 response.iterateAll().forEach(row -> { System.out.printf("广告系列ID:%d | 名称:%s | 状态:%s%n", row.getCampaign().getId(), row.getCampaign().getName(), row.getCampaign().getStatus().name()); }); } } }
你也可以直接在
ads.properties配置文件里预填两个ID,不需要每次在代码中手动设置:api.googleads.developerToken=你的开发者令牌 api.googleads.clientId=你的OAuth客户端ID api.googleads.clientSecret=你的OAuth客户端密钥 api.googleads.refreshToken=你的OAuth刷新令牌 api.googleads.loginCustomerId=1234567890 api.googleads.clientCustomerId=9876543210预配置完成后,直接调用
GoogleAdsClient.newBuilder().fromPropertiesFile().build()即可生成可用的客户端实例,无需重复设置ID参数。
内容的提问来源于stack exchange,提问作者Ajit Trivedi
相关产品推荐
相关产品推荐

