---
title: "Can you create YouTube in-stream campaigns through the Google Ads API? What Demand Gen lets you automate"
description: "Classic Video campaigns cannot be created or updated through the Google Ads API; it only reads and reports on them. The documented route to an API-built YouTube in-stream campaign is a Demand Gen campaign whose ad groups select only the in-stream channel. We checked an AI research report on this against Google's API documentation on 11 October 2026 and list what it got right, what it missed and what had changed."
date: 2026-10-11
lang: en
canonical: https://goingstellar.ro/research/demand-gen-youtube-in-stream-google-ads-api/
author: Going Stellar
publisher: GOING STELLAR S.R.L.
topic: Desk research / Google Ads API
license: CC BY 4.0
alternate_ro: https://goingstellar.ro/ro/cercetare/demand-gen-youtube-in-stream-prin-api/
---

# Can you create YouTube in-stream campaigns through the Google Ads API? What Demand Gen lets you automate

*Classic Video campaigns cannot be created or updated through the Google Ads API; it only reads and reports on them. The documented route to an API-built YouTube in-stream campaign is a Demand Gen campaign whose ad groups select only the in-stream channel. We checked an AI research report on this against Google's API documentation on 11 October 2026 and list what it got right, what it missed and what had changed.*

> Desk research · Google Ads API · 2026-10-11 · https://goingstellar.ro/research/demand-gen-youtube-in-stream-google-ads-api/

## Key points

- The Google Ads API cannot create new Video campaigns or update existing ones; it can fetch and report on them.
- A YouTube in-stream campaign can be built through the API as a Demand Gen campaign whose ad groups set only youtube_in_stream to true in selected_channels.
- A Demand Gen budget must not be shared, and explicitly_shared defaults to true on create, so it must be set to false explicitly.
- Asset and Audience resources can be created and updated but not removed through the API; conversion goal resources are update-only.
- Google sunset Google Ads API developer tokens on 9 September 2026; access levels now belong to the Google Cloud project that owns the OAuth credentials.

## The short answer

No, not as a classic Video campaign. Google's developer documentation says: “You cannot create new Video campaigns or update existing ones using the Google Ads API.” The API mainly fetches and reports on existing Video campaigns, ad groups, ads and criteria. Google points to two alternatives: Google Ads scripts, or Demand Gen campaigns, which the API supports fully for creation and management.

Demand Gen is a campaign type that serves image and video ads on Google-owned surfaces such as YouTube, Discover, Gmail and Maps, and on Display. A Demand Gen ad group can be limited to a single surface. Setting only `youtube_in_stream` to true in the ad group's channel controls gives a campaign that serves YouTube in-stream ads and is built entirely through the API.

One nuance the AI report missed: since API version 24, `VideoResponsiveAdInfo` objects inside Video campaigns are mutable, where earlier they were not. So the Video campaign is read-only, but not every object inside it is.

## Which operations each resource allows

Every mutate operation in the Google Ads API is one of `create`, `update` or `remove`, and an update changes only the fields named in its `update_mask`. The v25 reference pages show which of the three each resource allows, and the report got these right.

**Asset**: create and update, no remove. Assets are permanent; you stop using one by removing or replacing the ads that reference it. **Audience**: create and update, no remove. **UserList**: create, update and remove. **CampaignConversionGoal** and **ConversionGoalCampaignConfig**: update only, because Google creates them for you.

**CampaignBudget**, **Campaign**, **AdGroup** and **AdGroupAd** allow all three for Demand Gen. A campaign's channel type cannot change after creation, so turning a campaign into another type means building a new one.

## How to build an in-stream-only Demand Gen campaign

**1. Create everything in one request.** Google's Demand Gen guide recommends creating the budget, campaign, ad group, assets and ad atomically in a single `GoogleAdsService.Mutate` call, using negative temporary IDs so that later operations can reference earlier ones. Either all entities are created or none, so a failure leaves no orphaned budget or empty campaign.

