Link or unlink asset group assets
curl --request POST \
--url https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"assetGroupId": "<string>",
"linked": 123,
"unlinked": 123,
"validateOnly": true
}{
"error": {
"code": "<string>",
"details": {},
"message": "<string>",
"param": "<string>",
"retryHint": "<string>",
"retryable": true,
"type": "<string>"
}
}AIsa Ads
Link or unlink asset group assets
Ad Campaigns. Changes the ad account without starting or raising spend; audited. validateOnly=true checks the request without acting and needs no confirmation. Links new or existing assets to a Performance Max asset group and unlinks others in one change, keeping unlinked assets in the account library. Link existing assets or new content to the asset group, and unlink assets, in one atomic request. Links are applied before unlinks, so swapping the last asset of a role does not trip Google's per-role minimum.
<!-- aisa-pricing:start -->
A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ.
<!-- aisa-pricing:end -->
POST
https://api.aisa.one
/
apis
/
v1
/
ads
/
campaigns
/
{campaignId}
/
asset-groups
/
{assetGroupId}
/
assets
Link or unlink asset group assets
curl --request POST \
--url https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"assetGroupId": "<string>",
"linked": 123,
"unlinked": 123,
"validateOnly": true
}{
"error": {
"code": "<string>",
"details": {},
"message": "<string>",
"param": "<string>",
"retryHint": "<string>",
"retryable": true,
"type": "<string>"
}
}Request contract
- Method and path: POST /apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets
- Availability: enabled
- Request URL template:
https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets - campaignId: path; required
- assetGroupId: path; required
- connectionId: query; required
- Runtime facts: fe60122939c67dc98a3a6ac6b97bd5c326b526105150c8959304dd2160d4dd09
{
"operationId": "post_aisa_ads_apis_v1_ads_campaigns_campaignid_as_2291fd",
"method": "POST",
"path": "/apis/v1/ads/campaigns/{campaignId}/asset-groups/{assetGroupId}/assets",
"servers": [
{
"url": "https://api.aisa.one"
}
],
"parameters": [
{
"description": "Google Ads campaign id.",
"in": "path",
"name": "campaignId",
"required": true,
"schema": {
"pattern": "^\\d+$",
"type": "string"
}
},
{
"description": "Google asset group id.",
"in": "path",
"name": "assetGroupId",
"required": true,
"schema": {
"pattern": "^\\d+$",
"type": "string"
}
},
{
"description": "The ads connection (adc_...) the request runs on: one of yours, from GET /apis/v1/ads/connections. On a request with a JSON body it may be sent as a top-level body member instead.",
"in": "query",
"name": "connectionId",
"required": true,
"schema": {
"pattern": "^adc_[0-9A-Za-z]+$",
"type": "string"
}
}
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"content": {
"application/json": {
"example": {
"connectionId": "adc_7f3k2m9q",
"link": [
{
"fieldType": "HEADLINE",
"text": "Free shipping today"
}
],
"unlink": [
{
"asset": "customers/9122445560/assets/419573236135",
"fieldType": "HEADLINE"
}
]
},
"schema": {
"additionalProperties": true,
"properties": {
"connectionId": {
"description": "The ads connection (adc_...), when not sent as the connectionId query parameter.",
"pattern": "^adc_[0-9A-Za-z]+$",
"type": "string"
},
"link": {
"items": {
"description": "Link one asset to the asset group. Send exactly one of asset (an existing asset), text, imageUrl or youtubeVideoId (new content, created in the same request).",
"properties": {
"asset": {
"description": "Existing asset id or resource name customers/{customerId}/assets/{assetId}. Must belong to the campaign's ad account.",
"type": "string"
},
"fieldType": {
"description": "Google AssetFieldType, such as HEADLINE, LONG_HEADLINE, DESCRIPTION, BUSINESS_NAME, MARKETING_IMAGE, SQUARE_MARKETING_IMAGE, PORTRAIT_MARKETING_IMAGE, LOGO, LANDSCAPE_LOGO or YOUTUBE_VIDEO.",
"type": "string"
},
"imageUrl": {
"description": "Public http(s) image. Links as an image role or LOGO / LANDSCAPE_LOGO.",
"format": "uri",
"type": "string"
},
"text": {
"description": "Text assets link as HEADLINE, LONG_HEADLINE, DESCRIPTION or BUSINESS_NAME.",
"maxLength": 90,
"type": "string"
},
"youtubeVideoId": {
"description": "Links as YOUTUBE_VIDEO.",
"pattern": "^[A-Za-z0-9_-]{11}$",
"type": "string"
}
},
"required": [
"fieldType"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"unlink": {
"items": {
"properties": {
"asset": {
"description": "Asset id or resource name, as returned in the asset group's assets.",
"type": "string"
},
"fieldType": {
"type": "string"
}
},
"required": [
"asset",
"fieldType"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"validateOnly": {
"default": false,
"type": "boolean"
}
},
"type": "object"
}
}
},
"required": true
},
"x-aisa-status": "enabled",
"x-aisa-pricing": {
"description": "Ads operations are free. Ad spend is billed by the ad platform to the connected ad account, never by AIsa.",
"kind": "no_customer_charge"
},
"components": {
"securitySchemes": {
"bearerAuth": {
"scheme": "bearer",
"type": "http"
}
}
}
}
Cost and request rules
A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ. Published reference values are not an account-specific quote or a settled charge. For endpoints supporting X-AISA-Cost-Mode: quote, obtain a free quote for your exact request before execution; reconcile the settled cost with response metadata and Usage Logs. USD amounts use 1,000,000 integer micro-USD per dollar.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Google Ads campaign id.
Pattern:
^\d+$Google asset group id.
Pattern:
^\d+$Query Parameters
The ads connection (adc_...) the request runs on: one of yours, from GET /apis/v1/ads/connections. On a request with a JSON body it may be sent as a top-level body member instead.
Pattern:
^adc_[0-9A-Za-z]+$Body
application/json