---
# System prepended metadata

title: Threads API

---

# Threads API

The Threads API provides a stateful conversation experience with persistent message history and advanced RAG-powered run management.

## Overview

The Threads API enables persistent, context-aware conversations with powerful knowledge retrieval:

1. **Create Threads** - Start new conversations with optional initial messages
2. **Manage Messages** - Add user/assistant messages with rich metadata
3. **Execute Runs** - Generate AI responses with full RAG pipeline integration
4. **Track Progress** - Monitor run status, usage, and performance
5. **Retrieve History** - Access complete conversation and run history

### Key Features

- **🧠 RAG Integration**: Automatic knowledge retrieval from your vector database
- **🔄 Provider Agnostic**: Works with both OpenAI and Anthropic models
- **📡 Real-time Streaming**: Server-sent events for live response delivery
- **📊 Rich Metadata**: Track models, providers, settings, and usage
- **🎯 Advanced Retrieval**: Multiple strategies (semantic, hybrid, source-prioritized)
- **💬 OpenAI Compatible**: Drop-in replacement for OpenAI Threads API

### Typical Chat Application Flow

#### **Recommended: Single-Call Thread Creation**
```
1. User: "How do I create a Stellar account?"
2. POST /threads
   Body: { "messages": [{ "role": "user", "content": "How do I create a Stellar account?" }] }
   → Creates thread + adds message in one call

3. POST /threads/{thread_id}/runs
   Body: { "model": "gpt-4o-mini", "temperature": 0.7 }
   → Triggers RAG-powered response generation
   → Returns streaming SSE response
   → Automatically creates assistant message with metadata
```

#### **Multi-turn Conversation**
```
4. User: "What about multi-signature accounts?"
5. POST /threads/{thread_id}/messages
   Body: { "role": "user", "content": "What about multi-signature accounts?" }

6. POST /threads/{thread_id}/runs
   Body: { "model": "claude-3-5-sonnet-20241022" }
   → AI uses full conversation history + retrieves relevant context
   → Generates contextual response building on previous discussion
```

### Benefits for Developers

- **🚀 Simplified Integration**: No need to manage conversation state
- **⚡ Performance**: Optimized RAG pipeline with intelligent caching
- **🔧 Flexible Configuration**: Fine-tune retrieval, models, and generation
- **📈 Observability**: Detailed run tracking and usage analytics
- **🛡️ Reliability**: Built-in error handling and fallback strategies

## Authentication

All requests require an API key in the `x-api-key` header:

```bash
x-api-key: YOUR_API_KEY
```

## Thread Management

### Create a Thread

Create a new conversation thread, optionally with initial messages.

**Endpoint:** `POST /threads`

#### Request Body

```json
{
  "title": "Stellar Smart Contracts Help",
  "metadata": {
    "user_id": "user_123",
    "session": "web_chat",
    "source": "website"
  },
  "messages": [
    {
      "role": "user",
      "content": "I need help with Stellar smart contracts"
    }
  ]
}
```

#### Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `title` | string | No | Thread title (max 60 characters). If not provided, will be auto-generated after first assistant response |
| `metadata` | object | No | Custom metadata for the thread |
| `messages` | array | No | Initial messages to add to the thread |
| `messages[].role` | string | Yes | Message role: `"user"` or `"assistant"` |
| `messages[].content` | string | Yes | Message content |

#### Response

```json
{
  "id": "thread_abc123def456",
  "object": "thread",
  "created_at": 1699014083,
  "title": "Stellar Smart Contracts Help",
  "metadata": {
    "user_id": "user_123",
    "session": "web_chat",
    "source": "website"
  }
}
```

### Retrieve a Thread

Get details about a specific thread.

**Endpoint:** `GET /threads/{thread_id}`

#### Response

```json
{
  "id": "thread_abc123def456",
  "object": "thread",
  "created_at": 1699014083,
  "title": "Stellar Smart Contracts Help",
  "metadata": {
    "user_id": "user_123",
    "session": "web_chat",
    "source": "website"
  }
}
```

### Retrieve All Threads

Get all threads, optionally with pagination.

**Endpoint:** `GET /threads`

#### Query Parameters

| Parameter | Type | Required | Description | Default |
|-----------|------|----------|-------------|---------|
| `limit` | number | No | Maximum number of threads to return | `10` |
| `offset` | number | No | Number of threads to skip | `0` |

#### Response

