You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:57:20