Skip to main content

API Reference

Complete API reference for integrating PrecogX security monitoring into your custom AI applications and workflows.

Overview

The PrecogX API provides endpoints for sending telemetry data, managing agents, and retrieving security analytics. This reference covers all available endpoints, request/response formats, authentication, and integration patterns.

Base URL

https://api.precogx.ai/api/v1

Authentication

All API requests require authentication using an API key in the request header.

API Key Authentication

Authorization: Bearer px_live_your_actual_api_key_here

Alternative header format:

x-api-key: px_live_your_actual_api_key_here

Getting Your API Key

  1. Sign in to your PrecogX Dashboard
  2. Navigate to SettingsAPI Keys
  3. Click Create API Key
  4. Copy your key and store it securely

Core Endpoints

Telemetry Ingestion

Send AI interaction data to PrecogX for security analysis.

Generic Telemetry Endpoint

POST /telemetry/ingest

Headers:

Content-Type: application/json
x-api-key: px_live_your_actual_api_key_here

Request Body:

{
"agentId": "string",
"prompt": "string",
"response": "string",
"metadata": {
"timestamp": "2024-01-15T10:30:00Z",
"userId": "user-123",
"sessionId": "session-456",
"platform": "custom",
"model": "gpt-4",
"tokens_used": 150
},
"toolCalls": [
{
"name": "search_database",
"input": {"query": "customer orders"},
"output": {"results": [...]}
}
]
}

Response:

{
"status": "success",
"message": "Telemetry data ingested successfully",
"agentId": "custom-agent-1",
"interactionId": "int-789"
}

Platform-Specific Endpoints

For better integration with specific platforms:

Flowise Integration:

POST /integrations/flowise/telemetry

n8n Integration:

POST /integrations/n8n/telemetry

Dify Integration:

POST /integrations/dify/telemetry

Custom Integration:

POST /integrations/custom/telemetry

Request Schema

Required Fields

FieldTypeDescriptionExample
agentIdstringUnique identifier for your AI agent"customer-support-bot"
promptstringUser input or prompt sent to the AI"What is your refund policy?"
responsestringAI's response or output"Our refund policy allows..."

Optional Fields

FieldTypeDescriptionExample
metadataobjectAdditional context and informationSee metadata schema below
toolCallsarrayTools or functions called by the AISee tool calls schema below
userIdstringUnique identifier for the user"user-12345"
sessionIdstringSession identifier"session-abcde"
conversationIdstringConversation thread identifier"conv-67890"

Metadata Schema

{
"metadata": {
"timestamp": "2024-01-15T10:30:00Z",
"platform": "custom",
"environment": "production",
"model": "gpt-4-turbo",
"model_provider": "openai",
"temperature": 0.7,
"max_tokens": 2000,
"tokens_used": 150,
"response_time_ms": 1200,
"user_agent": "MyApp/1.0",
"ip_address": "192.168.1.1",
"location": "US",
"language": "en",
"intent": "question",
"sentiment": "neutral",
"confidence_score": 0.95,
"custom_field_1": "custom_value_1"
}
}

Tool Calls Schema

{
"toolCalls": [
{
"name": "search_database",
"description": "Search customer database",
"input": {
"query": "customer orders",
"filters": {"status": "active"}
},
"output": {
"results": [...],
"count": 5
},
"execution_time_ms": 500,
"success": true
}
]
}

Response Codes

CodeStatusDescription
200SuccessTelemetry data processed successfully
400Bad RequestInvalid request format or missing required fields
401UnauthorizedInvalid or missing API key
403ForbiddenAPI key valid but insufficient permissions
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer error processing request

Error Responses

{
"error": {
"code": "INVALID_REQUEST",
"message": "Missing required field: agentId",
"details": {
"field": "agentId",
"expected": "string",
"received": "null"
}
}
}

Common Error Codes

CodeDescriptionSolution
INVALID_API_KEYAPI key is invalid or expiredCheck your API key in dashboard
MISSING_REQUIRED_FIELDRequired field missing from requestInclude all required fields
INVALID_FIELD_TYPEField type doesn't match expected typeCheck field types in schema
RATE_LIMIT_EXCEEDEDToo many requests in time periodImplement exponential backoff
AGENT_LIMIT_EXCEEDEDToo many agents for your tierUpgrade plan or reduce agents

Rate Limits

TierRequests per minuteBurst limit
Free100200
Professional1,0002,000
Business5,00010,000
EnterpriseCustomCustom

Integration Examples

Python

import requests
import json
from datetime import datetime, timezone

