{"id":3024,"date":"2026-09-11T05:26:54","date_gmt":"2026-09-11T05:26:54","guid":{"rendered":"https:\/\/dmarketertayeeb.com\/blog\/google-ads-api-onboarding-developer-token\/"},"modified":"2026-09-11T05:30:41","modified_gmt":"2026-09-11T05:30:41","slug":"google-ads-api-onboarding-developer-token","status":"publish","type":"post","link":"https:\/\/dmarketertayeeb.com\/blog\/google-ads-api-onboarding-developer-token\/","title":{"rendered":"Google Ads API Onboarding After the Developer-Token Sunset: A Cloud Project Checklist"},"content":{"rendered":"\n<p><strong>Google Ads API developer tokens were sunset on September 9, 2026.<\/strong> The current Google guide says API access levels now belong to the Google Cloud project used by the OAuth client or service account. Existing code may keep sending the token for now, but Google says the header is optional and ignored by API servers, and a future major version will reject it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Use the Cloud Console for new access<\/h2>\n\n\n\n<p>For new Google Ads API access, use the <a href=\"https:\/\/console.cloud.google.com\/google-ads-api\/overview\">Google Ads API Overview<\/a> in Google Cloud Console. Google explicitly says applications started in the Google Ads manager account\u2019s API Center will not be processed for this transition. The old API Center remains useful for historical developer details, but not for applying for or managing current access levels.<\/p>\n\n\n\n<p>A manager account is no longer required to use the API. You still need one when the integration must link to and manage multiple customer accounts through the API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Keep four objects separate<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Object<\/th><th>What it controls<\/th><th>Check<\/th><\/tr><\/thead><tbody>\n  <tr><td>Google Cloud project<\/td><td>Current API access level and ownership of OAuth credentials<\/td><td>Open Google Ads API Overview and confirm the project ID and level<\/td><\/tr>\n  <tr><td>OAuth client or service account<\/td><td>Authentication path and the project that receives access<\/td><td>Map the credential to the same project used in the API request<\/td><\/tr>\n  <tr><td>Developer token<\/td><td>Historical access record during the transition; no longer the access-level owner<\/td><td>Stop treating its API Center level as the current project state<\/td><\/tr>\n  <tr><td>Manager account<\/td><td>Optional account-linking and multi-account management layer<\/td><td>Use it only when the account hierarchy requires it<\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Access levels and verification<\/h2>\n\n\n\n<p>Google continues to enforce Test Account, Basic and Standard access levels, but the level is now enforced at the Cloud-project boundary. For new Basic and Standard applications, brand verification is required. Google says Basic applications are now automated and reviewed within minutes after verification and submission; Standard access still involves manual review. Existing holders do not have to repeat brand verification, although Google encourages it.<\/p>\n\n\n\n<p>Google also says approved developer-token access was transferred only to Cloud projects identified from API activity in the previous 90 days. A new project, or a project that never used the token, defaults to Test Account access until the owner applies for the appropriate level.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migration checklist<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n  <li>Inventory every application, OAuth client or service account, Cloud project, customer account and manager-account link.<\/li>\n  <li>For each project, record the access level shown in Google Cloud Console and the credential that uses it.<\/li>\n  <li>Complete brand verification before a new Basic or Standard request.<\/li>\n  <li>Test the integration against a test account, then make one controlled production read request only after the project level is approved.<\/li>\n  <li>Upgrade the client library if necessary and remove the developer-token header on a planned release; do not remove it blindly from a live integration without checking the library\u2019s current support.<\/li>\n  <li>Move mandatory administrative contacts from the old API Center record to the Cloud-project owner\/editor list.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Failure cases to put in the runbook<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><code>CLOUD_<wbr>PROJECT_<wbr>NOT_<wbr>APPROVED_<wbr>FOR_<wbr>PRODUCTION<\/code> appears in API v25 when a Test Account project calls a production account. Older API versions can return <code>ACTION_<wbr>NOT_<wbr>PERMITTED<\/code>. Apply for Explorer or the appropriate access from the Cloud project\u2019s Google Ads API Overview page.<\/li>\n  <li>Pending Basic applications started in the old API Center are closed; reapply from Cloud Console. Pending Standard applications as of September 9 continue through review.<\/li>\n  <li>An approved token cannot simply be reassociated with a new Cloud project after the sunset. Apply for access for the new project.<\/li>\n  <li>Unused projects can lose access after 90 days of inactivity. Store an owner and review date with the project record.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What success looks like<\/h2>\n\n\n\n<p>The migration is complete when the project, credential, access level, customer-account path and owner are documented; a test request succeeds; and production access is verified from Cloud Console rather than inferred from an old developer-token record. This is an implementation checklist, not an account approval or a guarantee of quota.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Map projects before a cutover<\/h2>\n\n\n\n<p>The difficult part is not deleting a header from source code. It is proving which Cloud project owns the access level used by each credential.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n  <thead><tr><th>Observed situation<\/th><th>What to record<\/th><th>Decision<\/th><\/tr><\/thead>\n  <tbody>\n    <tr><td>Project used the token during the previous 90 days<\/td><td>Project ID, credential, customer accounts, access level and owner shown in Cloud Console<\/td><td>Verify the transferred level, then test the existing integration<\/td><\/tr>\n    <tr><td>New project or no recent API activity<\/td><td>Project ID, intended customer path, brand-verification state and requested level<\/td><td>Expect Test Account until the owner applies from the Google Ads API Overview<\/td><\/tr>\n    <tr><td>One manager controls several customers<\/td><td>Manager customer ID, linked accounts, OAuth project and service identity<\/td><td>Keep the manager layer; it is an account-linking requirement, not the access-level owner<\/td><\/tr>\n    <tr><td>One integration serves one customer<\/td><td>Customer ID, project, credential and production test evidence<\/td><td>Do not add a manager account merely because the old setup used one<\/td><\/tr>\n  <\/tbody>\n<\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Use a staged release sequence<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n  <li>Freeze a copy of the current library version, token handling and customer-account map. Do not change credentials while the inventory is incomplete.<\/li>\n  <li>Create or select the Cloud project and assign an owner\/editor who can receive Google Ads API notifications. Confirm that the OAuth client or service account belongs to that project.<\/li>\n  <li>Open the Google Ads API Overview, record the displayed access level, complete brand verification where required and save the request timestamp.<\/li>\n  <li>Run a read-only test against a test account. Capture the project ID, customer ID, API version, request type, response and any error code.<\/li>\n  <li>Promote one production read request only after the project level is approved and the owner has reviewed the customer-account path. Then schedule the library\/header change.<\/li>\n  <li>After the release, check a second request and the project\u2019s owner\/contact record. A successful first request does not prove every customer link or write operation is valid.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">When the migration should stop<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n  <li><code>CLOUD_<wbr>PROJECT_<wbr>NOT_<wbr>APPROVED_<wbr>FOR_<wbr>PRODUCTION<\/code> means the project state must be fixed; it is not solved by retrying with an old token.<\/li>\n  <li>A pending Basic application from the old API Center is closed for this transition. Start again in Cloud Console rather than waiting on a stale request.<\/li>\n  <li>Moving a credential to a new project can change the access boundary. Treat that as a new application and record the new project owner.<\/li>\n  <li>If a customer request succeeds but reporting totals do not reconcile, stop the migration and check account hierarchy, currency and date boundaries before changing measurement logic.<\/li>\n<\/ul>\n\n\n\n<p>Use DMT\u2019s <a href=\"https:\/\/dmarketertayeeb.com\/blog\/google-ads-api-v25-1-shopping-deadline\">Google Ads API version migration page<\/a> for version and deadline context, the <a href=\"https:\/\/dmarketertayeeb.com\/blog\/google-ads-api-developer-assistant-v4\">Developer Assistant page<\/a> for assisted implementation context, and the <a href=\"https:\/\/dmarketertayeeb.com\/blog\/google-ads-measurement-stack-attribution-incrementality-mmm\">measurement-stack guide<\/a> when the API feeds marketing reporting. None of those owners replaces Google\u2019s current access policy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ: questions readers ask<\/h2>\n\n\n<dl>\n  <dt><strong>Do I need a manager account to use the Google Ads API?<\/strong><\/dt>\n  <dd>Not for a single-account integration. Google says a manager account is still needed when the application links to and manages multiple customer accounts.<\/dd>\n  <dt><strong>What replaced the developer token\u2019s access-level role?<\/strong><\/dt>\n  <dd>The Cloud project used by the OAuth client or service account now owns the access level. Keep the token in the transition record, but verify the project state in Cloud Console.<\/dd>\n  <dt><strong>Why did a previously working project fall back to Test Account?<\/strong><\/dt>\n  <dd>Google says projects without qualifying API activity in the previous 90 days may not inherit the prior approval. Check the project and apply for the required level from the new onboarding path.<\/dd>\n<\/dl>\n\n\n<p><strong>Source note:<\/strong> Dates, access levels, error names, verification requirements and manager-account rules are taken from Google\u2019s developer guide updated September 10, 2026. No Google account was changed or tested for this article.<\/p>\n\n\n\n<p><strong>Sources:<\/strong> <a href=\"https:\/\/developers.google.com\/google-ads\/api\/docs\/api-policy\/developer-token\">Google Ads API developer-token guide<\/a> <a href=\"https:\/\/developers.google.com\/google-ads\/api\/docs\/start\">Google Ads API getting started<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Migrate Google Ads API access to Cloud projects with a checklist for OAuth credentials, access levels, brand verification and manager-account links.<\/p>\n","protected":false},"author":1,"featured_media":3023,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[177,233],"tags":[455,373,416,422,235],"class_list":["post-3024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-marketing","category-google-ads","tag-api-migration","tag-google-ads","tag-google-ads-api","tag-marketing-operations","tag-ppc","has-featured-image"],"_links":{"self":[{"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/posts\/3024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/comments?post=3024"}],"version-history":[{"count":1,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/posts\/3024\/revisions"}],"predecessor-version":[{"id":3025,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/posts\/3024\/revisions\/3025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/media\/3023"}],"wp:attachment":[{"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/media?parent=3024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/categories?post=3024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dmarketertayeeb.com\/blog\/wp-json\/wp\/v2\/tags?post=3024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}