**2. The budget must not be shared.** A Demand Gen campaign cannot use a shared budget. The trap: the `CampaignBudget` reference says `explicitly_shared` defaults to true when it is not set on create, so it has to be set to false explicitly. A daily budget uses `amount_micros` and a total budget uses `total_amount_micros`; only one of the two may be set. One million micros equal one unit of the account currency, and monthly spend on a daily budget is capped at 30.4 times the daily amount.

**3. Campaign type without a subtype.** Set the channel type to `DEMAND_GEN` and leave the subtype unset. Set the EU political advertising declaration `contains_eu_political_advertising`: a new campaign without it fails with `FieldError.REQUIRED`.

**4. One of four bidding strategies.** Demand Gen supports Maximize Clicks, Target CPA, Maximize Conversions and Target ROAS. Target CPC for Demand Gen arrived in version 22, set on the campaign and overridable per ad group. For Target CPA, Google recommends a daily budget of at least 15 times the expected target CPA.

**5. The ad group carries the channel controls.** Create the ad group without an ad group type. Channel controls live on the ad group, under `demand_gen_ad_group_settings.channel_controls`, and take either a `channel_strategy` (`ALL_CHANNELS`, or `ALL_OWNED_AND_OPERATED_CHANNELS`, which switches off third-party channels such as Display) or `selected_channels`, seven booleans: `youtube_in_stream`, `youtube_in_feed`, `youtube_shorts`, `discover`, `gmail`, `display` and `maps`. At least one must be true. For in-stream only, set `youtube_in_stream` and nothing else.

**6. Decide audience mode at creation.** `audience_setting.use_audience_grouped` is immutable. If the ad group will target a reusable `Audience` resource, it must be set to true when the ad group is created; it cannot be switched on later.

**7. The ad.** Demand Gen ad groups accept multi-asset, carousel, video responsive and product ads. For a video responsive ad, `videos` (YouTube video assets) and `logo_images` are required on create and on update. Carousel ads need between 2 and 10 cards.

**8. Create it paused.** Create the campaign with status paused, read it back, and enable it only after the ads have passed policy review.

## Testing before production

Send each mutate first with `validate_only` set to true: the API checks the request without applying it. Note that `BatchJobService` does not support `validate_only`, always runs with partial failure, and rejects operation types that do not support partial failure, including `CampaignConversionGoalOperation`.

Test accounts appear as cancelled in the Google Ads interface, have no billing and do not serve ads. They need their own hierarchy under a test manager account, and they cannot interact with production accounts. They test the structure of requests, not delivery, policy review or bidding.

Daily operation limits depend on access level: Explorer allows 2,880 operations a day against production accounts and 15,000 against test accounts, Basic allows 15,000, and Standard is unlimited. A single mutate request takes at most 10,000 operations, and so does a single `AddBatchJobOperations` request. Rate limits return `RESOURCE_EXHAUSTED`; the client libraries raise the maximum response size to 64 MB.

## Reporting on in-stream delivery

Demand Gen supports campaign, ad and asset reporting through `GoogleAdsService.Search` and `SearchStream`. Campaign clicks are filtered by click type `CROSS_NETWORK`. The segment `ad_sub_network_type`, added in version 23, separates Demand Gen YouTube delivery and must be selected together with `ad_network_type`. Version 25 added `ad_sub_format_type`, which breaks down non-skippable in-stream ads by duration.

Ads shown in the interface as “Demand Gen video ad (legacy)” are not supported by the API and are not returned by search queries. An account that still runs them will show less in an API report than in the interface.

## Version history that matters here

Version 22 (15 October 2025) added Target CPC for Demand Gen and capped batch requests at 10,000 operations. Version 23 (28 January 2026) added `ad_sub_network_type` and made sharing one ad across ad groups return `AD_SHARING_NOT_ALLOWED`. Version 23.1 (25 February 2026) added `YouTubeVideoUploadService`, supported only over REST and in the Python client library. Version 24 (22 April 2026) made `videos` and `logo_images` required for video responsive ads and added a view-through conversion optimisation flag that defaults to false. Version 24.2 (24 June 2026) added Maps as a selectable channel. Version 25 was released on 22 July 2026, and its minor versions 25.1 and 25.2 followed on 19 August and 23 September 2026.