class PrecogXClient:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://api.precogx.ai/api/v1"
self.headers = {
"Content-Type": "application/json",
"x-api-key": api_key
}

def send_telemetry(self, agent_id, prompt, response, metadata=None, tool_calls=None):
"""Send telemetry data to PrecogX"""
payload = {
"agentId": agent_id,
"prompt": prompt,
"response": response,
"metadata": metadata or {
"timestamp": datetime.now(timezone.utc).isoformat(),
"platform": "python-custom"
}
}

if tool_calls:
payload["toolCalls"] = tool_calls

try:
response = requests.post(
f"{self.base_url}/telemetry/ingest",
headers=self.headers,
json=payload,
timeout=10
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"PrecogX telemetry failed: {e}")
return None

# Usage example
client = PrecogXClient("px_live_your_actual_api_key_here")

result = client.send_telemetry(
agent_id="python-chatbot",
prompt="What's the weather like?",
response="I don't have access to real-time weather data.",
metadata={
"user_id": "user123",
"session_id": "sess456",
"model": "gpt-4",
"platform": "python-custom"
}
)

Node.js

const axios = require('axios');

class PrecogXClient {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseURL = 'https://api.precogx.ai/api/v1';
this.headers = {
'Content-Type': 'application/json',
'x-api-key': apiKey
};
}

async sendTelemetry(agentId, prompt, response, metadata = null, toolCalls = null) {
const payload = {
agentId,
prompt,
response,
metadata: metadata || {
timestamp: new Date().toISOString(),
platform: 'nodejs-custom'
}
};

if (toolCalls) {
payload.toolCalls = toolCalls;
}

try {
const result = await axios.post(
`${this.baseURL}/telemetry/ingest`,
payload,
{ headers: this.headers, timeout: 10000 }
);
return result.data;
} catch (error) {
console.error('PrecogX telemetry failed:', error.message);
return null;
}
}
}

// Usage example
const client = new PrecogXClient('px_live_your_actual_api_key_here');

client.sendTelemetry(
'nodejs-assistant',
'Help me write a professional email',
'I\'d be happy to help you write a professional email. What\'s the purpose of the email?',
{
userId: 'user789',
sessionId: 'sess123',
model: 'gpt-4',
platform: 'nodejs-custom'
}
).then(result => {
if (result) {
console.log('Telemetry sent successfully:', result);
}
});

Java

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;

public class PrecogXClient {
private final String apiKey;
private final String baseUrl = "https://api.precogx.ai/api/v1";
private final HttpClient httpClient;
private final ObjectMapper objectMapper;

public PrecogXClient(String apiKey) {
this.apiKey = apiKey;
this.httpClient = HttpClient.newHttpClient();
this.objectMapper = new ObjectMapper();
}

public void sendTelemetry(String agentId, String prompt, String response,
Map<String, Object> metadata) {
try {
Map<String, Object> payload = new HashMap<>();
payload.put("agentId", agentId);
payload.put("prompt", prompt);
payload.put("response", response);

if (metadata == null) {
metadata = new HashMap<>();
metadata.put("timestamp", Instant.now().toString());
metadata.put("platform", "java-custom");
}
payload.put("metadata", metadata);

String jsonPayload = objectMapper.writeValueAsString(payload);

HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(baseUrl + "/telemetry/ingest"))
.header("Content-Type", "application/json")
.header("x-api-key", apiKey)
.POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();

HttpResponse<String> response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());

if (response.statusCode() == 200) {
System.out.println("Telemetry sent successfully");
} else {
System.err.println("Telemetry failed: " + response.body());
}
} catch (Exception e) {
System.err.println("PrecogX telemetry error: " + e.getMessage());
}
}
}

// Usage example
PrecogXClient client = new PrecogXClient("px_live_your_actual_api_key_here");

Map<String, Object> metadata = new HashMap<>();
metadata.put("userId", "user456");
metadata.put("model", "gpt-4");
metadata.put("platform", "java-custom");

client.sendTelemetry(
"java-assistant",
"Explain quantum computing",
"Quantum computing is a type of computation that harnesses quantum mechanics...",
metadata
);

Go

package main

import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)

type PrecogXClient struct {
APIKey string
BaseURL string
Client *http.Client
}

