curl --request POST \
--url https://api.datalyr.com/v1/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report": {
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {}
},
"name": "<string>",
"position": 1
},
"dry_run": false
}
'import requests
url = "https://api.datalyr.com/v1/reports"
payload = {
"report": {
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {}
},
"name": "<string>",
"position": 1
},
"dry_run": False
}
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({
report: {
definition: {v: 1, source: 'catalog', metric_id: '<string>', chart: {}},
name: '<string>',
position: 1
},
dry_run: false
})
};
fetch('https://api.datalyr.com/v1/reports', 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.datalyr.com/v1/reports",
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([
'report' => [
'definition' => [
'v' => 1,
'source' => 'catalog',
'metric_id' => '<string>',
'chart' => [
]
],
'name' => '<string>',
'position' => 1
],
'dry_run' => 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.datalyr.com/v1/reports"
payload := strings.NewReader("{\n \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\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.datalyr.com/v1/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datalyr.com/v1/reports")
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 \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"dry_run": true,
"applied": true,
"diff": {
"action": "<string>",
"resource": {
"type": "conversion_rule",
"id": "<string>",
"label": "<string>"
},
"prior_state": {},
"new_state": {},
"changes": [
{
"field": "<string>",
"from": "<unknown>",
"to": "<unknown>"
}
],
"effects": [
{
"type": "postback_target",
"summary": "<string>",
"platform": "<string>",
"ad_account_id": "<string>",
"asset_id": "<string>",
"asset_field": "<string>",
"endpoint_url_masked": "<string>",
"trigger_event": "<string>",
"trigger_event_source": "<string>",
"platform_event": "<string>",
"active": true,
"operation": "put",
"key": "<string>",
"path": "<string>",
"requires_approval": true,
"approver_roles": [
"<string>"
],
"review_surface": "<string>",
"supersedes": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
]
},
"audit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"dry_run": true,
"applied": true,
"diff": {
"action": "<string>",
"resource": {
"type": "conversion_rule",
"id": "<string>",
"label": "<string>"
},
"prior_state": {},
"new_state": {},
"changes": [
{
"field": "<string>",
"from": "<unknown>",
"to": "<unknown>"
}
],
"effects": [
{
"type": "postback_target",
"summary": "<string>",
"platform": "<string>",
"ad_account_id": "<string>",
"asset_id": "<string>",
"asset_field": "<string>",
"endpoint_url_masked": "<string>",
"trigger_event": "<string>",
"trigger_event_source": "<string>",
"platform_event": "<string>",
"active": true,
"operation": "put",
"key": "<string>",
"path": "<string>",
"requires_approval": true,
"approver_roles": [
"<string>"
],
"review_surface": "<string>",
"supersedes": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
]
},
"audit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"kind": "metric",
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {
"type": "line"
}
},
"position": 123,
"created_via": "dashboard",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by": {
"type": "user",
"id": "<string>",
"client_id": "<string>"
},
"deleted_at": "2023-11-07T05:31:56Z"
}
}{
"error": "<string>"
}{
"error": "<string>",
"code": "insufficient_scope",
"required_scope": "<string>"
}{
"error": "<string>",
"code": "invalid_definition",
"hint": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Create a saved report
Save a card to the workspace’s Reports page. Needs datalyr:write:reports.
For a metric, line, breakdown or donut card, pass the analytics_query plan you already ran as a query definition. For a funnel, pass steps and window_hours. Every funnel step’s event must be an event name the workspace sent in the last 30 days; otherwise the request returns 422 with code: unknown_event and the closest names.
Send dry_run: true first. The dry run returns the exact card: the validated definition, the suggested name when you sent none, and the position it would take. Without position, the card goes to the end of the board.
curl --request POST \
--url https://api.datalyr.com/v1/reports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report": {
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {}
},
"name": "<string>",
"position": 1
},
"dry_run": false
}
'import requests
url = "https://api.datalyr.com/v1/reports"
payload = {
"report": {
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {}
},
"name": "<string>",
"position": 1
},
"dry_run": False
}
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({
report: {
definition: {v: 1, source: 'catalog', metric_id: '<string>', chart: {}},
name: '<string>',
position: 1
},
dry_run: false
})
};
fetch('https://api.datalyr.com/v1/reports', 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.datalyr.com/v1/reports",
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([
'report' => [
'definition' => [
'v' => 1,
'source' => 'catalog',
'metric_id' => '<string>',
'chart' => [
]
],
'name' => '<string>',
'position' => 1
],
'dry_run' => 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.datalyr.com/v1/reports"
payload := strings.NewReader("{\n \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\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.datalyr.com/v1/reports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.datalyr.com/v1/reports")
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 \"report\": {\n \"definition\": {\n \"v\": 1,\n \"source\": \"catalog\",\n \"metric_id\": \"<string>\",\n \"chart\": {}\n },\n \"name\": \"<string>\",\n \"position\": 1\n },\n \"dry_run\": false\n}"
response = http.request(request)
puts response.read_body{
"dry_run": true,
"applied": true,
"diff": {
"action": "<string>",
"resource": {
"type": "conversion_rule",
"id": "<string>",
"label": "<string>"
},
"prior_state": {},
"new_state": {},
"changes": [
{
"field": "<string>",
"from": "<unknown>",
"to": "<unknown>"
}
],
"effects": [
{
"type": "postback_target",
"summary": "<string>",
"platform": "<string>",
"ad_account_id": "<string>",
"asset_id": "<string>",
"asset_field": "<string>",
"endpoint_url_masked": "<string>",
"trigger_event": "<string>",
"trigger_event_source": "<string>",
"platform_event": "<string>",
"active": true,
"operation": "put",
"key": "<string>",
"path": "<string>",
"requires_approval": true,
"approver_roles": [
"<string>"
],
"review_surface": "<string>",
"supersedes": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
]
},
"audit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"dry_run": true,
"applied": true,
"diff": {
"action": "<string>",
"resource": {
"type": "conversion_rule",
"id": "<string>",
"label": "<string>"
},
"prior_state": {},
"new_state": {},
"changes": [
{
"field": "<string>",
"from": "<unknown>",
"to": "<unknown>"
}
],
"effects": [
{
"type": "postback_target",
"summary": "<string>",
"platform": "<string>",
"ad_account_id": "<string>",
"asset_id": "<string>",
"asset_field": "<string>",
"endpoint_url_masked": "<string>",
"trigger_event": "<string>",
"trigger_event_source": "<string>",
"platform_event": "<string>",
"active": true,
"operation": "put",
"key": "<string>",
"path": "<string>",
"requires_approval": true,
"approver_roles": [
"<string>"
],
"review_surface": "<string>",
"supersedes": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}
]
},
"audit_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"kind": "metric",
"definition": {
"v": 1,
"source": "catalog",
"metric_id": "<string>",
"chart": {
"type": "line"
}
},
"position": 123,
"created_via": "dashboard",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"workspace_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by": {
"type": "user",
"id": "<string>",
"client_id": "<string>"
},
"deleted_at": "2023-11-07T05:31:56Z"
}
}{
"error": "<string>"
}{
"error": "<string>",
"code": "insufficient_scope",
"required_scope": "<string>"
}{
"error": "<string>",
"code": "invalid_definition",
"hint": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Retry-safe token for this create. The first request performed under a given key has its response kept for 24 hours; an identical retry returns that same response with Idempotent-Replay: true instead of creating a second resource. The record covers the request body, so reusing a key with different content is a new request rather than a replay. Ignored on a dry run, which creates nothing to be idempotent about.
255Response
Nothing was written. The body describes the change that would have been made, including every effect beyond the row itself.
False on a dry run and on every error.
The change, in full. A dry run returns the change it WOULD make; an applied write returns the change it DID make, in the same shape, so the two can be compared directly.
Show child attributes
Show child attributes
Present on an applied write. The handle POST /audit/{auditId}/undo takes.
Was this page helpful?