curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/errors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"flavourIDs": [
"<string>"
],
"assignReason": "<string>"
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/errors"
payload = {
"name": "<string>",
"description": "<string>",
"flavourIDs": ["<string>"],
"assignReason": "<string>"
}
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({
name: '<string>',
description: '<string>',
flavourIDs: ['<string>'],
assignReason: '<string>'
})
};
fetch('https://api.cloud.corbado.io/v1/observe/errors', 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.cloud.corbado.io/v1/observe/errors",
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([
'name' => '<string>',
'description' => '<string>',
'flavourIDs' => [
'<string>'
],
'assignReason' => '<string>'
]),
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.cloud.corbado.io/v1/observe/errors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\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.cloud.corbado.io/v1/observe/errors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/errors")
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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"type": "general",
"severity": "error",
"createdMs": 123,
"updatedMs": 123,
"description": "<string>",
"subFlowType": "<string>",
"recommendation": {
"id": "<string>",
"action": "ignore",
"summary": "<string>",
"source": "manual",
"createdMs": 123,
"updatedMs": 123,
"explanation": "<string>",
"reproduction": "<string>",
"fixDetails": "<string>",
"annotationID": "<string>",
"annotation": {
"id": "<string>",
"headline": "<string>",
"dateMs": 123,
"createdMs": 123,
"updatedMs": 123,
"description": "<string>"
},
"assets": [
{
"id": "<string>",
"fileName": "<string>",
"contentType": "<string>",
"sizeBytes": 123,
"status": "pending",
"createdMs": 123
}
]
},
"lastImpact": {
"analyzedAtMs": 123,
"fromDate": "<string>",
"toDate": "<string>",
"baselineMode": "<string>",
"affectedFlowCount": 123,
"baselineFlowCount": 123,
"affectedCompletionRate": 123,
"baselineCompletionRate": 123,
"completionLift": 123,
"affectedCompletedDurationP50Ms": 123,
"baselineCompletedDurationP50Ms": 123,
"perFlowType": [
{
"flowType": "<string>",
"affectedFlowCount": 123,
"attemptCount": 123,
"completionLift": 123
}
],
"subflowCode": "<string>",
"subflowCompletionDefinitional": true,
"affectedSubflowCompletionRate": 123,
"baselineSubflowCompletionRate": 123,
"subflowCompletionLift": 123
}
}{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Create error
Creates a curated error, optionally assigning an initial set of flavours to it in the same request.
Required API key permission: observe:errors:write.
curl --request POST \
--url https://api.cloud.corbado.io/v1/observe/errors \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"flavourIDs": [
"<string>"
],
"assignReason": "<string>"
}
'import requests
url = "https://api.cloud.corbado.io/v1/observe/errors"
payload = {
"name": "<string>",
"description": "<string>",
"flavourIDs": ["<string>"],
"assignReason": "<string>"
}
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({
name: '<string>',
description: '<string>',
flavourIDs: ['<string>'],
assignReason: '<string>'
})
};
fetch('https://api.cloud.corbado.io/v1/observe/errors', 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.cloud.corbado.io/v1/observe/errors",
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([
'name' => '<string>',
'description' => '<string>',
'flavourIDs' => [
'<string>'
],
'assignReason' => '<string>'
]),
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.cloud.corbado.io/v1/observe/errors"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\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.cloud.corbado.io/v1/observe/errors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cloud.corbado.io/v1/observe/errors")
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 \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"flavourIDs\": [\n \"<string>\"\n ],\n \"assignReason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"type": "general",
"severity": "error",
"createdMs": 123,
"updatedMs": 123,
"description": "<string>",
"subFlowType": "<string>",
"recommendation": {
"id": "<string>",
"action": "ignore",
"summary": "<string>",
"source": "manual",
"createdMs": 123,
"updatedMs": 123,
"explanation": "<string>",
"reproduction": "<string>",
"fixDetails": "<string>",
"annotationID": "<string>",
"annotation": {
"id": "<string>",
"headline": "<string>",
"dateMs": 123,
"createdMs": 123,
"updatedMs": 123,
"description": "<string>"
},
"assets": [
{
"id": "<string>",
"fileName": "<string>",
"contentType": "<string>",
"sizeBytes": 123,
"status": "pending",
"createdMs": 123
}
]
},
"lastImpact": {
"analyzedAtMs": 123,
"fromDate": "<string>",
"toDate": "<string>",
"baselineMode": "<string>",
"affectedFlowCount": 123,
"baselineFlowCount": 123,
"affectedCompletionRate": 123,
"baselineCompletionRate": 123,
"completionLift": 123,
"affectedCompletedDurationP50Ms": 123,
"baselineCompletedDurationP50Ms": 123,
"perFlowType": [
{
"flowType": "<string>",
"affectedFlowCount": 123,
"attemptCount": 123,
"completionLift": 123
}
],
"subflowCode": "<string>",
"subflowCompletionDefinitional": true,
"affectedSubflowCompletionRate": 123,
"baselineSubflowCompletionRate": 123,
"subflowCompletionLift": 123
}
}{
"error": {
"message": "Validation failed",
"details": [
{
"field": "projectID",
"message": "required"
}
]
}
}Authorizations
Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.
Body
Human-readable error name.
Optional longer description of the error.
Error type; defaults to project-specific.
general, project-specific Triage severity; defaults to error.
error, warn, info Optional initial set of flavours to assign to the new error (format erf-<number>). Must all share one
subflow type, which becomes the error's auto-stamped scope.
1000Provenance of the initial flavour assignment (defaults to manual). Only allowed together with flavourIDs.
manual, kb, agent Human-readable explanation of why the initial flavours belong to this error; stored per flavour. Only allowed together with flavourIDs.
Response
Error created.
Error ID (format err-<number>).
Human-readable error name.
Whether the error is a general (cross-deployment) or project-specific one.
general, project-specific User-declared triage severity of an occurrence of this error.
error, warn, info Creation time in milliseconds since epoch.
Last update time in milliseconds since epoch.
Optional longer description of the error.
Auto-managed subflow scope — stamped from the first assigned flavours, enforced on every later assignment (an error never mixes subflow types), cleared when the last member is unassigned. Never user input. Absent while the error has no members.
Curated guidance attached to an error (at most one per error): what the error is and how to reproduce it, the recommended handling (ignore / observe / fix), and — for fix — the fix in detail. Human-created like the error itself; classification never writes it. Free-text fields are markdown.
Show child attributes
Show child attributes
Result of the most recent impact analysis run for this error: the completion-rate and completed-duration comparison against the baseline, plus when it ran and over which range. Stored when the impact endpoint is called with the error's ID; absent while no analysis ran (or the error lost its last member flavour since). Numbers describe the member set at analysis time — analyzedAtMs says how current they are.
Show child attributes
Show child attributes
Was this page helpful?