curl --request GET \
--url https://app.demand-iq.com/api/notifications/events \
--cookie session=import requests
url = "https://app.demand-iq.com/api/notifications/events"
headers = {"cookie": "session="}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {cookie: 'session='}};
fetch('https://app.demand-iq.com/api/notifications/events', 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://app.demand-iq.com/api/notifications/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_COOKIE => "session=",
]);
$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://app.demand-iq.com/api/notifications/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cookie", "session=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.demand-iq.com/api/notifications/events")
.header("cookie", "session=")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.demand-iq.com/api/notifications/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["cookie"] = 'session='
response = http.request(request)
puts response.read_body{
"events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"eventType": "<string>",
"aggregateType": "<string>",
"aggregateId": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"payload": {},
"recipientEmail": "<string>",
"skipReason": "no_email",
"variant": "initial",
"machineOpen": true,
"archivedAt": "2023-11-07T05:31:56Z"
}
],
"page": {
"limit": 123,
"hasMore": true,
"nextCursor": "<string>"
}
}{
"error": "<string>"
}{
"error": "<string>"
}List event log
Returns a keyset-paginated, filterable log of all events for the organization, ordered by occurredAt descending with id as the tiebreaker. Page forward by passing the previous response’s page.nextCursor as cursor; poll for new activity with recent=1. Unknown query parameters (including the removed offset) are rejected with a 400. email.sent entries include top-level recipientEmail, skipReason, and variant fields resolved from the delivery attempt; event payloads themselves carry identifiers only, never email addresses. email.opened entries include a top-level machineOpen flag: true when every open SendGrid reported for the delivery was automatic (for example, an Apple Mail Privacy Protection prefetch), so the UI can label them as Email Opened (automatic). Entries older than 90 days stay in the log with archivedAt set and their payloads reduced to identifier and classification fields; question and answer text is removed at that point.
When aggregateId is set to a presentation UUID, the response may include a derived presentation.link_opened entry synthesized from firstViewedAt. It rides along as an extra row rather than taking a page slot, so it never displaces a stored row and never becomes a nextCursor. Its id is presentation.link_opened:{presentationId} and its payload is { presentationId }. Every presentation that has been opened at least once carries this line, including presentations opened before the derivation shipped.
curl --request GET \
--url https://app.demand-iq.com/api/notifications/events \
--cookie session=import requests
url = "https://app.demand-iq.com/api/notifications/events"
headers = {"cookie": "session="}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {cookie: 'session='}};
fetch('https://app.demand-iq.com/api/notifications/events', 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://app.demand-iq.com/api/notifications/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_COOKIE => "session=",
]);
$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://app.demand-iq.com/api/notifications/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("cookie", "session=")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.demand-iq.com/api/notifications/events")
.header("cookie", "session=")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.demand-iq.com/api/notifications/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["cookie"] = 'session='
response = http.request(request)
puts response.read_body{
"events": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"eventType": "<string>",
"aggregateType": "<string>",
"aggregateId": "<string>",
"occurredAt": "2023-11-07T05:31:56Z",
"payload": {},
"recipientEmail": "<string>",
"skipReason": "no_email",
"variant": "initial",
"machineOpen": true,
"archivedAt": "2023-11-07T05:31:56Z"
}
],
"page": {
"limit": 123,
"hasMore": true,
"nextCursor": "<string>"
}
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Session cookie obtained from POST /api/auth/login.
Query Parameters
Filter by event type
Comma-separated list of event types to omit. Use this to hide a high-volume type (for example, narration.played) from an activity feed rather than allowlisting every other type.
500Page size. Rejected with 400 if above the cap; never clamped.
1 <= x <= 100Opaque, server-authored keyset cursor from a previous response's page.nextCursor. Returns rows strictly older than the anchor row. Mutually exclusive with recent.
512Poll mode. Returns only rows from the last 90 seconds on the server clock. Mutually exclusive with cursor.
1