```json
{
  "object": "list",
  "data": [
    {
      "id": "thread_abc123def456",
      "object": "thread",
      "created_at": 1699014083,
      "title": "Stellar Smart Contracts Help",
      "metadata": {
        "user_id": "user_123",
        "session": "web_chat",
        "source": "website"
      }
    },
    ...
  ],
  "first_id": "thread_abc123def456",
  "last_id": "thread_xyz789abc123",
  "total_count": 100
}
```

### Update Thread Title

Update the title of an existing thread. Useful for manually setting or correcting auto-generated titles.

**Endpoint:** `PATCH /threads/{thread_id}`

#### Request Body

```json
{
  "title": "Updated Thread Title"
}
```

#### Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `title` | string | Yes | New thread title (1-60 characters) |

#### Response

```json
{
  "id": "thread_abc123def456",
  "object": "thread",
  "created_at": 1699014083,
  "title": "Updated Thread Title",
  "metadata": {
    "user_id": "user_123",
    "session": "web_chat",
    "source": "website"
  }
}
```

### Delete a Thread

Delete a thread and all its associated messages and runs.

**Endpoint:** `DELETE /threads/{thread_id}`

#### Response

```json
{
  "deleted": true
}
```

## Automatic Title Generation

Threads automatically generate descriptive titles after the first assistant response is completed. This feature:

- **Triggers automatically** when a thread has no title and receives its first assistant response
- **Uses lightweight AI** (GPT-4o-mini) to generate concise, descriptive titles (max 60 characters)
- **Analyzes conversation context** from both the user's question and assistant's response
- **Provides intelligent fallbacks** if generation fails (uses first sentence or truncated user message)
- **Fails gracefully** without affecting the main conversation flow

#### Title Generation Behavior

| Scenario | Behavior |
|----------|----------|
| Thread created with title | No auto-generation, uses provided title |
| Thread created without title | Auto-generates after first assistant response |
| Very short messages | Skips generation, uses fallback |
| Error responses | Skips generation to avoid unhelpful titles |
| Generation failure | Uses intelligent fallback based on user message |

#### Manual Override

You can always override auto-generated titles using the `PATCH /threads/{thread_id}` endpoint.

## Message Management

### Add a Message

Add a new message to an existing thread.

**Endpoint:** `POST /threads/{thread_id}/messages`

#### Request Body

```json
{
  "role": "user",
  "content": "How do I create a Stellar account?",
  "title": "Stellar Account Creation"
}
```

#### Parameters

| Parameter | Type | Required | Description | Default |
|-----------|------|----------|-------------|---------|
| `role` | string | No | Message role: `"user"` or `"assistant"` | `"user"` |
| `content` | string | Yes | Message content (minimum 1 character) | - |
| `title` | string | No | Optional title for the thread (max 60 characters) | - |

#### Response

```json
{
  "id": "msg_xyz789abc123",
  "object": "thread.message",
  "created_at": 1699014083,
  "thread_id": "thread_abc123def456",
  "role": "user",
  "content": "How do I create a Stellar account?",
  "title": "Stellar Account Creation"
}
```

### List Messages

Retrieve all messages in a thread, ordered chronologically.

**Endpoint:** `GET /threads/{thread_id}/messages`

#### Response

```json
{
  "object": "list",
  "data": [
    {
      "id": "msg_xyz789abc123",
      "object": "thread.message",
      "created_at": 1699014083,
      "thread_id": "thread_abc123def456",
      "role": "user",
      "content": "How do I create a Stellar account?",
      "metadata": {
        "timestamp": "2024-01-15T10:30:00Z"
      }
    },
    {
      "id": "msg_def456ghi789",
      "object": "thread.message",
      "created_at": 1699014143,
      "thread_id": "thread_abc123def456",
      "role": "assistant",
      "content": "To create a Stellar account, you'll need to generate a keypair...",
      "title": "Stellar Account Creation",
      "metadata": {
        "runId": "run_abc123def456",
        "model": "gpt-4o-mini",
        "provider": "openai",
        "temperature": 0.7,
        "retrievalStrategy": "SEMANTIC",
        "created_at": 1699014143
      }
    }
  ],
  "first_id": "msg_xyz789abc123",
  "last_id": "msg_def456ghi789",
  "has_more": false
}
```

### Add Message Feedback

Provide feedback on an assistant message to improve model performance.

**Endpoint:** `POST /threads/{thread_id}/messages/{message_id}/feedback`

#### Request Body

