Report presets
curl --request GET \
--url http://api.gu1.ai/report-presets \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'X-Organization-ID: <x-organization-id>' \
--data '
{
"name": "<string>",
"description": "<string>",
"templateCode": "<string>",
"params": {},
"delivery": "<string>",
"recipientEmails": [
"<string>"
],
"format": "<string>"
}
'import requests
url = "http://api.gu1.ai/report-presets"
payload = {
"name": "<string>",
"description": "<string>",
"templateCode": "<string>",
"params": {},
"delivery": "<string>",
"recipientEmails": ["<string>"],
"format": "<string>"
}
headers = {
"Authorization": "<authorization>",
"X-Organization-ID": "<x-organization-id>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
Authorization: '<authorization>',
'X-Organization-ID': '<x-organization-id>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
description: '<string>',
templateCode: '<string>',
params: {},
delivery: '<string>',
recipientEmails: ['<string>'],
format: '<string>'
})
};
fetch('http://api.gu1.ai/report-presets', 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 => "http://api.gu1.ai/report-presets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'templateCode' => '<string>',
'params' => [
],
'delivery' => '<string>',
'recipientEmails' => [
'<string>'
],
'format' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"X-Organization-ID: <x-organization-id>"
],
]);
$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 := "http://api.gu1.ai/report-presets"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("X-Organization-ID", "<x-organization-id>")
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.get("http://api.gu1.ai/report-presets")
.header("Authorization", "<authorization>")
.header("X-Organization-ID", "<x-organization-id>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/report-presets")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
request["X-Organization-ID"] = '<x-organization-id>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyReport presets
Save editable org-scoped Gu1 report configurations for one-click download and scheduled send_report automations.
GET
/
report-presets
Report presets
curl --request GET \
--url http://api.gu1.ai/report-presets \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'X-Organization-ID: <x-organization-id>' \
--data '
{
"name": "<string>",
"description": "<string>",
"templateCode": "<string>",
"params": {},
"delivery": "<string>",
"recipientEmails": [
"<string>"
],
"format": "<string>"
}
'import requests
url = "http://api.gu1.ai/report-presets"
payload = {
"name": "<string>",
"description": "<string>",
"templateCode": "<string>",
"params": {},
"delivery": "<string>",
"recipientEmails": ["<string>"],
"format": "<string>"
}
headers = {
"Authorization": "<authorization>",
"X-Organization-ID": "<x-organization-id>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {
Authorization: '<authorization>',
'X-Organization-ID': '<x-organization-id>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: '<string>',
description: '<string>',
templateCode: '<string>',
params: {},
delivery: '<string>',
recipientEmails: ['<string>'],
format: '<string>'
})
};
fetch('http://api.gu1.ai/report-presets', 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 => "http://api.gu1.ai/report-presets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'templateCode' => '<string>',
'params' => [
],
'delivery' => '<string>',
'recipientEmails' => [
'<string>'
],
'format' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"X-Organization-ID: <x-organization-id>"
],
]);
$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 := "http://api.gu1.ai/report-presets"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("X-Organization-ID", "<x-organization-id>")
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.get("http://api.gu1.ai/report-presets")
.header("Authorization", "<authorization>")
.header("X-Organization-ID", "<x-organization-id>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://api.gu1.ai/report-presets")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
request["X-Organization-ID"] = '<x-organization-id>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"templateCode\": \"<string>\",\n \"params\": {},\n \"delivery\": \"<string>\",\n \"recipientEmails\": [\n \"<string>\"\n ],\n \"format\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyOverview
A report preset stores a Gu1 report template configuration for your organization (name + templateCode + params). After create you can edit name, description, and params; templateCode stays fixed. You can also list, get, run, or delete.
| Method | Path | Use |
|---|---|---|
GET | /report-presets | List presets for the org |
GET | /report-presets/{id} | Detail |
POST | /report-presets | Create (name + template + params) |
PATCH | /report-presets/{id} | Update name, description, and/or params |
DELETE | /report-presets/{id} | Hard delete |
POST | /report-presets/{id}/run | Run with saved params (download or email) |
jobId). Download later from Reporting Descargables / Report export jobs. Saved params may include emailLocale, format (csv / pdf / xlsx per template), and other fields (lookbackDays, ruleIds, filters).
Authentication and tenant
string
required
Bearer YOUR_API_KEY β see Authentication.string
required
Production or sandbox organization UUID β see Environments.
Permissions
| Endpoint | Granular permission |
|---|---|
GET list / get | reports:read |
POST create / run, PATCH, DELETE | reports:export |
Create
POST http://api.gu1.ai/report-presets
string
required
Display name (1β120 characters). Must be unique within the organization (case-insensitive).
string
Optional note for your team (max 500 characters).
string
required
Code from the Gu1 catalog (for example
alerts_by_rules).object
Template params (
lookbackDays, ruleIds, emailLocale, format, filters, etc.). Validated against the template.paramsSummary (rule names, lookback) for UI. At run time, live params UUIDs are used; missing rules are skipped by the runner.
Example
{
"name": "CBU/CVU account threshold",
"description": "Monthly ops review",
"templateCode": "alerts_by_rules",
"params": {
"lookbackDays": 30,
"ruleIds": ["aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"]
}
}
201 response
{
"success": true,
"preset": {
"id": "β¦",
"organizationId": "β¦",
"name": "CBU/CVU account threshold",
"templateCode": "alerts_by_rules",
"params": { "lookbackDays": 30, "ruleIds": ["β¦"] },
"paramsSummary": {
"lookbackDays": 30,
"ruleLabels": ["Total accounts"],
"lines": ["Last 30 days", "Rules: Total accounts"]
},
"createdAt": "2026-08-06T12:00:00.000Z"
}
}
Errors
| Code | Status | Meaning |
|---|---|---|
REPORT_TEMPLATE_NOT_FOUND | 400 | Unknown templateCode |
REPORT_PRESET_NAME_EXISTS | 409 | Duplicate name in org |
REPORT_PRESET_LIMIT | 400 | Cap of 50 reached |
REPORT_PRESET_NOT_FOUND | 404 | Unknown id for this org |
Update
PATCH http://api.gu1.ai/report-presets/{id}
name, description, or params is required. templateCode cannot change. params are re-validated against the existing template.
string
New name (1β120). Must remain unique in the org.
string
New description (max 500) or
null to clear.object
Full params to persist (replacement, not a partial merge of omitted keys).
Run
POST http://api.gu1.ai/report-presets/{id}/run
POST /report-templates/{code}/run with saved params.
string
download (default) or email.string[]
Required when
delivery is email.string
Optional:
csv, xlsx, or pdf (must be supported by the template). If omitted, uses params.format or the template default.presetId). Always queues a background job. Poll or download via Report export jobs.
Automations
In Reporting, Schedule deep-links to the workflow builder withreportPresetId (canonical). Use automation action send_report / Generar reporte with reportPresetId and optional sendEmail + recipientEmails; legacy reportTemplateCode + params still works.Was this page helpful?