type TelemetryPayload struct {
AgentID string `json:"agentId"`
Prompt string `json:"prompt"`
Response string `json:"response"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
ToolCalls []ToolCall `json:"toolCalls,omitempty"`
}

type ToolCall struct {
Name string `json:"name"`
Input interface{} `json:"input"`
Output interface{} `json:"output"`
}

func NewPrecogXClient(apiKey string) *PrecogXClient {
return &PrecogXClient{
APIKey: apiKey,
BaseURL: "https://api.precogx.ai/api/v1",
Client: &http.Client{Timeout: 10 * time.Second},
}
}

func (c *PrecogXClient) SendTelemetry(agentID, prompt, response string,
metadata map[string]interface{}) error {
if metadata == nil {
metadata = map[string]interface{}{
"timestamp": time.Now().UTC().Format(time.RFC3339),
"platform": "go-custom",
}
}

payload := TelemetryPayload{
AgentID: agentID,
Prompt: prompt,
Response: response,
Metadata: metadata,
}

jsonData, err := json.Marshal(payload)
if err != nil {
return fmt.Errorf("failed to marshal payload: %w", err)
}

req, err := http.NewRequest("POST", c.BaseURL+"/telemetry/ingest",
bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("failed to create request: %w", err)
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", c.APIKey)

resp, err := c.Client.Do(req)
if err != nil {
return fmt.Errorf("request failed: %w", err)
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
return fmt.Errorf("API returned status %d", resp.StatusCode)
}

fmt.Println("Telemetry sent successfully")
return nil
}

// Usage example
func main() {
client := NewPrecogXClient("px_live_your_actual_api_key_here")

metadata := map[string]interface{}{
"userId": "user789",
"model": "gpt-4",
"platform": "go-custom",
}

err := client.SendTelemetry(
"go-assistant",
"What are the benefits of microservices?",
"Microservices offer several benefits including scalability, flexibility...",
metadata,
)

if err != nil {
fmt.Printf("Error sending telemetry: %v\n", err)
}
}

Advanced Features

Batch Telemetry

Send multiple interactions in a single request:

POST /telemetry/batch
{
"interactions": [
{
"agentId": "batch-agent-1",
"prompt": "First question",
"response": "First response",
"metadata": {"timestamp": "2024-01-15T10:30:00Z"}
},
{
"agentId": "batch-agent-1",
"prompt": "Second question",
"response": "Second response",
"metadata": {"timestamp": "2024-01-15T10:31:00Z"}
}
]
}

Async Telemetry

For high-performance applications, use fire-and-forget telemetry:

import asyncio
import aiohttp

async def send_telemetry_async(session, payload):
async with session.post(
"https://api.precogx.ai/api/v1/telemetry/ingest",
json=payload,
headers={"x-api-key": "px_live_your_actual_api_key_here"}
) as response:
return await response.json()

# Usage
async with aiohttp.ClientSession() as session:
await send_telemetry_async(session, telemetry_data)

Custom Fields

Add custom fields to your telemetry for specific use cases:

{
"agentId": "custom-agent",
"prompt": "User question",
"response": "AI response",
"metadata": {
"custom_field_1": "value1",
"custom_field_2": 42,
"custom_field_3": true,
"business_unit": "sales",
"cost_center": "marketing",
"experiment_id": "exp-123"
}
}

Best Practices

Error Handling

Always implement proper error handling:

def send_telemetry_safe(client, data):
max_retries = 3
for attempt in range(max_retries):
try:
return client.send_telemetry(**data)
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
logging.error(f"Failed to send telemetry after {max_retries} attempts: {e}")
return None
time.sleep(2 ** attempt) # Exponential backoff

Rate Limiting

Respect rate limits with proper throttling:

import time
from collections import deque

class RateLimiter:
def __init__(self, max_requests=100, time_window=60):
self.max_requests = max_requests
self.time_window = time_window
self.requests = deque()

def can_make_request(self):
now = time.time()
# Remove old requests outside time window
while self.requests and self.requests[0] < now - self.time_window:
self.requests.popleft()

if len(self.requests) < self.max_requests:
self.requests.append(now)
return True
return False

Data Privacy

Filter sensitive information before sending:

def sanitize_data(prompt, response):
# Remove PII patterns
import re

# Remove email addresses
prompt = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '[EMAIL]', prompt)
response = re.sub(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', '[EMAIL]', response)

# Remove phone numbers
prompt = re.sub(r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b', '[PHONE]', prompt)
response = re.sub(r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b', '[PHONE]', response)

return prompt, response

Webhooks (Coming Soon)

Receive real-time security alerts via webhooks:

POST https://your-app.com/precogx/webhook
{
"event": "threat_detected",
"agentId": "your-agent-id",
"threatType": "prompt_injection",
"severity": "high",
"timestamp": "2024-01-15T10:30:00Z",
"details": {
"confidence": 0.95,
"description": "Potential prompt injection detected"
}
}

Support

Need help with the API?


Ready to integrate PrecogX into your AI application? Get your API key today!