From 1 April 2026, an account with even one campaign lacking the EU political advertising declaration has every campaign-management mutate rejected with `EU_POLITICAL_ADVERTISING_DECLARATION_REQUIRED`. Reporting still works. An update that sets only the declaration is allowed, which is the way out.

## Where the report was wrong

**Developer tokens.** The report said every request needs a developer token, that the token comes from a manager account's API Center, and that OAuth does not replace it. Google sunset developer tokens on 9 September 2026. Access levels moved to the Google Cloud project that owns the OAuth credentials, based on activity in the 90 days before the sunset; the header is now optional and ignored; and new developers sign up in the Google Cloud Console without needing a manager account. In version 25, a Cloud project with only test access calling a production account gets `CLOUD_PROJECT_NOT_APPROVED_FOR_PRODUCTION`. Google's own call-structure page still lists the developer token among required headers, so the documentation disagrees with itself.

**“Nothing in a Video campaign is mutable.”** True for the campaign, false for video responsive ads since version 24.

**Omissions that cost time.** The report did not mention that `explicitly_shared` defaults to true, that a whole account is blocked from campaign mutates from 1 April 2026 if one campaign lacks the EU declaration, the budget guidance of 15 times target CPA, or the limits of `BatchJobService`.

**Heuristics presented beside documentation.** The report's scaling steps and decision thresholds were operating rules of thumb, not Google guidance. It said so in places, but they sat in the same tables as verified API facts. We left them out.

## Method

We started from an AI deep-research report, written in Romanian, on automating Demand Gen and YouTube in-stream through the Google Ads API. On 11 October 2026 we checked its claims about resources, operations, fields, limits and versions against the Google Ads API developer guides, the v25 reference pages and the release notes. We kept a claim only where Google's page said the same thing that day.

We could not verify, and dropped: several error codes the report listed (among them `BUDGET_BELOW_DAILY_MINIMUM` and two total-budget errors), its asset size tables beyond the fields quoted here, its notes on placement criteria in Demand Gen, and its sample code, which we did not run.

## Limitations

This is a documentation check, not a test against a live account. Documentation and API behaviour can differ, and the developer token pages show that Google's pages can disagree with each other.

The API changes every quarter. Everything here describes version 25 as of 11 October 2026; a later major version may change field requirements again, as version 24 did for video responsive ads.

We did not cover delivery quality, costs or creative performance of in-stream ads. The question here is only what can be automated.

## Sources

