Create or attach campaign assets
curl --request POST \
--url https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"images": [
{
"assetId": "<string>"
}
],
"businessLogo": {
"assetId": "<string>"
},
"businessName": "<string>",
"calls": [
{
"phoneNumber": "<string>",
"countryCode": "<string>",
"reportCalls": true,
"adSchedule": [
{
"startHour": 11,
"startMinute": 0,
"endHour": 12,
"endMinute": 0
}
]
}
],
"callouts": [
{
"text": "<string>"
}
],
"sitelinks": [
{
"linkText": "<string>",
"finalUrl": "<string>",
"description1": "<string>",
"description2": "<string>"
}
],
"structuredSnippets": [
{
"values": [
"<string>"
]
}
],
"loginCustomerId": "<string>",
"validateOnly": true
}
'import requests
url = "https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets"
payload = {
"images": [{ "assetId": "<string>" }],
"businessLogo": { "assetId": "<string>" },
"businessName": "<string>",
"calls": [
{
"phoneNumber": "<string>",
"countryCode": "<string>",
"reportCalls": True,
"adSchedule": [
{
"startHour": 11,
"startMinute": 0,
"endHour": 12,
"endMinute": 0
}
]
}
],
"callouts": [{ "text": "<string>" }],
"sitelinks": [
{
"linkText": "<string>",
"finalUrl": "<string>",
"description1": "<string>",
"description2": "<string>"
}
],
"structuredSnippets": [{ "values": ["<string>"] }],
"loginCustomerId": "<string>",
"validateOnly": True
}
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({
images: [{assetId: '<string>'}],
businessLogo: {assetId: '<string>'},
businessName: '<string>',
calls: [
{
phoneNumber: '<string>',
countryCode: '<string>',
reportCalls: true,
adSchedule: [{startHour: 11, startMinute: 0, endHour: 12, endMinute: 0}]
}
],
callouts: [{text: '<string>'}],
sitelinks: [
{
linkText: '<string>',
finalUrl: '<string>',
description1: '<string>',
description2: '<string>'
}
],
structuredSnippets: [{values: ['<string>']}],
loginCustomerId: '<string>',
validateOnly: true
})
};
fetch('https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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([
'images' => [
[
'assetId' => '<string>'
]
],
'businessLogo' => [
'assetId' => '<string>'
],
'businessName' => '<string>',
'calls' => [
[
'phoneNumber' => '<string>',
'countryCode' => '<string>',
'reportCalls' => true,
'adSchedule' => [
[
'startHour' => 11,
'startMinute' => 0,
'endHour' => 12,
'endMinute' => 0
]
]
]
],
'callouts' => [
[
'text' => '<string>'
]
],
'sitelinks' => [
[
'linkText' => '<string>',
'finalUrl' => '<string>',
'description1' => '<string>',
'description2' => '<string>'
]
],
'structuredSnippets' => [
[
'values' => [
'<string>'
]
]
],
'loginCustomerId' => '<string>',
'validateOnly' => true
]),
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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets"
payload := strings.NewReader("{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}")
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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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 = "{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}"
response = http.request(request)
puts response.read_body{
"linkResourceNames": [
"<string>"
],
"addedCount": 123,
"validateOnly": true
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}Google Ads
Create or attach campaign assets
Search images accept an existing assetId or a public HTTPS JPEG/PNG url. Use validateOnly to test upload and attachment without changing Google Ads. Image review and eligibility remain with Google.
POST
/
projects
/
{projectId}
/
google-ads
/
customers
/
{customerId}
/
campaigns
/
{campaignId}
/
assets
Create or attach campaign assets
curl --request POST \
--url https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"images": [
{
"assetId": "<string>"
}
],
"businessLogo": {
"assetId": "<string>"
},
"businessName": "<string>",
"calls": [
{
"phoneNumber": "<string>",
"countryCode": "<string>",
"reportCalls": true,
"adSchedule": [
{
"startHour": 11,
"startMinute": 0,
"endHour": 12,
"endMinute": 0
}
]
}
],
"callouts": [
{
"text": "<string>"
}
],
"sitelinks": [
{
"linkText": "<string>",
"finalUrl": "<string>",
"description1": "<string>",
"description2": "<string>"
}
],
"structuredSnippets": [
{
"values": [
"<string>"
]
}
],
"loginCustomerId": "<string>",
"validateOnly": true
}
'import requests
url = "https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets"
payload = {
"images": [{ "assetId": "<string>" }],
"businessLogo": { "assetId": "<string>" },
"businessName": "<string>",
"calls": [
{
"phoneNumber": "<string>",
"countryCode": "<string>",
"reportCalls": True,
"adSchedule": [
{
"startHour": 11,
"startMinute": 0,
"endHour": 12,
"endMinute": 0
}
]
}
],
"callouts": [{ "text": "<string>" }],
"sitelinks": [
{
"linkText": "<string>",
"finalUrl": "<string>",
"description1": "<string>",
"description2": "<string>"
}
],
"structuredSnippets": [{ "values": ["<string>"] }],
"loginCustomerId": "<string>",
"validateOnly": True
}
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({
images: [{assetId: '<string>'}],
businessLogo: {assetId: '<string>'},
businessName: '<string>',
calls: [
{
phoneNumber: '<string>',
countryCode: '<string>',
reportCalls: true,
adSchedule: [{startHour: 11, startMinute: 0, endHour: 12, endMinute: 0}]
}
],
callouts: [{text: '<string>'}],
sitelinks: [
{
linkText: '<string>',
finalUrl: '<string>',
description1: '<string>',
description2: '<string>'
}
],
structuredSnippets: [{values: ['<string>']}],
loginCustomerId: '<string>',
validateOnly: true
})
};
fetch('https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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([
'images' => [
[
'assetId' => '<string>'
]
],
'businessLogo' => [
'assetId' => '<string>'
],
'businessName' => '<string>',
'calls' => [
[
'phoneNumber' => '<string>',
'countryCode' => '<string>',
'reportCalls' => true,
'adSchedule' => [
[
'startHour' => 11,
'startMinute' => 0,
'endHour' => 12,
'endMinute' => 0
]
]
]
],
'callouts' => [
[
'text' => '<string>'
]
],
'sitelinks' => [
[
'linkText' => '<string>',
'finalUrl' => '<string>',
'description1' => '<string>',
'description2' => '<string>'
]
],
'structuredSnippets' => [
[
'values' => [
'<string>'
]
]
],
'loginCustomerId' => '<string>',
'validateOnly' => true
]),
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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets"
payload := strings.NewReader("{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}")
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.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/assets")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sapt.ai/projects/{projectId}/google-ads/customers/{customerId}/campaigns/{campaignId}/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 = "{\n \"images\": [\n {\n \"assetId\": \"<string>\"\n }\n ],\n \"businessLogo\": {\n \"assetId\": \"<string>\"\n },\n \"businessName\": \"<string>\",\n \"calls\": [\n {\n \"phoneNumber\": \"<string>\",\n \"countryCode\": \"<string>\",\n \"reportCalls\": true,\n \"adSchedule\": [\n {\n \"startHour\": 11,\n \"startMinute\": 0,\n \"endHour\": 12,\n \"endMinute\": 0\n }\n ]\n }\n ],\n \"callouts\": [\n {\n \"text\": \"<string>\"\n }\n ],\n \"sitelinks\": [\n {\n \"linkText\": \"<string>\",\n \"finalUrl\": \"<string>\",\n \"description1\": \"<string>\",\n \"description2\": \"<string>\"\n }\n ],\n \"structuredSnippets\": [\n {\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"loginCustomerId\": \"<string>\",\n \"validateOnly\": true\n}"
response = http.request(request)
puts response.read_body{
"linkResourceNames": [
"<string>"
],
"addedCount": 123,
"validateOnly": true
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}{
"message": "<string>",
"code": "<string>"
}Authorizations
Path Parameters
Body
application/json