```json
{
  "rating": "thumbs_up",
  "comment": "Very helpful explanation with clear examples!"
}
```

#### Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rating` | string | Yes | `"thumbs_up"` or `"thumbs_down"` |
| `comment` | string | No | Optional feedback comment |

#### Response

```json
{
  "success": true
}
```

## Run Management

### Create a Run

Execute the RAG-powered AI system to generate a response for the thread. This automatically creates an assistant message and streams the response in real-time.

**Endpoint:** `POST /threads/{thread_id}/runs`

#### Request Body

```json
{
  "provider": "openai",
  "model": "gpt-4o-mini",
  "temperature": 0.7,
  "max_tokens": 1500,
  "topK": 5,
  "retrievalStrategy": "HYBRID",
  "structuredOutput": false,
  "includeCitations": true,
  "filter": {
    "source_type": "documentation"
  },
  "promptTemplate": "system-api-base",
  "userTemplate": "user-api-base",
  "promptVariables": {
    "expertise_level": "intermediate"
  }
}
```

#### Parameters

| Parameter | Type | Required | Description | Default |
|-----------|------|----------|-------------|---------|
| **Provider Configuration** |
| `provider` | string | No | `"openai"` or `"anthropic"` | `"openai"` |
| `model` | string | No | Model name (e.g., `"gpt-4o-mini"`, `"claude-3-5-sonnet-20241022"`) | `"gpt-4o-mini"` |
| `temperature` | number | No | Sampling temperature (0.0-2.0) | `0.5` |
| `max_tokens` | number | No | Maximum tokens to generate | `1500` |
| **Retrieval Configuration** |
| `topK` | number | No | Number of context chunks to retrieve (1-20) | `5` |
| `retrievalStrategy` | string | No | `"SEMANTIC"`, `"KEYWORD"`, `"HYBRID"`, `"SOURCE_PRIORITIZED"` | `"SEMANTIC"` |
| `filter` | object | No | Filter criteria for knowledge retrieval | `{}` |
| `sourcePriorities` | array | No | Source prioritization for `SOURCE_PRIORITIZED` strategy | `[]` |
| `includeAllSources` | boolean | No | Include all available sources | `false` |
| **Output Configuration** |
| `structuredOutput` | boolean | No | Enable structured JSON output | `false` |
| `includeCitations` | boolean | No | Include source citations in response | `false` |
| `response_format` | object | No | OpenAI-compatible response format | `{"type": "text"}` |
| **Prompt Configuration** |
| `promptTemplate` | string | No | System prompt template to use | `"system-api-base"` |
| `userTemplate` | string | No | User message template to use | `"user-api-base"` |
| `promptVariables` | object | No | Variables to inject into prompt templates | `{}` |

#### Retrieval Strategies

| Strategy | Description | Use Case |
|----------|-------------|----------|
| `SEMANTIC` | Vector similarity search using embeddings | Best for conceptual queries |
| `KEYWORD` | Traditional keyword/term matching | Best for exact term searches |
| `HYBRID` | Combined semantic and keyword search | **Recommended** - balanced approach |
| `SOURCE_PRIORITIZED` | Prioritize specific source types | When you need specific source types |

#### Source Prioritization

When using `SOURCE_PRIORITIZED` strategy, specify which sources to prioritize:

```json
{
  "retrievalStrategy": "SOURCE_PRIORITIZED",
  "sourcePriorities": [
    {
      "sourceType": "documentation",
      "weight": 0.7,
      "topK": 5
    },
    {
      "sourceType": "github-issues",
      "weight": 0.3,
      "topK": 3
    }
  ],
  "includeAllSources": false
}
```

**Note**: If `sourcePriorities` is not provided with `SOURCE_PRIORITIZED`, the system automatically falls back to `SEMANTIC` strategy.

#### Response Headers

```
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
X-Run-ID: run_def456ghi789
X-Message-ID: msg_jkl012mno345
```

#### Streaming Response

The response uses Server-Sent Events (SSE) format. Each event contains JSON data:

```
data: {"type": "context", "context": [{"id": "doc_123", "score": 0.95, "text": "Stellar accounts are..."}]}

data: {"type": "content", "content": "To create a Stellar account"}

data: {"type": "content", "content": ", you'll need to follow these steps:\n\n1. "}

data: {"type": "content", "content": "Generate a keypair using the Stellar SDK..."}

data: {"type": "done", "messageId": "msg_jkl012mno345", "runId": "run_def456ghi789", "usage": {"prompt_tokens": 150, "completion_tokens": 75, "total_tokens": 225}}

data: [DONE]
```