1. [Video campaigns overview (Google Ads API)](https://developers.google.com/google-ads/api/docs/video/overview)
2. [Demand Gen campaigns overview (Google Ads API)](https://developers.google.com/google-ads/api/docs/demand-gen/overview)
3. [Create a Demand Gen campaign (Google Ads API)](https://developers.google.com/google-ads/api/docs/demand-gen/create-campaign)
4. [Demand Gen reporting (Google Ads API)](https://developers.google.com/google-ads/api/docs/demand-gen/reporting)
5. [DemandGenSelectedChannels (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/AdGroup.DemandGenAdGroupSettings.DemandGenChannelControls.DemandGenSelectedChannels)
6. [DemandGenChannelControls (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/AdGroup.DemandGenAdGroupSettings.DemandGenChannelControls)
7. [DemandGenChannelStrategy enum (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/DemandGenChannelStrategyEnum.DemandGenChannelStrategy)
8. [AudienceSetting (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/AdGroup.AudienceSetting)
9. [CampaignBudget (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/CampaignBudget)
10. [DemandGenVideoResponsiveAdInfo (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/DemandGenVideoResponsiveAdInfo)
11. [DemandGenCarouselAdInfo (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/DemandGenCarouselAdInfo)
12. [AssetOperation (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/AssetOperation)
13. [AudienceOperation (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/AudienceOperation)
14. [UserListOperation (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/UserListOperation)
15. [CampaignConversionGoalOperation (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/CampaignConversionGoalOperation)
16. [ConversionGoalCampaignConfigOperation (v25 reference)](https://developers.google.com/google-ads/api/reference/rpc/v25/ConversionGoalCampaignConfigOperation)
17. [Mutating overview (Google Ads API)](https://developers.google.com/google-ads/api/docs/mutating/overview)
18. [API limits and quotas (Google Ads API)](https://developers.google.com/google-ads/api/docs/best-practices/quotas)
19. [Test accounts (Google Ads API)](https://developers.google.com/google-ads/api/docs/best-practices/test-accounts)
20. [EU political advertising declaration (Google Ads API policy)](https://developers.google.com/google-ads/api/docs/api-policy/eu-par)
21. [Developer token (Google Ads API)](https://developers.google.com/google-ads/api/docs/api-policy/developer-token)
22. [API call structure (Google Ads API)](https://developers.google.com/google-ads/api/docs/concepts/call-structure)
23. [Release notes (Google Ads API)](https://developers.google.com/google-ads/api/docs/release-notes)
24. [Client libraries (Google Ads API)](https://developers.google.com/google-ads/api/docs/client-libs)

## Questions and answers

### Can I create a YouTube Video campaign with the Google Ads API?

No. Google's documentation says you cannot create new Video campaigns or update existing ones through the Google Ads API; it supports fetching and reporting on them. Google suggests Google Ads scripts or Demand Gen campaigns instead. Since version 24, video responsive ad objects inside Video campaigns can be mutated, but the campaign itself cannot.

### How do I make a Demand Gen campaign serve only YouTube in-stream ads?

Set the channel controls on each ad group, under demand_gen_ad_group_settings.channel_controls.selected_channels, with youtube_in_stream true and youtube_in_feed, youtube_shorts, discover, gmail, display and maps false. Channel controls belong to the ad group, not the campaign, so every ad group in the campaign needs the same setting.

### Why does my Demand Gen campaign creation fail on the budget?

A Demand Gen campaign cannot use a shared budget, and the explicitly_shared field on CampaignBudget defaults to true when it is not set on create. Set explicitly_shared to false. Also set either amount_micros for a daily budget or total_amount_micros for a total budget, never both.

### Do I still need a Google Ads API developer token?

No. Google sunset developer tokens on 9 September 2026. Access levels moved to the Google Cloud project that owns your OAuth credentials, and a developer token sent in the header is ignored. New developers sign up in the Google Cloud Console. Some Google pages still describe the token as required.

### What are the Google Ads API daily operation limits?

Explorer access allows 2,880 operations a day against production accounts and 15,000 against test accounts. Basic access allows 15,000 a day, and Standard access is unlimited, though system rate limits still apply. One mutate request can carry at most 10,000 operations. Exceeding limits returns RESOURCE_EXHAUSTED.

## How to cite

**Cite this as:** Going Stellar (2026). *Can you create YouTube in-stream campaigns through the Google Ads API? What Demand Gen lets you automate*. GOING STELLAR S.R.L.. https://goingstellar.ro/research/demand-gen-youtube-in-stream-google-ads-api/

```bibtex
@misc{goingstellar2026demand,
  title  = {Can you create YouTube in-stream campaigns through the Google Ads API? What Demand Gen lets you automate},
  author = {{Going Stellar}},
  year   = {2026},
  url    = {https://goingstellar.ro/research/demand-gen-youtube-in-stream-google-ads-api/},
  note   = {2026-10-11}
}
```

Licence. Free to quote with attribution.

## Also available

- This page as HTML: https://goingstellar.ro/research/demand-gen-youtube-in-stream-google-ads-api/
- Same article in Romanian: https://goingstellar.ro/ro/cercetare/demand-gen-youtube-in-stream-prin-api/
