curl --request GET \
--url https://api.example.com/v0/changes \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/v0/changes"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/v0/changes', 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.example.com/v0/changes",
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.example.com/v0/changes"
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.example.com/v0/changes")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/changes")
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{
"items": [
{
"event_id": "<string>",
"type": "<string>",
"schema_version": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"resource": {
"kind": "<string>",
"id": "<string>",
"corpus_id": "<string>"
},
"cursor": "<string>",
"monitoring": {
"match_id": "<string>",
"record_id": "<string>",
"record_version_id": "<string>",
"subscription_id": "<string>",
"subscription_version_id": "<string>",
"delivery_id": "<string>",
"previous_match_id": "<string>",
"owner": "<string>"
}
}
],
"next_cursor": "<string>",
"has_more": true
}{
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"trace_id": "<string>",
"span_id": "<string>",
"field": "<string>",
"resync_url": "<string>"
}Poll changes
Same durable journal as SSE. Every durable event has one identity and appears exactly once in a forward cursor traversal, in stable order with per-Record order preserved. Concurrent writes to different Records need not appear in exact commit order. Reusing an older cursor can redeliver events. Without cursor, return empty items and an exact start-now cursor, excluding already committed changes while retaining then-in-flight writes. Readers advance only through a safe published prefix; aborted allocations may leave gaps. In healthy parallel mode, publication delay is bounded by the longest configured engine transaction timeout (30 seconds by default) plus two 100 ms publisher polls. Outside long-running or prepared transactions and database unavailability can delay publication; readers fail closed rather than skip late commits. Cursor binds Organization, Corpus filter and authorization scope. Expiry is 410 cursor_expired with resync_url, never silent reset; changed scope/filter is 409 cursor_scope_changed with resync_url. resync_url is the API-relative Record catalog route for the Corpus (/v0/records?corpus_id=…). next_cursor advances over scanned events even when none are visible. Public events are invalidations; reread current state, do not replay historical content into a current mirror.
curl --request GET \
--url https://api.example.com/v0/changes \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/v0/changes"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/v0/changes', 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.example.com/v0/changes",
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.example.com/v0/changes"
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.example.com/v0/changes")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/changes")
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{
"items": [
{
"event_id": "<string>",
"type": "<string>",
"schema_version": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"resource": {
"kind": "<string>",
"id": "<string>",
"corpus_id": "<string>"
},
"cursor": "<string>",
"monitoring": {
"match_id": "<string>",
"record_id": "<string>",
"record_version_id": "<string>",
"subscription_id": "<string>",
"subscription_version_id": "<string>",
"delivery_id": "<string>",
"previous_match_id": "<string>",
"owner": "<string>"
}
}
],
"next_cursor": "<string>",
"has_more": true
}{
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"trace_id": "<string>",
"span_id": "<string>",
"field": "<string>",
"resync_url": "<string>"
}