List agent audit exchanges
Lists the gateway's audit records of the agent's requests, paged by cursor and filtered by received time and traffic kind. Readable by an admin and by users bound to the agent.
get
https://<host>/api/v1/agents/{agentId}/audit-exchangesbash
curl --request GET \
--url 'https://<host>/api/v1/agents/{agentId}/audit-exchanges' \
--header 'Authorization: Bearer <token>'javascript
const response = await fetch("https://<host>/api/v1/agents/{agentId}/audit-exchanges", {
method: "GET",
headers: {
"Authorization": "Bearer <token>"
}
});
const data = await response.json();typescript
interface ListAuditExchangesResponse {
correlation_id?: string;
items?: Record<string, unknown>[];
next_cursor?: string;
total_count?: number;
}
const response = await fetch("https://<host>/api/v1/agents/{agentId}/audit-exchanges", {
method: "GET",
headers: {
"Authorization": "Bearer <token>"
}
});
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);
const data: ListAuditExchangesResponse = await response.json();python
import requests
response = requests.get(
"https://<host>/api/v1/agents/{agentId}/audit-exchanges",
headers={
"Authorization": "Bearer <token>",
},
)
response.raise_for_status()
print(response.json())go
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://<host>/api/v1/agents/{agentId}/audit-exchanges", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer <token>")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, err := io.ReadAll(res.Body)
if err != nil {
panic(err)
}
fmt.Println(res.Status, string(data))
}java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://<host>/api/v1/agents/{agentId}/audit-exchanges"))
.header("Authorization", "Bearer <token>")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}csharp
using System.Net.Http.Headers;
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, "https://<host>/api/v1/agents/{agentId}/audit-exchanges");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");php
<?php
$ch = curl_init('https://<host>/api/v1/agents/{agentId}/audit-exchanges');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer <token>',
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
echo $status . " " . $response . PHP_EOL;ruby
require "net/http"
uri = URI("https://<host>/api/v1/agents/{agentId}/audit-exchanges")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer <token>"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts "#{response.code} #{response.body}"rust
// Cargo.toml dependencies: reqwest, tokio (features "full")
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let response = reqwest::Client::new()
.get("https://<host>/api/v1/agents/{agentId}/audit-exchanges")
.header("Authorization", "Bearer <token>")
.send()
.await?;
println!("{} {}", response.status(), response.text().await?);
Ok(())
}Authorizations
BearerAuth· API key in header "Authorization" — Type "Bearer" followed by a space and a sign-in token: a Guardian Platform JWT, or an OIDC ID token in a standalone deployment.ApiKeyAuth· API key in header "Authorization" — Type "Bearer" followed by a space and a Guardian Platform API key. Project-scoped routes and registration tokens check the key's scopes and project binding. Per-agent routes accept a key bound to no project that has empty scopes or full access, which acts as its holder, or a scope for what the route does: submit_agent_assessments reads an agent (its detail, configurations, state history and the files a state references, definitions, tools and operating profile, as its assessments rest on), view_agent_certifications reads its certifications, and manage_programs or review_agent_assessments attach a certification. A state's raw snapshot and findings, its audit exchanges and plugin events, and saving its operating profile take full access. A scope counts only while the key's holder still holds that permission in the key's organization, which auth-service reports as keyHeldScopes. A key never acts as an admin, so its holder's binding to the agent still decides.
Parameters
Path parameters
| Name | Type | Description |
|---|---|---|
agentIdrequired | string | Agent ID |
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Page size |
cursor | string | Pagination cursor |
start | string | RFC3339 start time |
end | string | RFC3339 end time |
traffic_kind | string | Filter by traffic kind (llm|relay) |
Responses
200OK
application/json
correlation_idstringitemsgithub_com_eqtylab_gateway_control-plane_service_internal_discovery.AuditExchangeSummary[]Show properties
Array of
github_com_eqtylab_gateway_control-plane_service_internal_discovery.AuditExchangeSummarycorrelation_idstringcreated_atstringdecision_codestringduration_msintegerhttp_methodstringidintegerplugin_configuration_global_versionintegerplugin_configuration_project_versionintegerplugin_decision_codestringplugin_denied_bystringproviderstringreceived_atstringrequest_modelstringrequest_pathstringrequest_previewstringrequest_preview_rolestringresponse_modelstringresponse_statusintegerroute_typestringstream_observedbooleantraffic_kindstringupstream_hoststring
next_cursorstringtotal_countinteger
Examplejson
{
"correlation_id": "string",
"items": [
{
"correlation_id": "string",
"created_at": "string",
"decision_code": "string",
"duration_ms": 0,
"http_method": "string",
"id": 0,
"plugin_configuration_global_version": 0,
"plugin_configuration_project_version": 0,
"plugin_decision_code": "string",
"plugin_denied_by": "string",
"provider": "string",
"received_at": "string",
"request_model": "string",
"request_path": "string",
"request_preview": "string",
"request_preview_role": "string",
"response_model": "string",
"response_status": 0,
"route_type": "string",
"stream_observed": true,
"traffic_kind": "string",
"upstream_host": "string"
}
],
"next_cursor": "string",
"total_count": 0
}400Bad Request
application/json
codestringcorrelation_idstringmessagestring
Examplejson
{
"code": "string",
"correlation_id": "string",
"message": "string"
}401Unauthorized
application/json
codestringcorrelation_idstringmessagestring
Examplejson
{
"code": "string",
"correlation_id": "string",
"message": "string"
}403Forbidden
application/json
codestringcorrelation_idstringmessagestring
Examplejson
{
"code": "string",
"correlation_id": "string",
"message": "string"
}404Not Found
application/json
codestringcorrelation_idstringmessagestring
Examplejson
{
"code": "string",
"correlation_id": "string",
"message": "string"
}500Internal Server Error
application/json
codestringcorrelation_idstringmessagestring
Examplejson
{
"code": "string",
"correlation_id": "string",
"message": "string"
}