List
List all alerts for your account.
This endpoint supports a number of filters, which can help find alerts matching certain criteria. These filters work similarly to the filters on the incidents endpoint, where a field is specified alongside a comparison operator in the query string.
Note that:
- Filters may be used together, and the result will be alerts that match all filters.
- All query parameters must be URI encoded.
By deduplication_key
Find all alerts with deduplication_key ABC:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'deduplication_key[is]=ABC'
By status
Find all alerts in a firing state:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'status[one_of]=firing'
By alert_source
Find all alerts from a specific alert source (by alert source ID):
curl --get 'https://api.incident.io/v2/alerts' \
--data 'alert_source[one_of]=01GBSQF3FHF7FWZQNWGHAVQ804'
Find all alerts not from a specific alert source:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'alert_source[not_in]=01GBSQF3FHF7FWZQNWGHAVQ804'
By alert_group_id
Find all alerts in a specific alert group:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'alert_group_id[one_of]=01GBSQF3FHF7FWZQNWGHAVQ804'
By created_at
Find all alerts that follow specified date parameters for created_at field. Possible values are “gte” (greater than or equal to), “lte” (less than or equal to), and “date_range” (between two dates). The following example finds all alerts created after 2025-01-01:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'created_at[gte]=2025-01-01'
To find alerts created within a specific date range, use the date_range option with tilde-separated dates:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'created_at[date_range]=2024-12-02~2024-12-08'
By updated_at
Find all alerts that follow specified date parameters for updated_at field, using the same “gte”, “lte” and “date_range” operators as created_at. This is useful for incrementally syncing alerts: poll with updated_at[gte] set to your last sync time instead of re-fetching the full history. Note that updated_at moves whenever the alert row is written, which can happen without a visible change to the alert payload, so treat matches as candidates to re-fetch rather than guaranteed changes — and overlap your sync window by a few minutes to allow for writes that commit out of timestamp order:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'updated_at[gte]=2025-01-01T00:00:00Z'
By has_notes
Find all alerts that have notes attached:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'has_notes[is]=true'
Find all alerts that have no notes attached:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'has_notes[is]=false'
By tags
Filter by tag name, matched case-insensitively.
Find all alerts that have any of the given tags:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'tags[one_of]=known issue'
Find all alerts that have all of the given tags:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'tags[all_of]=known issue' \
--data 'tags[all_of]=customer impacting'
Find all alerts that do not have any of the given tags. Untagged alerts are included:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'tags[not_in]=known issue'
By attributes
Alerts can be filtered by their attribute values. Each filter is keyed by the alert attribute ID, followed by an operator and the values to match. The accepted operators depend on the attribute’s type.
Find all alerts where attribute 01GBSQF3FHF7FWZQNWGHAVQ804 is one of two catalog entries:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'attributes[01GBSQF3FHF7FWZQNWGHAVQ804][one_of]=01GBSQF3FHF7FWZQNWGHAVQ804' \
--data 'attributes[01GBSQF3FHF7FWZQNWGHAVQ804][one_of]=01ET65M7ZARSFZ6TFDFVQDN9AA'
You can filter on multiple attributes at once, and the result will be alerts that match all of them.
Maintenance windows
By default, all alerts are returned including those held by a maintenance window. To exclude alerts that are held by a maintenance window:
curl --get 'https://api.incident.io/v2/alerts' \
--data 'include_maintenance_window[is]=false'
curl --request GET \
--url https://api.incident.io/v2/alerts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.incident.io/v2/alerts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.incident.io/v2/alerts', 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.incident.io/v2/alerts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.incident.io/v2/alerts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.incident.io/v2/alerts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.incident.io/v2/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"alerts": [
{
"alert_group_ids": [
"01GW2G3V0S59R238FAHPDS1R66"
],
"alert_source_id": "01GW2G3V0S59R238FAHPDS1R66",
"attributes": [
{
"array_value": [
{
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
],
"attribute": {
"array": false,
"emoji": "fire",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "service",
"required": false,
"type": "CatalogEntry[\"01GW2G3V0S59R238FAHPDS1R67\"]"
},
"value": {
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
}
],
"created_at": "2021-08-17T13:28:57.801578Z",
"deduplication_key": "4293868629",
"description": "CPU on the payments service has exceeded 75 percent for 5 minutes",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"resolved_at": "2021-08-17T14:28:57.801578Z",
"source_url": "https://www.my-alerting-platform.com/alerts/my-alert-123",
"status": "firing",
"tags": [
{
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "noisy"
}
],
"title": "*errors.withMessage: PG::Error failed to connect",
"updated_at": "2021-08-17T13:28:57.801578Z"
}
],
"pagination_meta": {
"after": "01FCNDV6P870EA6S7TK1DSYDG0",
"page_size": 25
}
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}- Filters may be used together, and the result will be alerts that match all filters.
- All query parameters must be URI encoded.
By deduplication_key
Find all alerts with deduplication_key ABC:curl --get 'https://api.incident.io/v2/alerts' \
--data 'deduplication_key[is]=ABC'
By status
Find all alerts in a firing state:curl --get 'https://api.incident.io/v2/alerts' \
--data 'status[one_of]=firing'
By alert_source
Find all alerts from a specific alert source (by alert source ID):curl --get 'https://api.incident.io/v2/alerts' \
--data 'alert_source[one_of]=01GBSQF3FHF7FWZQNWGHAVQ804'
curl --get 'https://api.incident.io/v2/alerts' \
--data 'alert_source[not_in]=01GBSQF3FHF7FWZQNWGHAVQ804'
By created_at
Find all alerts that follow specified date parameters for created_at field. Possible values are “gte” (greater than or equal to), “lte” (less than or equal to), and “date_range” (between two dates). The following example finds all alerts created after 2025-01-01:curl --get 'https://api.incident.io/v2/alerts' \
--data 'created_at[gte]=2025-01-01'
curl --get 'https://api.incident.io/v2/alerts' \
--data 'created_at[date_range]=2024-12-02~2024-12-08'
By updated_at
Find all alerts by when they were last updated. This takes the same “gte”, “lte” and “date_range” operators as created_at. The following example finds all alerts updated since the start of 2025:curl --get 'https://api.incident.io/v2/alerts' \
--data 'updated_at[gte]=2025-01-01T00:00:00Z'
updated_at[gte] set to the time of your last sync, and page through the
results as described below.
Two things to keep in mind when syncing this way:
updated_atmoves whenever we write the alert, which can happen without a visible change to the alert payload. Treat a match as a candidate to re-fetch, not a guaranteed change.- Start each sync window a few minutes before your last sync time. Writes can commit out of timestamp order, and the overlap stops those from being missed.
Maintenance windows
By default, all alerts are returned including those held by a maintenance window. To exclude alerts that are held by a maintenance window:curl --get 'https://api.incident.io/v2/alerts' \
--data 'include_maintenance_window[is]=false'
Pagination
The list endpoint is paginated. Every response includes apagination_meta object, and
the field that drives paging is after:
page_size— the maximum number of results in this page (defaults to 25, up to 50).after— the cursor for the next page. Ifafteris present there are more results to fetch; if it’s absent, you’ve reached the end.
after value as the after parameter. Using the largest page_size
(50) minimises the number of requests:
# First page
curl --get 'https://api.incident.io/v2/alerts' \
--data 'status[one_of]=firing' \
--data 'page_size=50'
# Next page: pass the `after` cursor returned in the previous response's pagination_meta
curl --get 'https://api.incident.io/v2/alerts' \
--data 'status[one_of]=firing' \
--data 'page_size=50' \
--data 'after=01FCNDV6P870EA6S7TK1DSYDG0'
after cursor.
alerts array does not mean there are no matching alerts.When filters are applied, an individual page can return an empty alerts array while
pagination_meta.after is still present. That means “no matches on this page yet, but
there are more results to scan” — it does not mean there are no alerts.Always keep requesting pages until after is absent. Stopping at the first empty page
will cause you to miss alerts. Note that total_record_count is not returned for this
endpoint, so the presence of after is the only signal that more results remain.Authorizations
API key from your incident.io dashboard (Settings → API keys)
Query Parameters
Number of alerts to return per page
1 <= x <= 5025
If provided, pass this as the 'after' param to load the next page
"01FCNDV6P870EA6S7TK1DSYDG0"
Filter on alert deduplication key. The accepted operator is 'is'.
Show child attributes
Show child attributes
{ "is": ["01GBSQF3FHF7FWZQNWGHAVQ804"] }
Filter on alert status. The accepted operators are 'one_of', or 'not_in'.
Show child attributes
Show child attributes
{ "one_of": ["firing"] }
Filter on alert source by ID. The accepted operators are 'one_of', or 'not_in'.
Show child attributes
Show child attributes
{ "one_of": ["01GBSQF3FHF7FWZQNWGHAVQ804"] }
Filter on alert group ID. Returns alerts that belong to any of the specified groups. The accepted operator is 'one_of'.
Show child attributes
Show child attributes
{ "one_of": ["01GBSQF3FHF7FWZQNWGHAVQ804"] }
Filter on alert created at timestamp. Accepted operators are 'gte', 'lte' and 'date_range'.
Show child attributes
Show child attributes
{ "gte": ["2025-01-01"] }
Filter on alert updated at timestamp. Accepted operators are 'gte', 'lte' and 'date_range'.
Show child attributes
Show child attributes
{ "gte": ["2025-01-01"] }
Filter on an alerts attributes. Alert attribute ID should be sent, followed by the operator and values. Accepted operator will depend on the attribute type.
Show child attributes
Show child attributes
{
"01GBSQF3FHF7FWZQNWGHAVQ804": {
"one_of": [
"01GBSQF3FHF7FWZQNWGHAVQ804",
"01ET65M7ZARSFZ6TFDFVQDN9AA"
]
}
}
Filter on whether an alert has notes. The accepted operator is 'is'.
Show child attributes
Show child attributes
{ "is": ["true"] }
Filter on the tags applied to an alert, by tag name. The accepted operators are 'one_of', 'all_of' and 'not_in'.
Show child attributes
Show child attributes
{ "one_of": ["known issue"] }
Filter on whether to include maintenance window alerts. The accepted operator is 'is'.
Show child attributes
Show child attributes
{ "is": ["true"] }
Response
OK response.
Show child attributes
Show child attributes
[
{
"alert_group_ids": ["01GW2G3V0S59R238FAHPDS1R66"],
"alert_source_id": "01GW2G3V0S59R238FAHPDS1R66",
"attributes": [
{
"array_value": [
{
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
],
"attribute": {
"array": false,
"emoji": "fire",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "service",
"required": false,
"type": "CatalogEntry[\"01GW2G3V0S59R238FAHPDS1R67\"]"
},
"value": {
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
}
],
"created_at": "2021-08-17T13:28:57.801578Z",
"deduplication_key": "4293868629",
"description": "CPU on the payments service has exceeded 75 percent for 5 minutes",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"resolved_at": "2021-08-17T14:28:57.801578Z",
"source_url": "https://www.my-alerting-platform.com/alerts/my-alert-123",
"status": "firing",
"tags": [
{
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "noisy"
}
],
"title": "*errors.withMessage: PG::Error failed to connect",
"updated_at": "2021-08-17T13:28:57.801578Z"
}
]
Show child attributes
Show child attributes
{
"after": "01FCNDV6P870EA6S7TK1DSYDG0",
"page_size": 25
}
Was this page helpful?
curl --request GET \
--url https://api.incident.io/v2/alerts \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.incident.io/v2/alerts"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.incident.io/v2/alerts', 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.incident.io/v2/alerts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.incident.io/v2/alerts"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.incident.io/v2/alerts")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.incident.io/v2/alerts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"alerts": [
{
"alert_group_ids": [
"01GW2G3V0S59R238FAHPDS1R66"
],
"alert_source_id": "01GW2G3V0S59R238FAHPDS1R66",
"attributes": [
{
"array_value": [
{
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
],
"attribute": {
"array": false,
"emoji": "fire",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "service",
"required": false,
"type": "CatalogEntry[\"01GW2G3V0S59R238FAHPDS1R67\"]"
},
"value": {
"catalog_entry": {
"catalog_type_id": "01FCNDV6P870EA6S7TK1DSYDG0",
"id": "01FCNDV6P870EA6S7TK1DSYDG0",
"name": "Primary On-call"
},
"label": "Payments Team",
"literal": "SEV123"
}
}
],
"created_at": "2021-08-17T13:28:57.801578Z",
"deduplication_key": "4293868629",
"description": "CPU on the payments service has exceeded 75 percent for 5 minutes",
"id": "01GW2G3V0S59R238FAHPDS1R66",
"resolved_at": "2021-08-17T14:28:57.801578Z",
"source_url": "https://www.my-alerting-platform.com/alerts/my-alert-123",
"status": "firing",
"tags": [
{
"id": "01GW2G3V0S59R238FAHPDS1R66",
"name": "noisy"
}
],
"title": "*errors.withMessage: PG::Error failed to connect",
"updated_at": "2021-08-17T13:28:57.801578Z"
}
],
"pagination_meta": {
"after": "01FCNDV6P870EA6S7TK1DSYDG0",
"page_size": 25
}
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}{
"debug": {
"message": "Something broke: and something else: and something else",
"stacktrace": [
"thing.go:123"
]
},
"errors": [
{
"code": "trial_expired",
"message": "Default incident call link must be a valid URL",
"metadata": {
"abc123": "abc123"
},
"source": {
"field": "default_call_url",
"pointer": "/settings/default_call_url"
}
}
],
"rate_limit": {
"limit": 100,
"name": "client_ip",
"remaining": 98,
"retry_after": "2020-01-01T00:00:00Z"
},
"request_id": "2T1p0e3j",
"status": 408,
"type": "invalid_request_error"
}