#### Event Types

| Type | Description | When Sent |
|------|-------------|-----------|
| `context` | Retrieved knowledge base context | Once, when context is ready |
| `content` | Incremental text content from AI | Multiple times during generation |
| `done` | Final completion with metadata | Once, when generation completes |

#### Event Data Structure

**Context Event:**
```json
{
  "type": "context",
  "context": [
    {
      "id": "doc_123",
      "score": 0.95,
      "text": "Stellar accounts are identified by...",
      "metadata": {
        "source": "stellar-docs",
        "url": "https://developers.stellar.org/docs/accounts"
      }
    }
  ]
}
```

**Content Event:**
```json
{
  "type": "content",
  "content": "To create a Stellar account"
}
```

**Done Event:**
```json
{
  "type": "done",
  "messageId": "msg_jkl012mno345",
  "runId": "run_def456ghi789",
  "usage": {
    "prompt_tokens": 150,
    "completion_tokens": 75,
    "total_tokens": 225
  }
}
```

### Retrieve a Run

Get details about a specific run.

```
GET /v1/threads/{thread_id}/runs/{run_id}
```

#### Response

```json
{
  "id": "run_def456ghi789",
  "object": "thread.run",
  "created_at": 1699000000,
  "thread_id": "thread_abc123def456",
  "status": "completed",
  "started_at": 1699000001,
  "completed_at": 1699000015,
  "model": "claude-3-opus-20240229",
  "metadata": {
    "retrieval_strategy": "source_prioritized"
  },
  "usage": {
    "prompt_tokens": 150,
    "completion_tokens": 75,
    "total_tokens": 225
  }
}
```

### List Runs

Get all runs for a thread.

```
GET /v1/threads/{thread_id}/runs
```

#### Response

```json
{
  "object": "list",
  "data": [
    {
      "id": "run_def456ghi789",
      "object": "thread.run",
      "created_at": 1699000000,
      "thread_id": "thread_abc123def456",
      "status": "completed",
      "model": "claude-3-opus-20240229"
    }
  ],
  "first_id": "run_def456ghi789",
  "last_id": "run_def456ghi789",
  "has_more": false
}
```

### Cancel a Run

Cancel a running operation.

```
POST /v1/threads/{thread_id}/runs/{run_id}/cancel
```

#### Response

```json
{
  "id": "run_def456ghi789",
  "object": "thread.run",
  "created_at": 1699000000,
  "thread_id": "thread_abc123def456",
  "status": "cancelled",
  "cancelled_at": 1699000010
}
```

## Run Status Values

| Status | Description |
|--------|-------------|
| `queued` | Run is waiting to be processed |
| `in_progress` | Run is currently executing |
| `requires_action` | Run requires user action (future use) |
| `cancelling` | Run is being cancelled |
| `cancelled` | Run was cancelled |
| `failed` | Run failed with an error |
| `completed` | Run completed successfully |
| `expired` | Run expired before completion |

## Examples

### Complete Conversation Flow

#### 1. Create Thread with Initial Message

```bash
# Option A: Let the system auto-generate a title after first response
curl -X POST https://api.stellabot.app/v1/threads \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "metadata": {"user_id": "user_123"},
    "messages": [
      {
        "role": "user",
        "content": "I want to learn about Stellar smart contracts"
      }
    ]
  }'

# Option B: Provide a custom title upfront
curl -X POST https://api.stellabot.app/v1/threads \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Learning Stellar Smart Contracts",
    "metadata": {"user_id": "user_123"},
    "messages": [
      {
        "role": "user",
        "content": "I want to learn about Stellar smart contracts"
      }
    ]
  }'
```

#### 2. Create Run to Generate Response

```bash
curl -X POST https://api.stellabot.app/v1/threads/thread_abc123/runs \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-3-opus-20240229",
    "temperature": 0.7,
    "retrieval_strategy": "hybrid",
    "include_citations": true
  }'
```

#### 3. Add Follow-up Message

```bash
curl -X POST https://api.stellabot.app/v1/threads/thread_abc123/messages \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "role": "user",
    "content": "Can you show me a code example?"
  }'
```

#### 4. Create Another Run

```bash
curl -X POST https://api.stellabot.app/v1/threads/thread_abc123/runs \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "response_format": {"type": "json_object"},
    "retrieval_strategy": "source_prioritized"
  }'
```

