Count which selected prompts a bulk action applies to
curl --request POST \
--url https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": {
"mode": "ids",
"ids": [
"<string>"
]
},
"teamId": "<string>",
"enqueue": true,
"regions": [
{
"country": "<string>",
"iso2": "<string>",
"city": "<string>",
"state": "<string>",
"iso3": "<string>"
}
]
}
'import requests
url = "https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview"
payload = {
"selection": {
"mode": "ids",
"ids": ["<string>"]
},
"teamId": "<string>",
"enqueue": True,
"regions": [
{
"country": "<string>",
"iso2": "<string>",
"city": "<string>",
"state": "<string>",
"iso3": "<string>"
}
]
}
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({
selection: {mode: 'ids', ids: ['<string>']},
teamId: '<string>',
enqueue: true,
regions: [
{
country: '<string>',
iso2: '<string>',
city: '<string>',
state: '<string>',
iso3: '<string>'
}
]
})
};
fetch('https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview', 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.snowseo.com/v3/ai-tracker/prompts/bulk-preview",
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([
'selection' => [
'mode' => 'ids',
'ids' => [
'<string>'
]
],
'teamId' => '<string>',
'enqueue' => true,
'regions' => [
[
'country' => '<string>',
'iso2' => '<string>',
'city' => '<string>',
'state' => '<string>',
'iso3' => '<string>'
]
]
]),
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.snowseo.com/v3/ai-tracker/prompts/bulk-preview"
payload := strings.NewReader("{\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\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.snowseo.com/v3/ai-tracker/prompts/bulk-preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview")
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 \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"eligibility": {
"selected": 123,
"eligible": 123,
"skipped": 123,
"byReason": {}
}
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Tracked prompts
Bulk prompt actions
Preview, track, untrack, refresh, set regions for, or delete many tracked prompts at once.
POST
/
v3
/
ai-tracker
/
prompts
/
bulk-preview
Count which selected prompts a bulk action applies to
curl --request POST \
--url https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": {
"mode": "ids",
"ids": [
"<string>"
]
},
"teamId": "<string>",
"enqueue": true,
"regions": [
{
"country": "<string>",
"iso2": "<string>",
"city": "<string>",
"state": "<string>",
"iso3": "<string>"
}
]
}
'import requests
url = "https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview"
payload = {
"selection": {
"mode": "ids",
"ids": ["<string>"]
},
"teamId": "<string>",
"enqueue": True,
"regions": [
{
"country": "<string>",
"iso2": "<string>",
"city": "<string>",
"state": "<string>",
"iso3": "<string>"
}
]
}
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({
selection: {mode: 'ids', ids: ['<string>']},
teamId: '<string>',
enqueue: true,
regions: [
{
country: '<string>',
iso2: '<string>',
city: '<string>',
state: '<string>',
iso3: '<string>'
}
]
})
};
fetch('https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview', 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.snowseo.com/v3/ai-tracker/prompts/bulk-preview",
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([
'selection' => [
'mode' => 'ids',
'ids' => [
'<string>'
]
],
'teamId' => '<string>',
'enqueue' => true,
'regions' => [
[
'country' => '<string>',
'iso2' => '<string>',
'city' => '<string>',
'state' => '<string>',
'iso3' => '<string>'
]
]
]),
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.snowseo.com/v3/ai-tracker/prompts/bulk-preview"
payload := strings.NewReader("{\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\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.snowseo.com/v3/ai-tracker/prompts/bulk-preview")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/ai-tracker/prompts/bulk-preview")
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 \"selection\": {\n \"mode\": \"ids\",\n \"ids\": [\n \"<string>\"\n ]\n },\n \"teamId\": \"<string>\",\n \"enqueue\": true,\n \"regions\": [\n {\n \"country\": \"<string>\",\n \"iso2\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"iso3\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"eligibility": {
"selected": 123,
"eligible": 123,
"skipped": 123,
"byReason": {}
}
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Every bulk action takes a
Each call processes one batch of eligible prompts and returns
selection and works through it in batches:
selectionis either{ mode: "ids", ids: [promptId, ...] }or{ mode: "all", filters: { ... }, excludedIds: [...] }(every prompt matching the filters, minus the excluded ids). Filters:platform,competitor,country,startDate,endDate,promptBrand,tracking,intent,search.- Call
POST /v3/ai-tracker/prompts/bulk-previewwith theselectionand anactionfirst. It changes nothing and returnseligibility:{ selected, eligible, skipped, byReason }, e.g. prompts skipped because they are already tracked or still running.
| Action | Endpoint | Rows per call | Extra body |
|---|---|---|---|
| Track | POST /v3/ai-tracker/prompts/bulk-track | 10 | enqueue (false saves without running now). Uses credits |
| Untrack | POST /v3/ai-tracker/prompts/bulk-untrack | 50 | none; responses and topic links are kept |
| Refresh | POST /v3/ai-tracker/prompts/bulk-refresh | 10 | regions (where paused prompts run once). Uses credits |
| Set regions | POST /v3/ai-tracker/prompts/bulk-set-regions | 10 | regions (required), enqueue. Uses credits |
| Delete | POST /v3/ai-tracker/prompts/bulk-delete | 50 | none; permanent |
{ success, succeeded, failed, nextCursor, eligibility, results }. While nextCursor is not null, call again with the same selection and afterId set to nextCursor. results has one entry per prompt with id, success and error when it failed. Refresh and set-regions results also carry enqueued, plus runUnits or skipped.
For a single prompt, use Update a Prompt, Delete a Prompt or Refresh a Prompt.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Body
application/json
- Option 1
- Option 2
Show child attributes
Show child attributes
The bulk action to count eligible rows for.
Available options:
track, untrack, refresh, set-regions, delete When false, saves the change without running the prompts now. Tracked prompts are still picked up by the scheduled refresh, which bills for them.
Show child attributes
Show child attributes
Response
Default Response
Show child attributes
Show child attributes
Was this page helpful?

