Update a report definition
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 PATCH \
--url https://api.gratona.com/v1/admin/reports/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow up with trip participants",
"module_id": 1,
"hysform_id": "<unknown>",
"sponsorships": "<unknown>",
"type": "view",
"fields": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"column_fields": [
"<string>"
],
"column_order": [
"<string>"
],
"date_range": {
"preset": "all_time",
"start_date": "2026-10-20",
"end_date": "2026-10-20"
},
"sort_key": "<string>",
"sort_order": "asc",
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"search_query": "<string>",
"related": {},
"related_config": {},
"snapshot": false
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}"
payload = {
"name": "Follow up with trip participants",
"module_id": 1,
"hysform_id": "<unknown>",
"sponsorships": "<unknown>",
"type": "view",
"fields": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"column_fields": ["<string>"],
"column_order": ["<string>"],
"date_range": {
"preset": "all_time",
"start_date": "2026-10-20",
"end_date": "2026-10-20"
},
"sort_key": "<string>",
"sort_order": "asc",
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"search_query": "<string>",
"related": {},
"related_config": {},
"snapshot": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow up with trip participants',
module_id: 1,
hysform_id: '<unknown>',
sponsorships: '<unknown>',
type: 'view',
fields: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
filterGroups: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
column_fields: ['<string>'],
column_order: ['<string>'],
date_range: {preset: 'all_time', start_date: '2026-10-20', end_date: '2026-10-20'},
sort_key: '<string>',
sort_order: 'asc',
footer_calculations: [{field_key: '<string>', operation: 'count_empty'}],
search_query: '<string>',
related: {},
related_config: {},
snapshot: false
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow up with trip participants',
'module_id' => 1,
'hysform_id' => '<unknown>',
'sponsorships' => '<unknown>',
'type' => 'view',
'fields' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'filterGroups' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'column_fields' => [
'<string>'
],
'column_order' => [
'<string>'
],
'date_range' => [
'preset' => 'all_time',
'start_date' => '2026-10-20',
'end_date' => '2026-10-20'
],
'sort_key' => '<string>',
'sort_order' => 'asc',
'footer_calculations' => [
[
'field_key' => '<string>',
'operation' => 'count_empty'
]
],
'search_query' => '<string>',
'related' => [
],
'related_config' => [
],
'snapshot' => false
]),
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}"
payload := strings.NewReader("{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.gratona.com/v1/admin/reports/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}"
response = http.request(request)
puts response.read_body{
"message": "Saved successfully.",
"data": {
"id": 123,
"source": "<string>",
"type": "<string>",
"type_label": "<string>",
"name": "<string>",
"search_query": "<string>",
"snapshot": true,
"starred": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"module": {
"id": 123,
"key": "<string>",
"label": "<string>"
},
"context": {
"id": "<string>",
"label": "<string>",
"available": true
},
"filters": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"columns": {
"fields": [
"<string>"
],
"order": [
"<string>"
],
"labels": {},
"definitions": [
{
"key": "<string>",
"label": "<string>",
"type": "<string>",
"source": "<string>",
"capabilities": {},
"help": {}
}
]
},
"field_labels": {},
"date_range": {
"preset": "all_time",
"start_date": "2023-12-25",
"end_date": "2023-12-25"
},
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"sort": {
"key": "<string>",
"order": "<string>"
},
"schedule": {},
"schedule_entitlement": {
"enabled": true,
"locked": true
},
"related": {},
"owner": {
"id": 123
},
"open": {
"path": "<string>",
"query": {}
},
"missing_fields": {},
"actions": {}
}
}{
"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.
Validation: required|string|max:255.
255"Follow up with trip participants"
One of the module IDs returned by reports/meta.
1
Required source context ID. For donor sources this is a donor form; for recipient and sponsorship sources it is a program. Some modules support all.
Optional compatibility source discriminator.
Validation: nullable|string|in:view,report.
view, report, null "view"
Field/operator/value filters validated against the chosen module, context and operator capabilities. filterGroups takes precedence over fields.
Show child attributes
Show child attributes
Field/operator/value filters validated against the chosen module, context and operator capabilities. filterGroups takes precedence over fields.
Show child attributes
Show child attributes
Saved date preset and optional custom range; validated by the report date-range contract.
Show child attributes
Show child attributes
Validation: nullable|string.
Validation: nullable|string|in:asc,desc.
asc, desc, null "asc"
Show child attributes
Show child attributes
Validation: nullable|string|max:1000.
1000Validation: nullable|boolean.
false
curl --request PATCH \
--url https://api.gratona.com/v1/admin/reports/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Follow up with trip participants",
"module_id": 1,
"hysform_id": "<unknown>",
"sponsorships": "<unknown>",
"type": "view",
"fields": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"column_fields": [
"<string>"
],
"column_order": [
"<string>"
],
"date_range": {
"preset": "all_time",
"start_date": "2026-10-20",
"end_date": "2026-10-20"
},
"sort_key": "<string>",
"sort_order": "asc",
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"search_query": "<string>",
"related": {},
"related_config": {},
"snapshot": false
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}"
payload = {
"name": "Follow up with trip participants",
"module_id": 1,
"hysform_id": "<unknown>",
"sponsorships": "<unknown>",
"type": "view",
"fields": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"filterGroups": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"column_fields": ["<string>"],
"column_order": ["<string>"],
"date_range": {
"preset": "all_time",
"start_date": "2026-10-20",
"end_date": "2026-10-20"
},
"sort_key": "<string>",
"sort_order": "asc",
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"search_query": "<string>",
"related": {},
"related_config": {},
"snapshot": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Follow up with trip participants',
module_id: 1,
hysform_id: '<unknown>',
sponsorships: '<unknown>',
type: 'view',
fields: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
filterGroups: [{field: '<string>', operator: '<string>', value: '<unknown>', op: '<string>'}],
column_fields: ['<string>'],
column_order: ['<string>'],
date_range: {preset: 'all_time', start_date: '2026-10-20', end_date: '2026-10-20'},
sort_key: '<string>',
sort_order: 'asc',
footer_calculations: [{field_key: '<string>', operation: 'count_empty'}],
search_query: '<string>',
related: {},
related_config: {},
snapshot: false
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Follow up with trip participants',
'module_id' => 1,
'hysform_id' => '<unknown>',
'sponsorships' => '<unknown>',
'type' => 'view',
'fields' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'filterGroups' => [
[
'field' => '<string>',
'operator' => '<string>',
'value' => '<unknown>',
'op' => '<string>'
]
],
'column_fields' => [
'<string>'
],
'column_order' => [
'<string>'
],
'date_range' => [
'preset' => 'all_time',
'start_date' => '2026-10-20',
'end_date' => '2026-10-20'
],
'sort_key' => '<string>',
'sort_order' => 'asc',
'footer_calculations' => [
[
'field_key' => '<string>',
'operation' => 'count_empty'
]
],
'search_query' => '<string>',
'related' => [
],
'related_config' => [
],
'snapshot' => false
]),
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}"
payload := strings.NewReader("{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.gratona.com/v1/admin/reports/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Follow up with trip participants\",\n \"module_id\": 1,\n \"hysform_id\": \"<unknown>\",\n \"sponsorships\": \"<unknown>\",\n \"type\": \"view\",\n \"fields\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"filterGroups\": [\n {\n \"field\": \"<string>\",\n \"operator\": \"<string>\",\n \"value\": \"<unknown>\",\n \"op\": \"<string>\"\n }\n ],\n \"column_fields\": [\n \"<string>\"\n ],\n \"column_order\": [\n \"<string>\"\n ],\n \"date_range\": {\n \"preset\": \"all_time\",\n \"start_date\": \"2026-10-20\",\n \"end_date\": \"2026-10-20\"\n },\n \"sort_key\": \"<string>\",\n \"sort_order\": \"asc\",\n \"footer_calculations\": [\n {\n \"field_key\": \"<string>\",\n \"operation\": \"count_empty\"\n }\n ],\n \"search_query\": \"<string>\",\n \"related\": {},\n \"related_config\": {},\n \"snapshot\": false\n}"
response = http.request(request)
puts response.read_body{
"message": "Saved successfully.",
"data": {
"id": 123,
"source": "<string>",
"type": "<string>",
"type_label": "<string>",
"name": "<string>",
"search_query": "<string>",
"snapshot": true,
"starred": true,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"module": {
"id": 123,
"key": "<string>",
"label": "<string>"
},
"context": {
"id": "<string>",
"label": "<string>",
"available": true
},
"filters": [
{
"field": "<string>",
"operator": "<string>",
"value": "<unknown>",
"op": "<string>"
}
],
"columns": {
"fields": [
"<string>"
],
"order": [
"<string>"
],
"labels": {},
"definitions": [
{
"key": "<string>",
"label": "<string>",
"type": "<string>",
"source": "<string>",
"capabilities": {},
"help": {}
}
]
},
"field_labels": {},
"date_range": {
"preset": "all_time",
"start_date": "2023-12-25",
"end_date": "2023-12-25"
},
"footer_calculations": [
{
"field_key": "<string>",
"operation": "count_empty"
}
],
"sort": {
"key": "<string>",
"order": "<string>"
},
"schedule": {},
"schedule_entitlement": {
"enabled": true,
"locked": true
},
"related": {},
"owner": {
"id": 123
},
"open": {
"path": "<string>",
"query": {}
},
"missing_fields": {},
"actions": {}
}
}{
"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."
}