Queue an export of report rows
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. A successful200 response queues CSV work; poll the returned status URL.
curl --request POST \
--url https://api.gratona.com/v1/admin/reports/{id}/export \
--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>"
},
"format": "CSV",
"columns": [
"<string>"
],
"export_locale": "en"
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/export"
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>"
},
"format": "CSV",
"columns": ["<string>"],
"export_locale": "en"
}
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>'
},
format: 'CSV',
columns: ['<string>'],
export_locale: 'en'
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/export', 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}/export",
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>'
],
'format' => 'CSV',
'columns' => [
'<string>'
],
'export_locale' => 'en'
]),
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}/export"
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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\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}/export")
.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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/export")
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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Saved successfully.",
"data": {
"format": "<string>",
"selection": [
123
],
"columns": [
"<string>"
],
"export": {
"message": "<string>",
"status": "<string>",
"export_id": 123,
"status_url": "<string>",
"recipient_email": "<string>"
}
}
}{
"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
Validation: nullable|string|in:CSV,csv.
CSV, csv, null "CSV"
Permitted runtime column keys or definitions.
en, es, fr, de, nl, ar, zhCn, null "en"
curl --request POST \
--url https://api.gratona.com/v1/admin/reports/{id}/export \
--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>"
},
"format": "CSV",
"columns": [
"<string>"
],
"export_locale": "en"
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/export"
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>"
},
"format": "CSV",
"columns": ["<string>"],
"export_locale": "en"
}
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>'
},
format: 'CSV',
columns: ['<string>'],
export_locale: 'en'
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/export', 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}/export",
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>'
],
'format' => 'CSV',
'columns' => [
'<string>'
],
'export_locale' => 'en'
]),
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}/export"
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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\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}/export")
.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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/export")
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 \"format\": \"CSV\",\n \"columns\": [\n \"<string>\"\n ],\n \"export_locale\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Saved successfully.",
"data": {
"format": "<string>",
"selection": [
123
],
"columns": [
"<string>"
],
"export": {
"message": "<string>",
"status": "<string>",
"export_id": 123,
"status_url": "<string>",
"recipient_email": "<string>"
}
}
}{
"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."
}