30 KiB
API Reference
Open Notebook provides a comprehensive REST API for programmatic access to all functionality. This document covers all available endpoints, authentication, request/response formats, and usage examples.
🔗 Base Information
- Base URL:
http://localhost:5055(default development) - Content Type:
application/json - Authentication: Optional password-based authentication
- API Version: v0.2.2
🔐 Authentication
Open Notebook supports optional password-based authentication via the APP_PASSWORD environment variable.
Authentication Header
# If APP_PASSWORD is set
curl -H "Authorization: Bearer YOUR_PASSWORD" \
http://localhost:5055/api/notebooks
Authentication Responses
401 Unauthorized:
{
"detail": "Authentication required"
}
📚 Notebooks API
Manage notebook collections and organization.
GET /api/notebooks
Get all notebooks with optional filtering and ordering.
Query Parameters:
archived(boolean, optional): Filter by archived statusorder_by(string, optional): Order by field and direction (default: "updated desc")
Response:
[
{
"id": "notebook:uuid",
"name": "My Research Notebook",
"description": "Research on AI applications",
"archived": false,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
Example:
curl -X GET "http://localhost:5055/api/notebooks?archived=false&order_by=created desc"
POST /api/notebooks
Create a new notebook.
Request Body:
{
"name": "My New Notebook",
"description": "Description of the notebook"
}
Response: Same as GET single notebook
Example:
curl -X POST http://localhost:5055/api/notebooks \
-H "Content-Type: application/json" \
-d '{"name": "Research Project", "description": "AI research notebook"}'
GET /api/notebooks/{notebook_id}
Get a specific notebook by ID.
Path Parameters:
notebook_id(string): Notebook ID
Response: Same as POST response
PUT /api/notebooks/{notebook_id}
Update a notebook.
Path Parameters:
notebook_id(string): Notebook ID
Request Body (all fields optional):
{
"name": "Updated Name",
"description": "Updated description",
"archived": true
}
Response: Same as GET single notebook
DELETE /api/notebooks/{notebook_id}
Delete a notebook.
Path Parameters:
notebook_id(string): Notebook ID
Response:
{
"message": "Notebook deleted successfully"
}
📄 Sources API
Manage content sources within notebooks.
POST /api/sources
Create a new source.
Request Body:
{
"notebook_id": "notebook:uuid",
"type": "link",
"url": "https://example.com/article",
"title": "Optional title",
"transformations": ["transformation:uuid"],
"embed": true,
"delete_source": false
}
Source Types:
link: Web URLupload: File uploadtext: Direct text content
Response:
{
"id": "source:uuid",
"title": "Article Title",
"topics": ["AI", "Machine Learning"],
"asset": {
"url": "https://example.com/article"
},
"full_text": "Article content...",
"embedded_chunks": 15,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
GET /api/sources
Get all sources with optional filtering.
Query Parameters:
notebook_id(string, optional): Filter by notebooklimit(integer, optional): Maximum results (default: 100)offset(integer, optional): Pagination offset
Response:
[
{
"id": "source:uuid",
"title": "Article Title",
"topics": ["AI"],
"asset": {
"url": "https://example.com/article"
},
"embedded_chunks": 15,
"insights_count": 3,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
GET /api/sources/{source_id}
Get a specific source by ID.
Path Parameters:
source_id(string): Source ID
Response: Same as POST response
PUT /api/sources/{source_id}
Update a source.
Path Parameters:
source_id(string): Source ID
Request Body (all fields optional):
{
"title": "Updated Title",
"topics": ["Updated", "Topics"]
}
Response: Same as GET single source
DELETE /api/sources/{source_id}
Delete a source.
Path Parameters:
source_id(string): Source ID
Response:
{
"message": "Source deleted successfully"
}
📝 Notes API
Manage notes within notebooks.
POST /api/notes
Create a new note.
Request Body:
{
"title": "Note Title",
"content": "Note content",
"note_type": "human",
"notebook_id": "notebook:uuid"
}
Note Types:
human: Manual noteai: AI-generated note
Response:
{
"id": "note:uuid",
"title": "Note Title",
"content": "Note content",
"note_type": "human",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
GET /api/notes
Get all notes with optional filtering.
Query Parameters:
notebook_id(string, optional): Filter by notebooknote_type(string, optional): Filter by note typelimit(integer, optional): Maximum results
Response: Array of note objects
GET /api/notes/{note_id}
Get a specific note by ID.
Path Parameters:
note_id(string): Note ID
Response: Same as POST response
PUT /api/notes/{note_id}
Update a note.
Path Parameters:
note_id(string): Note ID
Request Body (all fields optional):
{
"title": "Updated Title",
"content": "Updated content",
"note_type": "ai"
}
Response: Same as GET single note
DELETE /api/notes/{note_id}
Delete a note.
Path Parameters:
note_id(string): Note ID
Response:
{
"message": "Note deleted successfully"
}
🔍 Search API
Perform full-text and vector search across content.
POST /api/search
Search the knowledge base.
Request Body:
{
"query": "artificial intelligence",
"type": "vector",
"limit": 10,
"search_sources": true,
"search_notes": true,
"minimum_score": 0.2
}
Search Types:
text: Full-text searchvector: Semantic search (requires embedding model)
Response:
{
"results": [
{
"id": "source:uuid",
"title": "AI Research Paper",
"content": "Relevant content excerpt...",
"score": 0.85,
"type": "source",
"metadata": {
"topics": ["AI", "Machine Learning"]
}
}
],
"total_count": 1,
"search_type": "vector"
}
POST /api/search/ask
Ask questions using AI models (streaming response).
Request Body:
{
"question": "What are the key benefits of AI?",
"strategy_model": "model:gpt-5-mini",
"answer_model": "model:gpt-5-mini",
"final_answer_model": "model:gpt-5-mini"
}
Response: Server-Sent Events (SSE) stream
Stream Events:
// Strategy phase
data: {"type": "strategy", "reasoning": "...", "searches": [...]}
// Individual answers
data: {"type": "answer", "content": "Answer content..."}
// Final answer
data: {"type": "final_answer", "content": "Final synthesized answer..."}
// Completion
data: {"type": "complete", "final_answer": "Final answer..."}
POST /api/search/ask/simple
Ask questions (non-streaming response).
Request Body: Same as streaming version
Response:
{
"answer": "The key benefits of AI include...",
"question": "What are the key benefits of AI?"
}
🤖 Models API
Manage AI models and configurations.
GET /api/models
Get all configured models.
Response:
[
{
"id": "model:uuid",
"name": "gpt-5-mini",
"provider": "openai",
"type": "language",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
POST /api/models
Create a new model configuration.
Request Body:
{
"name": "gpt-5-mini",
"provider": "openai",
"type": "language"
}
Model Types:
language: Text generation modelsembedding: Vector embedding modelstext_to_speech: TTS modelsspeech_to_text: STT models
Response: Same as GET single model
GET /api/models/{model_id}
Get a specific model by ID.
Path Parameters:
model_id(string): Model ID
Response: Same as POST response
DELETE /api/models/{model_id}
Delete a model configuration.
Path Parameters:
model_id(string): Model ID
Response:
{
"message": "Model deleted successfully"
}
GET /api/models/defaults
Get default model configurations.
Response:
{
"default_chat_model": "model:gpt-5-mini",
"default_transformation_model": "model:gpt-5-mini",
"large_context_model": "model:gpt-5-mini",
"default_text_to_speech_model": "model:gpt-4o-mini-tts",
"default_speech_to_text_model": "model:whisper-1",
"default_embedding_model": "model:text-embedding-3-small",
"default_tools_model": "model:gpt-5-mini"
}
🔧 Transformations API
Manage content transformations and AI-powered analysis.
GET /api/transformations
Get all transformations.
Response:
[
{
"id": "transformation:uuid",
"name": "summarize",
"title": "Summarize Content",
"description": "Create a concise summary",
"prompt": "Summarize the following content...",
"apply_default": true,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
POST /api/transformations
Create a new transformation.
Request Body:
{
"name": "custom_analysis",
"title": "Custom Analysis",
"description": "Perform custom content analysis",
"prompt": "Analyze the following content for key themes...",
"apply_default": false
}
Response: Same as GET single transformation
GET /api/transformations/{transformation_id}
Get a specific transformation by ID.
Path Parameters:
transformation_id(string): Transformation ID
Response: Same as POST response
PUT /api/transformations/{transformation_id}
Update a transformation.
Path Parameters:
transformation_id(string): Transformation ID
Request Body (all fields optional):
{
"name": "updated_name",
"title": "Updated Title",
"description": "Updated description",
"prompt": "Updated prompt...",
"apply_default": true
}
Response: Same as GET single transformation
DELETE /api/transformations/{transformation_id}
Delete a transformation.
Path Parameters:
transformation_id(string): Transformation ID
Response:
{
"message": "Transformation deleted successfully"
}
POST /api/transformations/execute
Execute a transformation on content.
Request Body:
{
"transformation_id": "transformation:uuid",
"input_text": "Content to transform...",
"model_id": "model:gpt-5-mini"
}
Response:
{
"output": "Transformed content...",
"transformation_id": "transformation:uuid",
"model_id": "model:gpt-5-mini"
}
📊 Insights API
Manage AI-generated insights for sources.
GET /api/sources/{source_id}/insights
Get insights for a specific source.
Path Parameters:
source_id(string): Source ID
Response:
[
{
"id": "insight:uuid",
"source_id": "source:uuid",
"insight_type": "summary",
"content": "This source discusses...",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
POST /api/sources/{source_id}/insights
Create a new insight for a source.
Path Parameters:
source_id(string): Source ID
Request Body:
{
"transformation_id": "transformation:uuid",
"model_id": "model:gpt-5-mini"
}
Response: Same as GET insight
POST /api/insights/{insight_id}/save-as-note
Save an insight as a note.
Path Parameters:
insight_id(string): Insight ID
Request Body:
{
"notebook_id": "notebook:uuid"
}
Response:
{
"note_id": "note:uuid",
"message": "Insight saved as note successfully"
}
🎙️ Podcasts API
Generate professional multi-speaker podcasts.
GET /api/episode-profiles
Get all episode profiles.
Response:
[
{
"id": "episode_profile:uuid",
"name": "tech_discussion",
"description": "Technical discussion between 2 experts",
"speaker_config": "tech_experts",
"outline_provider": "openai",
"outline_model": "gpt-5-mini",
"transcript_provider": "openai",
"transcript_model": "gpt-5-mini",
"default_briefing": "Create an engaging technical discussion...",
"num_segments": 5,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
GET /api/speaker-profiles
Get all speaker profiles.
Response:
[
{
"id": "speaker_profile:uuid",
"name": "tech_experts",
"description": "Two technical experts for tech discussions",
"tts_provider": "openai",
"tts_model": "gpt-4o-mini-tts",
"speakers": [
{
"name": "Dr. Alex Chen",
"voice_id": "nova",
"backstory": "Senior AI researcher...",
"personality": "Analytical, clear communicator..."
}
],
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
POST /api/podcasts
Create a new podcast episode.
Request Body:
{
"name": "AI Discussion Episode",
"briefing": "Discuss the latest AI developments...",
"episode_profile_id": "episode_profile:uuid",
"source_ids": ["source:uuid1", "source:uuid2"],
"note_ids": ["note:uuid1"]
}
Response:
{
"id": "episode:uuid",
"name": "AI Discussion Episode",
"briefing": "Discuss the latest AI developments...",
"episode_profile": {...},
"speaker_profile": {...},
"command": "command:uuid",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
GET /api/podcasts/{episode_id}
Get a specific podcast episode.
Path Parameters:
episode_id(string): Episode ID
Response: Same as POST response
GET /api/podcasts/{episode_id}/audio
Download the generated audio file.
Path Parameters:
episode_id(string): Episode ID
Response: Audio file download (MP3 format)
🎛️ Settings API
Manage application settings and configuration.
GET /api/settings
Get current application settings.
Response:
{
"default_content_processing_engine_doc": "docling",
"default_content_processing_engine_url": "firecrawl",
"default_embedding_option": "auto",
"auto_delete_files": "false",
"youtube_preferred_languages": ["en", "es"]
}
PUT /api/settings
Update application settings.
Request Body (all fields optional):
{
"default_content_processing_engine_doc": "docling",
"default_content_processing_engine_url": "firecrawl",
"default_embedding_option": "auto",
"auto_delete_files": "true",
"youtube_preferred_languages": ["en", "fr", "de"]
}
Response: Same as GET response
💬 Chat API
Manage chat sessions and conversational AI interactions within notebooks.
GET /api/chat/sessions
Get all chat sessions for a notebook.
Query Parameters:
notebook_id(string, required): Notebook ID to get sessions for
Response:
[
{
"id": "chat_session:uuid",
"title": "Chat Session Title",
"notebook_id": "notebook:uuid",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z",
"message_count": 5
}
]
Example:
curl -X GET "http://localhost:5055/api/chat/sessions?notebook_id=notebook:uuid"
POST /api/chat/sessions
Create a new chat session for a notebook.
Request Body:
{
"notebook_id": "notebook:uuid",
"title": "Optional session title"
}
Response: Same as GET single session
Example:
curl -X POST http://localhost:5055/api/chat/sessions \
-H "Content-Type: application/json" \
-d '{"notebook_id": "notebook:uuid", "title": "New Chat Session"}'
GET /api/chat/sessions/{session_id}
Get a specific chat session with its message history.
Path Parameters:
session_id(string): Chat session ID
Response:
{
"id": "chat_session:uuid",
"title": "Chat Session Title",
"notebook_id": "notebook:uuid",
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z",
"message_count": 3,
"messages": [
{
"id": "msg_1",
"type": "human",
"content": "Hello, what can you tell me about AI?",
"timestamp": null
},
{
"id": "msg_2",
"type": "ai",
"content": "AI, or Artificial Intelligence, refers to...",
"timestamp": null
}
]
}
PUT /api/chat/sessions/{session_id}
Update a chat session (currently supports title updates).
Path Parameters:
session_id(string): Chat session ID
Request Body:
{
"title": "Updated Session Title"
}
Response: Same as GET single session (without messages)
DELETE /api/chat/sessions/{session_id}
Delete a chat session and all its messages.
Path Parameters:
session_id(string): Chat session ID
Response:
{
"success": true,
"message": "Session deleted successfully"
}
POST /api/chat/execute
Execute a chat message and get AI response.
Request Body:
{
"session_id": "chat_session:uuid",
"message": "What are the key benefits of machine learning?",
"context": {
"sources": [
{
"id": "source:uuid",
"title": "ML Research Paper",
"content": "Machine learning content..."
}
],
"notes": [
{
"id": "note:uuid",
"title": "ML Notes",
"content": "My notes on ML..."
}
]
}
}
Response:
{
"session_id": "chat_session:uuid",
"messages": [
{
"id": "msg_1",
"type": "human",
"content": "What are the key benefits of machine learning?",
"timestamp": null
},
{
"id": "msg_2",
"type": "ai",
"content": "Based on the provided context, machine learning offers several key benefits...",
"timestamp": null
}
]
}
Example:
curl -X POST http://localhost:5055/api/chat/execute \
-H "Content-Type: application/json" \
-d '{
"session_id": "chat_session:uuid",
"message": "Summarize the main points",
"context": {"sources": [], "notes": []}
}'
POST /api/chat/context
Build context for chat based on notebook content and configuration.
Request Body:
{
"notebook_id": "notebook:uuid",
"context_config": {
"sources": {
"source:uuid1": "full content",
"source:uuid2": "insights only"
},
"notes": {
"note:uuid1": "full content"
}
}
}
Context Configuration Values:
"full content": Include complete source/note content"insights only": Include source insights/summary only"not in context": Exclude from context
Response:
{
"context": {
"sources": [
{
"id": "source:uuid",
"title": "Source Title",
"content": "Source content or insights...",
"type": "source"
}
],
"notes": [
{
"id": "note:uuid",
"title": "Note Title",
"content": "Note content...",
"type": "note"
}
]
},
"token_count": 1250,
"char_count": 5000
}
📐 Context API
Manage context configuration for AI operations.
POST /api/context
Get context information for a notebook.
Request Body:
{
"notebook_id": "notebook:uuid",
"context_config": {
"sources": {
"source:uuid1": "full",
"source:uuid2": "summary"
},
"notes": {
"note:uuid1": "full"
}
}
}
Context Levels:
full: Include complete contentsummary: Include summary onlyexclude: Exclude from context
Response:
{
"notebook_id": "notebook:uuid",
"sources": [
{
"id": "source:uuid",
"title": "Source Title",
"content": "Source content...",
"inclusion_level": "full"
}
],
"notes": [
{
"id": "note:uuid",
"title": "Note Title",
"content": "Note content...",
"inclusion_level": "full"
}
],
"total_tokens": 1500
}
🔨 Commands API
Monitor and manage background jobs.
GET /api/commands
Get all commands (background jobs).
Query Parameters:
status(string, optional): Filter by statuslimit(integer, optional): Maximum results
Response:
[
{
"id": "command:uuid",
"name": "podcast_generation",
"status": "completed",
"progress": 100,
"result": {...},
"error": null,
"created": "2024-01-01T00:00:00Z",
"updated": "2024-01-01T00:00:00Z"
}
]
GET /api/commands/{command_id}
Get a specific command by ID.
Path Parameters:
command_id(string): Command ID
Response: Same as array item above
DELETE /api/commands/{command_id}
Cancel/delete a command.
Path Parameters:
command_id(string): Command ID
Response:
{
"message": "Command deleted successfully"
}
🏷️ Embedding API
Manage vector embeddings for content. The embedding system supports both synchronous and asynchronous processing, as well as bulk rebuild operations for upgrading embeddings when switching models.
POST /api/embed
Generate embeddings for an item (source, note, or insight).
Request Body:
{
"item_id": "source:uuid",
"item_type": "source",
"async_processing": false
}
Parameters:
item_id(string, required): ID of the item to embeditem_type(string, required): Type of item -source,note, orinsightasync_processing(boolean, optional): Process in background (default: false)
Behavior:
- Embedding operations are idempotent - calling multiple times safely replaces existing embeddings
- For sources: Deletes existing chunks and creates new embeddings
- For notes: Updates the note's embedding vector
- For insights: Regenerates the insight's embedding vector
Response (Synchronous):
{
"success": true,
"message": "Source embedded successfully",
"item_id": "source:uuid",
"item_type": "source"
}
Response (Asynchronous):
{
"success": true,
"message": "Embedding queued for background processing",
"item_id": "source:uuid",
"item_type": "source",
"command_id": "command:uuid"
}
Example (Synchronous):
curl -X POST http://localhost:5055/api/embed \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PASSWORD" \
-d '{
"item_id": "source:abc123",
"item_type": "source",
"async_processing": false
}'
Example (Asynchronous):
# Submit for background processing
COMMAND_ID=$(curl -X POST http://localhost:5055/api/embed \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PASSWORD" \
-d '{
"item_id": "source:abc123",
"item_type": "source",
"async_processing": true
}' | jq -r '.command_id')
# Check status
curl -X GET http://localhost:5055/api/commands/$COMMAND_ID
POST /api/embeddings/rebuild
Rebuild embeddings for multiple items in bulk. Useful when switching embedding models or fixing corrupted embeddings.
Request Body:
{
"mode": "existing",
"include_sources": true,
"include_notes": true,
"include_insights": true
}
Parameters:
mode(string, required): Rebuild mode"existing": Re-embed only items that already have embeddings"all": Re-embed existing items + create embeddings for items without any
include_sources(boolean, optional): Include sources in rebuild (default: true)include_notes(boolean, optional): Include notes in rebuild (default: true)include_insights(boolean, optional): Include insights in rebuild (default: true)
Response:
{
"command_id": "command:uuid",
"message": "Rebuild started successfully",
"estimated_items": 165
}
Example:
# Rebuild all existing embeddings
curl -X POST http://localhost:5055/api/embeddings/rebuild \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PASSWORD" \
-d '{
"mode": "existing",
"include_sources": true,
"include_notes": true,
"include_insights": true
}'
# Rebuild and create new embeddings for everything
curl -X POST http://localhost:5055/api/embeddings/rebuild \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PASSWORD" \
-d '{
"mode": "all",
"include_sources": true,
"include_notes": false,
"include_insights": false
}'
GET /api/embeddings/rebuild/{command_id}/status
Get the status and progress of a rebuild operation.
Path Parameters:
command_id(string): Command ID returned from rebuild endpoint
Response (Running):
{
"command_id": "command:uuid",
"status": "running",
"progress": null,
"stats": null,
"started_at": "2024-01-01T12:00:00Z",
"completed_at": null,
"error_message": null
}
Response (Completed):
{
"command_id": "command:uuid",
"status": "completed",
"progress": {
"total_items": 165,
"processed_items": 165,
"failed_items": 0
},
"stats": {
"sources_processed": 115,
"notes_processed": 25,
"insights_processed": 25,
"processing_time": 125.5
},
"started_at": "2024-01-01T12:00:00Z",
"completed_at": "2024-01-01T12:02:05Z",
"error_message": null
}
Response (Failed):
{
"command_id": "command:uuid",
"status": "failed",
"progress": {
"total_items": 165,
"processed_items": 50,
"failed_items": 1
},
"stats": null,
"started_at": "2024-01-01T12:00:00Z",
"completed_at": "2024-01-01T12:01:00Z",
"error_message": "No embedding model configured"
}
Example:
# Start rebuild
COMMAND_ID=$(curl -X POST http://localhost:5055/api/embeddings/rebuild \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_PASSWORD" \
-d '{"mode": "existing", "include_sources": true}' \
| jq -r '.command_id')
# Poll for status
while true; do
STATUS=$(curl -s -X GET \
"http://localhost:5055/api/embeddings/rebuild/$COMMAND_ID/status" \
-H "Authorization: Bearer YOUR_PASSWORD" \
| jq -r '.status')
echo "Status: $STATUS"
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then
break
fi
sleep 5
done
# Get final results
curl -X GET "http://localhost:5055/api/embeddings/rebuild/$COMMAND_ID/status" \
-H "Authorization: Bearer YOUR_PASSWORD" | jq .
Status Values:
queued: Rebuild job queued for processingrunning: Rebuild in progresscompleted: Rebuild finished successfullyfailed: Rebuild failed with error
🚨 Error Responses
Common Error Codes
400 Bad Request:
{
"detail": "Invalid input data"
}
401 Unauthorized:
{
"detail": "Authentication required"
}
404 Not Found:
{
"detail": "Resource not found"
}
422 Validation Error:
{
"detail": [
{
"loc": ["body", "name"],
"msg": "field required",
"type": "value_error.missing"
}
]
}
500 Internal Server Error:
{
"detail": "Internal server error occurred"
}
📋 Usage Examples
Complete Workflow Example
# 1. Create a notebook
NOTEBOOK_ID=$(curl -X POST http://localhost:5055/api/notebooks \
-H "Content-Type: application/json" \
-d '{"name": "AI Research", "description": "Research on AI applications"}' \
| jq -r '.id')
# 2. Add a source
SOURCE_ID=$(curl -X POST http://localhost:5055/api/sources \
-H "Content-Type: application/json" \
-d "{\"notebook_id\": \"$NOTEBOOK_ID\", \"type\": \"link\", \"url\": \"https://example.com/ai-article\", \"embed\": true}" \
| jq -r '.id')
# 3. Create a model
MODEL_ID=$(curl -X POST http://localhost:5055/api/models \
-H "Content-Type: application/json" \
-d '{"name": "gpt-5-mini", "provider": "openai", "type": "language"}' \
| jq -r '.id')
# 4. Search for content
curl -X POST http://localhost:5055/api/search \
-H "Content-Type: application/json" \
-d '{"query": "artificial intelligence", "type": "vector", "limit": 5}'
# 5. Ask a question
curl -X POST http://localhost:5055/api/search/ask/simple \
-H "Content-Type: application/json" \
-d "{\"question\": \"What are the main AI applications?\", \"strategy_model\": \"$MODEL_ID\", \"answer_model\": \"$MODEL_ID\", \"final_answer_model\": \"$MODEL_ID\"}"
Podcast Generation Example
# 1. Get episode profiles
curl -X GET http://localhost:5055/api/episode-profiles
# 2. Create a podcast
EPISODE_ID=$(curl -X POST http://localhost:5055/api/podcasts \
-H "Content-Type: application/json" \
-d "{\"name\": \"AI Discussion\", \"briefing\": \"Discuss AI trends\", \"episode_profile_id\": \"episode_profile:tech_discussion\", \"source_ids\": [\"$SOURCE_ID\"]}" \
| jq -r '.id')
# 3. Check command status
curl -X GET http://localhost:5055/api/commands
# 4. Download audio when ready
curl -X GET http://localhost:5055/api/podcasts/$EPISODE_ID/audio -o podcast.mp3
Chat Conversation Example
# 1. Create a chat session
SESSION_ID=$(curl -X POST http://localhost:5055/api/chat/sessions \
-H "Content-Type: application/json" \
-d "{\"notebook_id\": \"$NOTEBOOK_ID\", \"title\": \"Research Discussion\"}" \
| jq -r '.id')
# 2. Build context for the chat
CONTEXT=$(curl -X POST http://localhost:5055/api/chat/context \
-H "Content-Type: application/json" \
-d "{\"notebook_id\": \"$NOTEBOOK_ID\", \"context_config\": {\"sources\": {\"$SOURCE_ID\": \"full content\"}}}")
# 3. Send a chat message
curl -X POST http://localhost:5055/api/chat/execute \
-H "Content-Type: application/json" \
-d "{\"session_id\": \"$SESSION_ID\", \"message\": \"What are the key insights from this research?\", \"context\": $CONTEXT}"
# 4. Get chat history
curl -X GET http://localhost:5055/api/chat/sessions/$SESSION_ID
# 5. List all sessions for the notebook
curl -X GET "http://localhost:5055/api/chat/sessions?notebook_id=$NOTEBOOK_ID"
📡 WebSocket Support
Currently, Open Notebook uses Server-Sent Events (SSE) for real-time updates in the Ask endpoint. WebSocket support may be added in future versions for more interactive features.
📈 Rate Limiting
The API currently doesn't enforce rate limiting, but it's recommended to implement rate limiting in production deployments to prevent abuse.
🔄 Versioning
The API uses semantic versioning. Breaking changes will increment the major version number. The current API version is included in the OpenAPI documentation at /docs.
This API reference provides comprehensive coverage of Open Notebook's REST API. For additional examples and integration patterns, check the GitHub repository and join our Discord community.