Skip to main content
The Audit Logs service provides access to system activity logs for compliance, security monitoring, and debugging purposes.

Overview

import { SnackBaseClient } from "@snackbase/sdk";

const client = new SnackBaseClient({
  baseUrl: "https://api.example.com",
});

// Access the audit logs service
const auditLogs = client.auditLogs;
Audit log access requires superadmin authentication.

List Audit Logs

Retrieve audit logs with optional filtering:
// Get all audit logs
const response = await client.auditLogs.list();
// Returns: { items: AuditLog[], total: number, audit_logging_enabled: boolean }
Filter by specific criteria:
const response = await client.auditLogs.list({
  account_id: "account-id",
  table_name: "users",
  operation: "update",
  limit: 50,
  skip: 0
});
Available filters:
ParameterTypeDescription
account_idstringFilter by account
table_namestringFilter by table/collection
operationstringFilter by operation (create, update, delete)
user_idstringFilter by user
limitnumberMax results per page
skipnumberNumber of results to skip
date_fromstringISO date filter (start)
date_tostringISO date filter (end)

Get a Single Audit Log

Get details for a specific audit log entry:
const log = await client.auditLogs.get("log-id");

Export Audit Logs

Export audit logs in various formats:

Export as JSON

const jsonData = await client.auditLogs.export(
  { table_name: "users" },
  "json"
);
// Returns JSON string

Export as CSV

const csvData = await client.auditLogs.export(
  { table_name: "users" },
  "csv"
);
// Returns CSV string

Export as PDF

const pdfBase64 = await client.auditLogs.export(
  { table_name: "users" },
  "pdf"
);
// Returns base64-encoded PDF string
PDF exports are returned as base64-encoded strings. Decode them to binary before saving or displaying.

Complete Example

Audit log viewer component:
import { useState } from "react";
import { useQuery } from "@snackbase/sdk/react";

function AuditLogViewer() {
  const [filters, setFilters] = useState({
    table_name: "",
    operation: "",
    limit: 50
  });

  const { data: response, isLoading } = useQuery({
    queryKey: ["audit-logs", filters],
    queryFn: () => client.auditLogs.list(filters)
  });

  const handleExport = async (format: "json" | "csv" | "pdf") => {
    const data = await client.auditLogs.export(filters, format);

    if (format === "pdf") {
      // Decode base64 for PDF
      const binary = atob(data);
      const bytes = new Uint8Array(binary.length);
      for (let i = 0; i < binary.length; i++) {
        bytes[i] = binary.charCodeAt(i);
      }
      const blob = new Blob([bytes], { type: "application/pdf" });
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.href = url;
      a.download = "audit-logs.pdf";
      a.click();
    } else {
      // JSON or CSV - download directly
      const blob = new Blob([data], {
        type: format === "json" ? "application/json" : "text/csv"
      });
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.href = url;
      a.download = `audit-logs.${format}`;
      a.click();
    }
  };

  if (isLoading) return <div>Loading...</div>;

  return (
    <div>
      <h2>Audit Logs</h2>
      <p>Status: {response.audit_logging_enabled ? "Enabled" : "Disabled"}</p>
      <p>Total entries: {response.total}</p>

      <div>
        <button onClick={() => handleExport("json")}>Export JSON</button>
        <button onClick={() => handleExport("csv")}>Export CSV</button>
        <button onClick={() => handleExport("pdf")}>Export PDF</button>
      </div>

      <table>
        <thead>
          <tr>
            <th>Timestamp</th>
            <th>User</th>
            <th>Table</th>
            <th>Operation</th>
            <th>Changes</th>
          </tr>
        </thead>
        <tbody>
          {response.items.map(log => (
            <tr key={log.id}>
              <td>{new Date(log.created_at).toLocaleString()}</td>
              <td>{log.user_email}</td>
              <td>{log.table_name}</td>
              <td>{log.operation}</td>
              <td>{JSON.stringify(log.changes)}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

Next Steps