curl --request GET \
--url https://api.enkryptai.com/compliance/list-log-files \
--header 'X-Enkrypt-Scan: <x-enkrypt-scan>' \
--header 'apikey: <api-key>'import requests
url = "https://api.enkryptai.com/compliance/list-log-files"
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/list-log-files', 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/list-log-files",
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/list-log-files"
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/list-log-files")
.header("X-Enkrypt-Scan", "<x-enkrypt-scan>")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enkryptai.com/compliance/list-log-files")
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{
"scan_id": "11111111-2222-3333-4444-555555555555",
"scan_name": "ChatGPT Enterprise",
"log_files": [
{
"scan_id": "11111111-2222-3333-4444-555555555555",
"log_file_id": "file_abc123",
"event_type": "CONVERSATION_MESSAGE",
"end_time": "2026-09-23T09:00:00Z",
"file_size": 4471234,
"first_event_at": "2026-09-23T08:00:00Z",
"last_event_at": "2026-09-23T08:59:59Z",
"started_at": "2026-09-23T09:01:00Z",
"ended_at": "2026-09-23T09:03:12Z",
"messages_count": 1842,
"flagged_count": 7,
"status": "done",
"error": null
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total_count": 1,
"total_pages": 1,
"has_next": false,
"has_previous": false
}
}{
"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": "Scan not found"
}List Compliance Log Files
The coverage record for one scan: which provider export files it opened and closed, how big each was, which period of messages it held, and how many of those messages were flagged.
This answers what did we cover, not what did we find. Rows appear as open when the scan starts a file and are closed as done; skipped means the file aged out of the provider’s 30-day retention window before it could be downloaded.
Four different clocks appear here and they are not interchangeable: first_event_at / last_event_at are the provider’s message timestamps inside the file, started_at / ended_at are when the scan worked on it, and end_time is when the provider closed the file. Rows are ordered by end_time, newest first.
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/list-log-files \
--header 'X-Enkrypt-Scan: <x-enkrypt-scan>' \
--header 'apikey: <api-key>'import requests
url = "https://api.enkryptai.com/compliance/list-log-files"
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/list-log-files', 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/list-log-files",
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/list-log-files"
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/list-log-files")
.header("X-Enkrypt-Scan", "<x-enkrypt-scan>")
.header("apikey", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enkryptai.com/compliance/list-log-files")
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{
"scan_id": "11111111-2222-3333-4444-555555555555",
"scan_name": "ChatGPT Enterprise",
"log_files": [
{
"scan_id": "11111111-2222-3333-4444-555555555555",
"log_file_id": "file_abc123",
"event_type": "CONVERSATION_MESSAGE",
"end_time": "2026-09-23T09:00:00Z",
"file_size": 4471234,
"first_event_at": "2026-09-23T08:00:00Z",
"last_event_at": "2026-09-23T08:59:59Z",
"started_at": "2026-09-23T09:01:00Z",
"ended_at": "2026-09-23T09:03:12Z",
"messages_count": 1842,
"flagged_count": 7,
"status": "done",
"error": null
}
],
"pagination": {
"page": 1,
"per_page": 50,
"total_count": 1,
"total_pages": 1,
"has_next": false,
"has_previous": false
}
}{
"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": "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
1-based page number.
x >= 1Rows per page, 1–200.
1 <= x <= 200Only return files in this state. partial is a defined value that is not written yet, so filtering for it legitimately returns nothing rather than an error.
open, done, partial, skipped 
