Schedule a report
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}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient_emails": [
"jsmith@example.com"
],
"frequency": "<string>",
"date_time": "2026-10-20T09:00:00Z",
"start_date": "2026-10-20T09:00:00Z",
"timezone": "<string>",
"schedule": {
"kind": "instant",
"localDatetime": "<string>",
"timezone": "<string>",
"offsetMinutes": 1,
"utcAt": "<string>",
"source": "calendar"
},
"duration": 1,
"export_locale": "en"
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/schedule"
payload = {
"recipient_emails": ["jsmith@example.com"],
"frequency": "<string>",
"date_time": "2026-10-20T09:00:00Z",
"start_date": "2026-10-20T09:00:00Z",
"timezone": "<string>",
"schedule": {
"kind": "instant",
"localDatetime": "<string>",
"timezone": "<string>",
"offsetMinutes": 1,
"utcAt": "<string>",
"source": "calendar"
},
"duration": 1,
"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({
recipient_emails: ['jsmith@example.com'],
frequency: '<string>',
date_time: '2026-10-20T09:00:00Z',
start_date: '2026-10-20T09:00:00Z',
timezone: '<string>',
schedule: {
kind: 'instant',
localDatetime: '<string>',
timezone: '<string>',
offsetMinutes: 1,
utcAt: '<string>',
source: 'calendar'
},
duration: 1,
export_locale: 'en'
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/schedule', 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}/schedule",
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([
'recipient_emails' => [
'jsmith@example.com'
],
'frequency' => '<string>',
'date_time' => '2026-10-20T09:00:00Z',
'start_date' => '2026-10-20T09:00:00Z',
'timezone' => '<string>',
'schedule' => [
'kind' => 'instant',
'localDatetime' => '<string>',
'timezone' => '<string>',
'offsetMinutes' => 1,
'utcAt' => '<string>',
'source' => 'calendar'
],
'duration' => 1,
'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}/schedule"
payload := strings.NewReader("{\n \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\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}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\n \"export_locale\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/schedule")
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 \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\n \"export_locale\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"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": "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.
1Required without schedule. daily, weekly, biweekly, monthly, quarterly, 3_months, semiannual, 6_months, annual, 1_year, once, or legacy numeric 0-7/14.
Legacy start timestamp required without schedule.
"2026-10-20T09:00:00Z"
Validation: nullable|date.
"2026-10-20T09:00:00Z"
Validation: nullable|string|max:64.
64Structured schedule-intent.v1 instant or recurrence. Explicit weekdays are not supported. Local time, timezone, UTC instant and offset must agree.
- Option 1
- Option 2
Show child attributes
Show child attributes
Validation: nullable|integer.
1
en, es, fr, de, nl, ar, zhCn, null "en"
Response
Schedule a report response.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.gratona.com/v1/admin/reports/{id}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"recipient_emails": [
"jsmith@example.com"
],
"frequency": "<string>",
"date_time": "2026-10-20T09:00:00Z",
"start_date": "2026-10-20T09:00:00Z",
"timezone": "<string>",
"schedule": {
"kind": "instant",
"localDatetime": "<string>",
"timezone": "<string>",
"offsetMinutes": 1,
"utcAt": "<string>",
"source": "calendar"
},
"duration": 1,
"export_locale": "en"
}
'import requests
url = "https://api.gratona.com/v1/admin/reports/{id}/schedule"
payload = {
"recipient_emails": ["jsmith@example.com"],
"frequency": "<string>",
"date_time": "2026-10-20T09:00:00Z",
"start_date": "2026-10-20T09:00:00Z",
"timezone": "<string>",
"schedule": {
"kind": "instant",
"localDatetime": "<string>",
"timezone": "<string>",
"offsetMinutes": 1,
"utcAt": "<string>",
"source": "calendar"
},
"duration": 1,
"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({
recipient_emails: ['jsmith@example.com'],
frequency: '<string>',
date_time: '2026-10-20T09:00:00Z',
start_date: '2026-10-20T09:00:00Z',
timezone: '<string>',
schedule: {
kind: 'instant',
localDatetime: '<string>',
timezone: '<string>',
offsetMinutes: 1,
utcAt: '<string>',
source: 'calendar'
},
duration: 1,
export_locale: 'en'
})
};
fetch('https://api.gratona.com/v1/admin/reports/{id}/schedule', 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}/schedule",
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([
'recipient_emails' => [
'jsmith@example.com'
],
'frequency' => '<string>',
'date_time' => '2026-10-20T09:00:00Z',
'start_date' => '2026-10-20T09:00:00Z',
'timezone' => '<string>',
'schedule' => [
'kind' => 'instant',
'localDatetime' => '<string>',
'timezone' => '<string>',
'offsetMinutes' => 1,
'utcAt' => '<string>',
'source' => 'calendar'
],
'duration' => 1,
'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}/schedule"
payload := strings.NewReader("{\n \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\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}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\n \"export_locale\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/reports/{id}/schedule")
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 \"recipient_emails\": [\n \"jsmith@example.com\"\n ],\n \"frequency\": \"<string>\",\n \"date_time\": \"2026-10-20T09:00:00Z\",\n \"start_date\": \"2026-10-20T09:00:00Z\",\n \"timezone\": \"<string>\",\n \"schedule\": {\n \"kind\": \"instant\",\n \"localDatetime\": \"<string>\",\n \"timezone\": \"<string>\",\n \"offsetMinutes\": 1,\n \"utcAt\": \"<string>\",\n \"source\": \"calendar\"\n },\n \"duration\": 1,\n \"export_locale\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"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": "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."
}