#### 5. Update Thread Title (Optional)

```bash
# Update the auto-generated or existing title
curl -X PATCH https://api.stellabot.app/v1/threads/thread_abc123 \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Stellar Smart Contracts: Complete Guide"
  }'
```

### Advanced Run Configuration

```bash
curl -X POST https://api.stellabot.app/v1/threads/thread_abc123/runs \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "anthropic",
    "model": "claude-3-sonnet-20240229",
    "temperature": 0.3,
    "maxTokens": 2000,
    "retrievalStrategy": "HYBRID",
    "includeCitations": true,
    "filter": {
      "source_type": "documentation",
      "category": "smart_contracts"
    },
    "promptTemplate": "code-examples",
    "promptVariables": {
      "language": "javascript",
      "complexity": "intermediate"
    }
  }'
```

### Monitor Run Progress

```bash
# Check run status
curl -X GET https://api.stellabot.app/v1/threads/thread_abc123/runs/run_def456 \
  -H "x-api-key: YOUR_API_KEY"

# Cancel if needed
curl -X POST https://api.stellabot.app/v1/threads/thread_abc123/runs/run_def456/cancel \
  -H "x-api-key: YOUR_API_KEY"
```

## Error Responses

### 400 Bad Request

```json
{
  "error": "Thread has no messages"
}
```

### 404 Not Found

```json
{
  "error": "Thread not found"
}
```

### 404 Run Not Found

```json
{
  "error": "Run not found or cannot be cancelled"
}
```

## Best Practices

### Thread Management
1. **Use meaningful metadata** - Store user IDs, session info, etc.
2. **Let titles auto-generate** - System creates descriptive titles after first response
3. **Override when needed** - Use PATCH to update auto-generated titles if necessary
4. **Keep titles concise** - Maximum 60 characters for optimal display
5. **Clean up old threads** - Delete threads when conversations end
6. **Monitor thread size** - Very long threads may impact performance

### Message Management
2. **Add context in system messages** - Provide relevant background
3. **Use metadata for tracking** - Store timestamps, sources, etc.
4. **Collect feedback** - Use thumbs up/down for model improvement

### Run Management
1. **Monitor run status** - Check for failures and handle appropriately
2. **Use appropriate models** - Balance cost, speed, and quality
3. **Cancel long-running operations** - Prevent resource waste
4. **Track token usage** - Monitor costs and optimize prompts

### Performance Optimization
1. **Choose optimal retrieval strategies** - `hybrid` for best results
2. **Use filters effectively** - Narrow search scope when possible
3. **Set reasonable token limits** - Prevent excessive generation
4. **Stream responses** - Better user experience for long responses

## Model Support

### OpenAI Models
- `gpt-4o` - Latest GPT-4 Omni model
- `gpt-4o-mini` - Faster, cost-effective GPT-4 Omni
- `gpt-4-turbo` - GPT-4 Turbo with 128K context
- `gpt-4` - Standard GPT-4 model

### Anthropic Models
- `claude-3-5-sonnet-20241022` - Latest Claude 3.5 Sonnet (8K output)
- `claude-3-5-haiku-20241022` - Latest Claude 3.5 Haiku (fast)
- `claude-3-opus-20240229` - Most capable Claude 3 model
- `claude-3-sonnet-20240229` - Balanced performance and speed
- `claude-3-haiku-20240307` - Fastest Claude 3 model

### Automatic Provider Detection

The API automatically detects the provider based on the model name:
- Models containing `claude` → Anthropic provider
- Models containing `gpt` → OpenAI provider
- No need to specify provider explicitly

## OpenAI Compatibility

The Threads API is designed to be compatible with OpenAI's Assistants API pattern while adding powerful RAG capabilities:

### Key Similarities:
- Thread and message management
- Run-based execution model
- Streaming responses
- Status tracking

### Key Differences:
- **RAG Integration** - Automatic knowledge retrieval
- **Enhanced Parameters** - Support for retrieval strategies
- **Flexible Naming** - Both snake_case and camelCase support
- **Source Citations** - Optional citation of retrieved sources
- **Advanced Filtering** - Filter knowledge base searches

## Rate Limits

Rate limits are applied per API key:
- **Thread operations**: 1,000/hour
- **Message operations**: 5,000/hour
- **Run operations**: 500/hour
- **Enterprise**: Custom limits available