Skip to content

API Objects

Complete reference for all Converra API objects and their schemas.

Prompt

A system prompt managed by Converra.

typescript
interface Prompt {
  id: string;                    // Unique identifier (e.g., "prompt_abc123")
  name: string;                  // Display name
  content: string;               // The system prompt text
  llmModel: string;              // Target LLM model
  description?: string;          // Optional description
  tags?: string[];               // Organization tags
  status: PromptStatus;          // Current status
  isActive: boolean;             // Whether prompt is active
  createdAt: string;             // ISO 8601 timestamp
  updatedAt: string;             // ISO 8601 timestamp
  lastOptimizedAt?: string;      // Last optimization timestamp
  conversationCount?: number;    // Total logged conversations
}

type PromptStatus = 'draft' | 'active' | 'deprecated' | 'archived';

Example

json
{
  "id": "prompt_abc123",
  "name": "Customer Support Agent",
  "content": "You are a helpful customer support agent...",
  "llmModel": "gpt-4o",
  "description": "Main support chatbot",
  "tags": ["support", "production"],
  "status": "active",
  "isActive": true,
  "createdAt": "2025-01-15T10:00:00Z",
  "updatedAt": "2025-01-20T14:30:00Z",
  "lastOptimizedAt": "2025-01-18T09:00:00Z",
  "conversationCount": 1247
}

Conversation

A logged conversation between a user and AI assistant.

typescript
interface Conversation {
  id: string;                    // Unique identifier
  promptId: string;              // Associated prompt ID
  content: string;               // Full conversation transcript
  status: ConversationStatus;    // Conversation status
  llmModel?: string;             // Model used (if different from prompt)
  companyName?: string;          // Customer company name
  hasInsights: boolean;          // Whether insights were generated
  createdAt: string;             // ISO 8601 timestamp
}

type ConversationStatus = 'completed' | 'abandoned' | 'in_progress';

Transcript Format

The content field should contain alternating user and assistant messages:

User: First user message
Assistant: First assistant response
User: Second user message
Assistant: Second assistant response

Acceptable labels: User/Assistant, Human/AI, Customer/Agent

Example

json
{
  "id": "conv_xyz789",
  "promptId": "prompt_abc123",
  "content": "User: I need help with my order\nAssistant: I'd be happy to help! What's your order number?\nUser: #12345\nAssistant: Found it! Your order ships tomorrow.",
  "status": "completed",
  "llmModel": "gpt-4o",
  "companyName": "Acme Corp",
  "hasInsights": true,
  "createdAt": "2025-01-20T14:30:00Z"
}

Optimization

An optimization run that tests variants to improve a prompt.

typescript
interface Optimization {
  id: string;                    // Unique identifier
  promptId: string;              // Target prompt ID
  status: OptimizationStatus;    // Current status
  mode: OptimizationMode;        // Optimization mode
  variantCount: number;          // Number of variants tested
  currentIteration?: number;     // Current iteration (if running)
  maxIterations?: number;        // Maximum iterations
  winningVariantId?: string;     // Winner (if completed)
  improvement?: number;          // Improvement percentage
  createdAt: string;             // ISO 8601 timestamp
  completedAt?: string;          // Completion timestamp
}

type OptimizationStatus =
  | 'queued'
  | 'starting'
  | 'running'
  | 'completed'
  | 'failed'
  | 'stopped';

type OptimizationMode = 'exploratory' | 'validation';

Mode Differences

ModePurposeSpeedRigor
exploratoryQuick iteration, testing ideasFastLower
validationStatistical significanceSlowerHigher

Example

json
{
  "id": "opt_def456",
  "promptId": "prompt_abc123",
  "status": "completed",
  "mode": "exploratory",
  "variantCount": 3,
  "currentIteration": 5,
  "maxIterations": 5,
  "winningVariantId": "var_winner123",
  "improvement": 23.5,
  "createdAt": "2025-01-20T10:00:00Z",
  "completedAt": "2025-01-20T10:45:00Z"
}

Variant

A variant prompt generated during optimization.

typescript
interface Variant {
  id: string;                    // Unique identifier
  optimizationId: string;        // Parent optimization ID
  promptId: string;              // Original prompt ID
  name: string;                  // Variant name (e.g., "Variant A")
  content: string;               // Modified prompt content
  isControl: boolean;            // Whether this is the baseline
  isWinner: boolean;             // Whether this variant won
  metrics: VariantMetrics;       // Performance metrics
  changes?: string;              // Summary of changes from original
}

