curl --request GET \
--url https://api.enkryptai.com/compliance/get-message \
--header 'X-Enkrypt-Scan: <x-enkrypt-scan>' \
--header 'apikey: <api-key>'import requests
url = "https://api.enkryptai.com/compliance/get-message"
headers = {
"X-Enkrypt-Scan": "<x-enkrypt-scan>",
"apikey": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Enkrypt-Scan': '<x-enkrypt-scan>', apikey: '<api-key>'}
};
fetch('https://api.enkryptai.com/compliance/get-message', 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.enkryptai.com/compliance/get-message",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Enkrypt-Scan: <x-enkrypt-scan>",
"apikey: <api-key>"
],
]);
$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.enkryptai.com/compliance/get-message"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Enkrypt-Scan", "<x-enkrypt-scan>")
req.Header.Add("apikey", "<api-key>")
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.enkryptai.com/compliance/get-message")
.header("X-Enkrypt-Scan", "<x-enkrypt-scan>")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enkryptai.com/compliance/get-message")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Enkrypt-Scan"] = '<x-enkrypt-scan>'
request["apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"event_id": "evt_abc123",
"scan_id": "11111111-2222-3333-4444-555555555555",
"log_file_id": "file_abc123",
"event_type": "CONVERSATION_MESSAGE",
"timestamp": "2026-09-23T08:41:07Z",
"direction": "input",
"actor_email": "user@example.com",
"conversation_id": "conv_abc123",
"text": "The message text, as it was sent.",
"has_files": false,
"file_names": [],
"content_expires_at": "2026-10-23T08:41:07Z"
}{
"error": "Scan not found"
}{
"code": 403,
"error": "Forbidden",
"message": "Access Denied",
"request_id": "<string>",
"time": 123
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}{
"error": "Message content is no longer available from the provider",
"reason": "expired",
"detail": "log file is past the provider's retention window"
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}Get Compliance Message
One message’s text, fetched live from the provider. Message text is never stored, so serving this re-downloads the whole export file the message came from — up to 15 MB for a single message, out of the same rate-limited budget the scan itself uses.
Put it behind a deliberate click. Never call it from a list view, a hover card or a prefetch: a burst of calls starves the scan that is reading new messages. Allow up to a minute for a response.
X-Enkrypt-Scan is required, not optional: the scan it names is what scopes the lookup to your own data.
410 is not a failure. It means the file has aged out of the provider’s 30-day retention window, which is the normal steady state for anything older than a month; content_expires_at on the record says when that will happen.
Requires the governance officer role on the project your API key belongs to. The organization owner is not exempt — an owner without the role gets 403 — and an individual (non-organization) account cannot hold the role at all.
curl --request GET \
--url https://api.enkryptai.com/compliance/get-message \
--header 'X-Enkrypt-Scan: <x-enkrypt-scan>' \
--header 'apikey: <api-key>'import requests
url = "https://api.enkryptai.com/compliance/get-message"
headers = {
"X-Enkrypt-Scan": "<x-enkrypt-scan>",
"apikey": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Enkrypt-Scan': '<x-enkrypt-scan>', apikey: '<api-key>'}
};
fetch('https://api.enkryptai.com/compliance/get-message', 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.enkryptai.com/compliance/get-message",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Enkrypt-Scan: <x-enkrypt-scan>",
"apikey: <api-key>"
],
]);
$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.enkryptai.com/compliance/get-message"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Enkrypt-Scan", "<x-enkrypt-scan>")
req.Header.Add("apikey", "<api-key>")
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.enkryptai.com/compliance/get-message")
.header("X-Enkrypt-Scan", "<x-enkrypt-scan>")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enkryptai.com/compliance/get-message")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Enkrypt-Scan"] = '<x-enkrypt-scan>'
request["apikey"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"event_id": "evt_abc123",
"scan_id": "11111111-2222-3333-4444-555555555555",
"log_file_id": "file_abc123",
"event_type": "CONVERSATION_MESSAGE",
"timestamp": "2026-09-23T08:41:07Z",
"direction": "input",
"actor_email": "user@example.com",
"conversation_id": "conv_abc123",
"text": "The message text, as it was sent.",
"has_files": false,
"file_names": [],
"content_expires_at": "2026-10-23T08:41:07Z"
}{
"error": "Scan not found"
}{
"code": 403,
"error": "Forbidden",
"message": "Access Denied",
"request_id": "<string>",
"time": 123
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}{
"error": "Message content is no longer available from the provider",
"reason": "expired",
"detail": "log file is past the provider's retention window"
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}{
"error": "Scan not found"
}Authorizations
Headers
The scan's saved name, within the project your API key belongs to. Letters, numbers, spaces and _ & - . /; must start and end with a letter or a number; at most 64 characters.
"ChatGPT Enterprise"
Query Parameters
The message's event id, as recorded for this scan.
Response
Successful Response
One message, fetched live from the provider. Nothing here is stored by Enkrypt.
The export file this message was read from.
The provider's timestamp for the message.
Whether this was sent to the assistant or returned by it.
The workspace member the message belongs to.
The message text.
When this content leaves the provider's retention window, after which the call returns 410.

