Create a report audience handoff
Reports are scoped to the authenticated organization. Data operations enforce source-context access and reject missing fields or unavailable saved contexts. Mutations, scheduling, audience handoffs and downloads require report-management permission; read operations expose only permitted source fields. Worksheet columns and row values are dynamic and should be interpreted using the returned field metadata.
curl --request POST \
--url https://api.gratona.com/v1/admin/reports/{id}/audience \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": [
2
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"query": {
"search": "<string>",
"group": "<string>",
"range": "<string>",
"start": "2026-10-20T09:00:00Z",
"end": "2026-10-20T09:00:00Z",
"sort": "<string>"
}
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/audience"
payload = {
"selection": [2],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"query": {
"search": "<string>",
"group": "<string>",
"range": "<string>",
"start": "2026-10-20T09:00:00Z",
"end": "2026-10-20T09:00:00Z",
"sort": "<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: [2],
filterGroups: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
query: {
search: '<string>',
group: '<string>',
range: '<string>',
start: '2026-10-20T09:00:00Z',
end: '2026-10-20T09:00:00Z',
sort: '<string>'
}
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/audience', 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.gratona.com/v1/admin/reports/{id}/audience",
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' => [
2
],
'filterGroups' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'query' => [
'search' => '<string>',
'group' => '<string>',
'range' => '<string>',
'start' => '2026-10-20T09:00:00Z',
'end' => '2026-10-20T09:00:00Z',
'sort' => '<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.gratona.com/v1/admin/reports/{id}/audience"
payload := strings.NewReader("{\n \"selection\": [\n 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\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.gratona.com/v1/admin/reports/{id}/audience")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": [\n 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/audience")
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 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"reportId": 123,
"reportName": "<string>",
"moduleId": 123,
"count": 123,
"audienceToken": "<string>",
"sampleNames": [
"<string>"
],
"handoffs": {}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Record ID within the organization and any parent resource in this route.
Body
Request fields accepted by this operation. Omitted optional properties retain the behavior described above.
At most100 unique positive record IDs from the current filtered worksheet. Empty selection means all matching rows for the chosen action.
100x >= 1Field/operator/value filters validated against the chosen module, context and operator capabilities. filterGroups takes precedence over fields.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
Create a report audience handoff response.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.gratona.com/v1/admin/reports/{id}/audience \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"selection": [
2
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"query": {
"search": "<string>",
"group": "<string>",
"range": "<string>",
"start": "2026-10-20T09:00:00Z",
"end": "2026-10-20T09:00:00Z",
"sort": "<string>"
}
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/audience"
payload = {
"selection": [2],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"query": {
"search": "<string>",
"group": "<string>",
"range": "<string>",
"start": "2026-10-20T09:00:00Z",
"end": "2026-10-20T09:00:00Z",
"sort": "<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: [2],
filterGroups: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
query: {
search: '<string>',
group: '<string>',
range: '<string>',
start: '2026-10-20T09:00:00Z',
end: '2026-10-20T09:00:00Z',
sort: '<string>'
}
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/audience', 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.gratona.com/v1/admin/reports/{id}/audience",
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' => [
2
],
'filterGroups' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'query' => [
'search' => '<string>',
'group' => '<string>',
'range' => '<string>',
'start' => '2026-10-20T09:00:00Z',
'end' => '2026-10-20T09:00:00Z',
'sort' => '<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.gratona.com/v1/admin/reports/{id}/audience"
payload := strings.NewReader("{\n \"selection\": [\n 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\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.gratona.com/v1/admin/reports/{id}/audience")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"selection\": [\n 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/audience")
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 2\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"query\": {\n \"search\": \"<string>\",\n \"group\": \"<string>\",\n \"range\": \"<string>\",\n \"start\": \"2026-10-20T09:00:00Z\",\n \"end\": \"2026-10-20T09:00:00Z\",\n \"sort\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"reportId": 123,
"reportName": "<string>",
"moduleId": 123,
"count": 123,
"audienceToken": "<string>",
"sampleNames": [
"<string>"
],
"handoffs": {}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Something went wrong. Please try again.",
"status": "error",
"error": "invalid_request",
"code": "DONOR_NOT_FOUND"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}