curl --request POST \
--url https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"adAccountId": "<string>",
"sourceAuthority": {
"dataSourceAdAccountId": "<string>",
"dataSourceConnectorId": "<string>"
},
"payload": {
"campaignId": "<string>",
"assetGroupId": "<string>",
"expectedFingerprint": "<string>",
"before": {
"name": "<string>",
"finalUrls": [
"<string>"
],
"finalMobileUrls": [
"<string>"
],
"path1": "<string>",
"path2": "<string>"
},
"updates": {
"name": "<string>",
"finalUrls": [
"<string>"
],
"finalMobileUrls": [
"<string>"
],
"path1": "<string>",
"path2": "<string>",
"textAssets": [
{
"text": "<string>"
}
]
},
"includeTextAssets": true
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
adAccountId: '<string>',
sourceAuthority: {dataSourceAdAccountId: '<string>', dataSourceConnectorId: '<string>'},
payload: {
campaignId: '<string>',
assetGroupId: '<string>',
expectedFingerprint: '<string>',
before: {
name: '<string>',
finalUrls: ['<string>'],
finalMobileUrls: ['<string>'],
path1: '<string>',
path2: '<string>'
},
updates: {
name: '<string>',
finalUrls: ['<string>'],
finalMobileUrls: ['<string>'],
path1: '<string>',
path2: '<string>',
textAssets: [{text: '<string>'}]
},
includeTextAssets: true
}
})
};
fetch('https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group"
payload = {
"adAccountId": "<string>",
"sourceAuthority": {
"dataSourceAdAccountId": "<string>",
"dataSourceConnectorId": "<string>"
},
"payload": {
"campaignId": "<string>",
"assetGroupId": "<string>",
"expectedFingerprint": "<string>",
"before": {
"name": "<string>",
"finalUrls": ["<string>"],
"finalMobileUrls": ["<string>"],
"path1": "<string>",
"path2": "<string>"
},
"updates": {
"name": "<string>",
"finalUrls": ["<string>"],
"finalMobileUrls": ["<string>"],
"path1": "<string>",
"path2": "<string>",
"textAssets": [{ "text": "<string>" }]
},
"includeTextAssets": True
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}Edit Performance Max Asset Group
Rename, pause, enable, remove, update destination URLs or replace reviewed advertiser text for a Performance Max asset group. Text edits require includeTextAssets=true and its current fingerprint. New paused text and removals requiring temporary link activation need the group to start and finish paused. Respect committed placement minimums and capacities; verify separate create/remove phases before restoring reviewed link states. Preserve shared assets, automatic text, other creative links, signals and feed filters. Verify every phase without replay or hidden group activation. Group removal is irreversible; budget belongs to the parent campaign. This is an execution endpoint. For a reviewed user change, save its supported capability/body as an immutable action draft, review it, and explicitly publish that draft. Check action-jobs/capabilities before staging; a catalog entry alone does not make it stageable.
curl --request POST \
--url https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"adAccountId": "<string>",
"sourceAuthority": {
"dataSourceAdAccountId": "<string>",
"dataSourceConnectorId": "<string>"
},
"payload": {
"campaignId": "<string>",
"assetGroupId": "<string>",
"expectedFingerprint": "<string>",
"before": {
"name": "<string>",
"finalUrls": [
"<string>"
],
"finalMobileUrls": [
"<string>"
],
"path1": "<string>",
"path2": "<string>"
},
"updates": {
"name": "<string>",
"finalUrls": [
"<string>"
],
"finalMobileUrls": [
"<string>"
],
"path1": "<string>",
"path2": "<string>",
"textAssets": [
{
"text": "<string>"
}
]
},
"includeTextAssets": true
}
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
adAccountId: '<string>',
sourceAuthority: {dataSourceAdAccountId: '<string>', dataSourceConnectorId: '<string>'},
payload: {
campaignId: '<string>',
assetGroupId: '<string>',
expectedFingerprint: '<string>',
before: {
name: '<string>',
finalUrls: ['<string>'],
finalMobileUrls: ['<string>'],
path1: '<string>',
path2: '<string>'
},
updates: {
name: '<string>',
finalUrls: ['<string>'],
finalMobileUrls: ['<string>'],
path1: '<string>',
path2: '<string>',
textAssets: [{text: '<string>'}]
},
includeTextAssets: true
}
})
};
fetch('https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.bily.ai/api/customer/v1/platform/{resourceUrl}/actions/manage-google-asset-group"
payload = {
"adAccountId": "<string>",
"sourceAuthority": {
"dataSourceAdAccountId": "<string>",
"dataSourceConnectorId": "<string>"
},
"payload": {
"campaignId": "<string>",
"assetGroupId": "<string>",
"expectedFingerprint": "<string>",
"before": {
"name": "<string>",
"finalUrls": ["<string>"],
"finalMobileUrls": ["<string>"],
"path1": "<string>",
"path2": "<string>"
},
"updates": {
"name": "<string>",
"finalUrls": ["<string>"],
"finalMobileUrls": ["<string>"],
"path1": "<string>",
"path2": "<string>",
"textAssets": [{ "text": "<string>" }]
},
"includeTextAssets": True
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}{
"error": "Store not found",
"requestId": "<string>",
"details": "<unknown>",
"retryAfter": "<string>"
}Authorizations
A server-side Bily API key created under Settings > AI tools > Access keys. Select the intended workspace before creating it.
Headers
An organization ID returned by GET /context or GET /organizations. Omit it when a scoped key supplies the organization. Otherwise provide it when no organization is selected.
"org_01J8W7T9G3E6ZQ4M2K5N8P1R0S"
Path Parameters
Exact workspace URL returned by GET /context.
Body
Response
Request completed. Inspect the returned state and any verification fields.
The response is of type object.