Cracking the "Not Enough Assets" Error with Google Ads API
Google Ads API Issues - Resolving the "Not Enough Assets" Error

Search for a command to run...
Google Ads API Issues - Resolving the "Not Enough Assets" Error

No comments yet. Be the first to comment.
This is a guide series for developers tackling common issues with Google Ads API. Each article covers asset errors, API challenges, and offers solutions, tips, and best practices for smooth campaign execution.
Ever felt like you're solving a riddle when working with the Google Ads API? Picture this: you're all set to launch a killer Performance Max campaign. You're confident your setup is flawless. You hit the API, eagerly awaiting success, and then… Boom!...
A Deep Dive Technical Analysis of a Sophisticated Supply Chain Attack Disguised as a Legitimate Freelance Project Executive Summary The gig economy has transformed how developers find work. Platforms

Learn how we replaced AWS Redshift with DuckDB and Apache Superset for loan analytics, cutting costs from $800/day to pennies.

Integrate Firebase Push Notifications in .NET MAUI Hybrid App (Android Support)

Wappalyzer Browsec Nimbus Screenshot tool JSON Formatter ColorZilla React Developer Tools AdBlocker Plus Hey fellow coders! Let's face it, we spend a lot of time in our browsers, right? So, why not make that experience as efficient and productive as ...
In today's fast-paced digital world, efficient asset management is crucial for any web application. Directus, a powerful open-source headless CMS, offers flexibility and scalability. However, integrating a robust storage solution can elevate its perf...

A company founded back in 2019 by two visionary Engineers to create and provide you with the best results possible. We are a web developing company with great vision and plans for the future to be a part of others success. We understand that you have deadlines and reputation to keep... so we will meet ours! You can rely on Ghanshyam Digital To handle your job expertly every time.
So there I was, deep in the weeds of integrating the Performance Ad launch feature for a campaign using Google Ads API. Everything was going swimmingly… until bam! I got hit with error messages like "Not Enough Assets," "Not Enough Headline Assets," "Not Enough Description Assets," "Not Enough Long Headline Assets." 😩
The weird part? I knew I had more than enough assets to meet Google's requirements. Like, way more. Yet, the API was stubbornly refusing to cooperate. 🤔
At this point, I figured I had two options: scream into the void 😱 or reach out to Google Ads API support. Luckily, I went with the second option. 😅
I sent a desperate email to Google Ads API support, and they hit me back with some crucial info. Apparently, I was creating asset groups using the assetGroups method, but here’s the catch: while you can create resources in separate requests, AssetGroups and AssetGroupAssets for Performance Max (PMax) campaigns need to be created in a single atomic request. 🤯
Basically, they said I could either attach the asset IDs directly or use the assetOperation. The trick was making a bulk request using the googleAds.mutate method. 💡 They even sent me a Java sample (which I’ll spare you from, lol).
Once I followed their advice and created the AssetGroups and AssetGroupAssets in a single atomic request (all in one go), like magic 🪄, the errors disappeared, and everything started working smoothly. 🎉
Here’s the endpoint and request body that worked for me:
POST https://googleads.googleapis.com/v17/customers/${customerId}/googleAds:mutate
{
"mutateOperations": [
{
"assetGroupOperation": {
"create": {
"campaign": "customers/{customer ID}/campaigns/{campaign ID}",
"name": "pmax asset group final",
"finalUrls": ["https://www.example.com"],
"status": "ENABLED",
"path1": "home",
"path2": "orders",
"resourceName": "customers/{customer ID}/assetGroups/-1"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Headline 1"
},
"resourceName": "customers/{customer ID}/assets/-2"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Headline 2"
},
"resourceName": "customers/{customer ID}/assets/-3"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Headline 3"
},
"resourceName": "customers/{customer ID}/assets/-4"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Long headline sample"
},
"resourceName": "customers/{customer ID}/assets/-5"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Description 1 sample"
},
"resourceName": "customers/{customer ID}/assets/-6"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Description 2 sample"
},
"resourceName": "customers/{customer ID}/assets/-7"
}
}
},
{
"assetOperation": {
"create": {
"textAsset": {
"text": "Business name"
},
"resourceName": "customers/{customer ID}/assets/-8"
}
}
},
{
"assetOperation": {
"create": {
"imageAsset": {
"mimeType": "UNKNOWN",
"fullSize": {
"heightPixels": 1200,
"widthPixels": 628,
"url": "sample url"
}
},
"resourceName": "customers/{customer ID}/assets/-9"
}
}
},
{
"assetOperation": {
"create": {
"imageAsset": {
"mimeType": "UNKNOWN",
"fullSize": {
"heightPixels": 1200,
"widthPixels": 1200,
"url": "sample url"
}
},
"resourceName": "customers/{customer ID}/assets/-10"
}
}
},
{
"assetGroupAssetOperation": {
"create": {
"fieldType": "HEADLINE",
"assetGroup": "customers/{customer ID}/assetGroups/-1",
"asset": "customers/{customer ID}/assets/-2"
}
}
},
{
"assetGroupAssetOperation": {
"create": {
"fieldType": "HEADLINE",
"assetGroup": "customers/{customer ID}/assetGroups/-1",
"asset": "customers/{customer ID}/assets/-3"
}
}
},
{
"assetGroupAssetOperation": {
"create": {
"fieldType": "LONG_HEADLINE",
"assetGroup": "customers/{customer ID}/assetGroups/-1",
"asset": "customers/{customer ID}/assets/-5"
}
}
},
{
"assetGroupAssetOperation": {
"create": {
"fieldType": "DESCRIPTION",
"assetGroup": "customers/{customer ID}/assetGroups/-1",
"asset": "customers/{customer ID}/assets/-6"
}
}
},
{
"assetGroupAssetOperation": {
"create": {
"fieldType": "MARKETING_IMAGE",
"assetGroup": "customers/{customer ID}/assetGroups/-1",
"asset": "customers/{customer ID}/assets/-9"
}
}
}
]
}
Here, you’ll dynamically replace {customerId} and {campaignId} with your customerId and campaignId.
If you’re ever facing those pesky "Not Enough Assets" errors, don’t let them mess with your head. Just make sure you're bundling everything into one atomic request when you're creating those asset groups. The key is the googleAds.mutate method!
Lesson learned: When in doubt, bulk it out! 💪
Facing complex tech challenges? Our expert developers can build, optimize, and scale your solution. Whether it's custom software, backend architecture, API integrations, or performance tuning, we have you covered.
👉 Let’s build something amazing together! Get in touch