curl --request GET \
--url https://api.checkfu.com/v1/sessions/{id}/screened-messages \
--header 'Authorization: Bearer <token>' \
--header 'checkfu-version: <checkfu-version>'import requests
url = "https://api.checkfu.com/v1/sessions/{id}/screened-messages"
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'checkfu-version': '<checkfu-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.checkfu.com/v1/sessions/{id}/screened-messages', 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.checkfu.com/v1/sessions/{id}/screened-messages",
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>",
"checkfu-version: <checkfu-version>"
],
]);
$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.checkfu.com/v1/sessions/{id}/screened-messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("checkfu-version", "<checkfu-version>")
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.checkfu.com/v1/sessions/{id}/screened-messages")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/sessions/{id}/screened-messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"seq": 1,
"event_id": "<string>",
"verdict": "pass",
"reason": "<string>",
"content_digest": "<string>",
"route": {
"model_routing_profile_key": "<string>",
"model": "<string>",
"tier": "<string>",
"reason": "<string>",
"access_source": {
"kind": "workspace_credential",
"provider": "<string>",
"model_credential_id": "<string>",
"model_credential_generation_id": "<string>"
}
},
"usage": {
"input_tokens": 1,
"cached_input_tokens": 1,
"cache_write_input_tokens": 1,
"output_tokens": 1,
"reasoning_output_tokens": 1,
"total_tokens": 1
},
"withheld_reason": "screen_block",
"subagent": "<string>",
"created_at": "<string>"
}
],
"next_page": "<string>",
"unavailable": [
{
"seq": 1,
"content_class": "message",
"reason": "shredded",
"structural_replay": "complete",
"replay_fact": {
"version": 1,
"seq": 1,
"kind": "state_neutral"
},
"prompt_integrity": {
"analyzer_version": "unicode-17.0.0-uts39-r32-checkfu-1",
"disposition": "accepted_normalization"
}
}
]
}{
"error": {
"type": "validation.malformed",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-malformed"
}
}{
"error": {
"type": "auth.invalid_key",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-invalid-key"
}
}{
"error": {
"type": "auth.disabled_tenancy",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-disabled-tenancy"
}
}{
"error": {
"type": "validation.not_found",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-not-found"
}
}{
"error": {
"type": "budget.exceeded",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#budget-exceeded"
}
}{
"error": {
"type": "runtime.internal",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#runtime-internal"
}
}List DeliveryScreen verdicts for a Session
List the DeliveryScreen’s verdicts projected from one Session’s event log, so the post-side Check gate’s stopped items are listable exactly as an AdmissionFilter’s filtered deliveries are — this is the endpoint that explains why an outbound agent message is not readable. Every gate is one gesture (D203): another agent evaluates, before the acting agent (an AdmissionFilter’s Check), after it (a DeliveryScreen), or over its work (an OutcomeSpec). Each ScreenedSessionMessage carries the verdict, the bounded reason, the content digest correlating it to the adjacent withheld or delivered agent.message, a withheld_reason of screen_block or screen_failed when content was withheld, and the Check’s routing and usage counters; structural facts and the screen’s bounded verdict text only, never the judged message content. This projects the Session’s event log rather than a separate index, so each request scans a bounded window of log positions and a window holding no verdicts returns an empty data with a non-null next_page: read until next_page is null, never until data is empty. Retention governs the source log — erased Sessions are not addressable, and any position whose content was crypto-shredded or never durably written under ZDR is reported in unavailable rather than silently omitted, so an empty page is never mistaken for a Session that was never screened.
Checkfu support posture: alpha; hosted. Required evidence journey: session-turn. Deployment-specific readiness and the latest proven release are available from GET /v1/support/capabilities.
curl --request GET \
--url https://api.checkfu.com/v1/sessions/{id}/screened-messages \
--header 'Authorization: Bearer <token>' \
--header 'checkfu-version: <checkfu-version>'import requests
url = "https://api.checkfu.com/v1/sessions/{id}/screened-messages"
headers = {
"checkfu-version": "<checkfu-version>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'checkfu-version': '<checkfu-version>', Authorization: 'Bearer <token>'}
};
fetch('https://api.checkfu.com/v1/sessions/{id}/screened-messages', 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.checkfu.com/v1/sessions/{id}/screened-messages",
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>",
"checkfu-version: <checkfu-version>"
],
]);
$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.checkfu.com/v1/sessions/{id}/screened-messages"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("checkfu-version", "<checkfu-version>")
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.checkfu.com/v1/sessions/{id}/screened-messages")
.header("checkfu-version", "<checkfu-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.checkfu.com/v1/sessions/{id}/screened-messages")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["checkfu-version"] = '<checkfu-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"seq": 1,
"event_id": "<string>",
"verdict": "pass",
"reason": "<string>",
"content_digest": "<string>",
"route": {
"model_routing_profile_key": "<string>",
"model": "<string>",
"tier": "<string>",
"reason": "<string>",
"access_source": {
"kind": "workspace_credential",
"provider": "<string>",
"model_credential_id": "<string>",
"model_credential_generation_id": "<string>"
}
},
"usage": {
"input_tokens": 1,
"cached_input_tokens": 1,
"cache_write_input_tokens": 1,
"output_tokens": 1,
"reasoning_output_tokens": 1,
"total_tokens": 1
},
"withheld_reason": "screen_block",
"subagent": "<string>",
"created_at": "<string>"
}
],
"next_page": "<string>",
"unavailable": [
{
"seq": 1,
"content_class": "message",
"reason": "shredded",
"structural_replay": "complete",
"replay_fact": {
"version": 1,
"seq": 1,
"kind": "state_neutral"
},
"prompt_integrity": {
"analyzer_version": "unicode-17.0.0-uts39-r32-checkfu-1",
"disposition": "accepted_normalization"
}
}
]
}{
"error": {
"type": "validation.malformed",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-malformed"
}
}{
"error": {
"type": "auth.invalid_key",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-invalid-key"
}
}{
"error": {
"type": "auth.disabled_tenancy",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#auth-disabled-tenancy"
}
}{
"error": {
"type": "validation.not_found",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#validation-not-found"
}
}{
"error": {
"type": "budget.exceeded",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#budget-exceeded"
}
}{
"error": {
"type": "runtime.internal",
"message": "<string>",
"more": "https://docs.checkfu.com/reference/errors#runtime-internal"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
2026-08-27 Path Parameters
^sess_[0-9a-f]{32}$