interface VariantMetrics {
  overall: number;               // Overall score (0-100)
  taskCompletion: number;        // Task completion rate (0-100)
  quality: number;               // Response quality (0-100)
  clarity: number;               // Clarity score (0-100)
  sentiment: number;             // Sentiment score (0-100)
  conversationCount: number;     // Simulated conversations
}

Example

json
{
  "id": "var_winner123",
  "optimizationId": "opt_def456",
  "promptId": "prompt_abc123",
  "name": "Variant B",
  "content": "You are a helpful customer support agent. Always greet the customer warmly...",
  "isControl": false,
  "isWinner": true,
  "metrics": {
    "overall": 87,
    "taskCompletion": 89,
    "quality": 85,
    "clarity": 88,
    "sentiment": 86,
    "conversationCount": 15
  },
  "changes": "Added warm greeting, step-by-step instructions"
}

Insight

Performance insights for prompts or conversations.

Prompt Insights (Aggregated)

typescript
interface PromptInsights {
  promptId: string;
  period: string;                // e.g., "30d"
  metrics: {
    taskCompletion: number;      // Average task completion (0-100)
    sentiment: SentimentScore;   // Overall sentiment
    conversationCount: number;   // Total conversations
    averageTurns: number;        // Average conversation length
  };
  topics: string[];              // Common topics
  issues: string[];              // Identified issues
  recommendations: string[];     // Improvement suggestions
  generatedAt: string;           // ISO 8601 timestamp
}

type SentimentScore = 'positive' | 'neutral' | 'negative' | 'mixed';

Conversation Insights

typescript
interface ConversationInsights {
  conversationId: string;
  sentiment: SentimentScore;
  sentimentScore: number;        // Numeric score (0-1)
  taskCompleted: boolean;        // Whether task was completed
  topics: string[];              // Discussed topics
  summary: string;               // AI-generated summary
  issues: string[];              // Issues identified
  createdAt: string;             // ISO 8601 timestamp
}

Example (Conversation Insights)

json
{
  "conversationId": "conv_xyz789",
  "sentiment": "positive",
  "sentimentScore": 0.82,
  "taskCompleted": true,
  "topics": ["order status", "shipping"],
  "summary": "Customer inquired about order #12345. Agent provided shipping update. Customer satisfied.",
  "issues": [],
  "createdAt": "2025-01-20T14:35:00Z"
}

Webhook

A configured webhook endpoint.

typescript
interface Webhook {
  id: string;                    // Unique identifier
  url: string;                   // Endpoint URL (HTTPS)
  events: WebhookEvent[];        // Subscribed events
  active: boolean;               // Whether webhook is active
  description?: string;          // Optional description
  secret?: string;               // Signing secret (only on create)
  createdAt: string;             // ISO 8601 timestamp
}

type WebhookEvent =
  | 'optimization.completed'
  | 'optimization.failed'
  | 'prompt.updated'
  | 'conversation.created'
  | 'insights.generated';

Pagination

All list endpoints use consistent pagination.

Request Parameters

ParameterTypeDefaultDescription
limitnumber20Max results per page (1-100)
offsetnumber0Number of results to skip

Response Format

typescript
interface PaginatedResponse<T> {
  data: T[];                     // Array of results
  pagination: {
    total: number;               // Total matching results
    limit: number;               // Current limit
    offset: number;              // Current offset
    hasMore: boolean;            // Whether more results exist
  };
}

Example

json
{
  "data": [
    { "id": "prompt_1", "name": "Support Agent" },
    { "id": "prompt_2", "name": "Sales Assistant" }
  ],
  "pagination": {
    "total": 25,
    "limit": 20,
    "offset": 0,
    "hasMore": true
  }
}

Pagination Examples

bash
# First page
GET /api/v1/prompts?limit=20

# Second page
GET /api/v1/prompts?limit=20&offset=20

# Smaller page size
GET /api/v1/prompts?limit=10&offset=0

Error Object

All errors follow a consistent format.

typescript
interface ErrorResponse {
  error: {
    code: ErrorCode;             // Machine-readable code
    message: string;             // Human-readable message
    details?: Record<string, string>; // Field-specific errors
  };
}

type ErrorCode =
  | 'UNAUTHORIZED'
  | 'FORBIDDEN'
  | 'NOT_FOUND'
  | 'VALIDATION_ERROR'
  | 'RATE_LIMIT_EXCEEDED'
  | 'INTERNAL_ERROR';

Example

json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid request body",
    "details": {
      "name": "Required field",
      "llmModel": "Must be a supported model"
    }
  }
}

Timestamps

All timestamps use ISO 8601 format in UTC:

2025-01-20T14:30:00Z

When filtering by date, use the same format:

bash
GET /api/v1/conversations?createdAfter=2025-01-01T00:00:00Z