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 URL:
http://localhost:5055(default development) - Content Type:
application/json - Authentication: Optional password-based authentication
- API Version: v0.2.2
Open Notebook supports optional password-based authentication via the APP_PASSWORD environment variable.
# If APP_PASSWORD is set
curl -H "Authorization: Bearer YOUR_PASSWORD" \
http://localhost:5055/api/notebooks401 Unauthorized:
{
"detail": "Authentication required"
}Manage notebook collections and organization.
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"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 a specific notebook by ID.
Path Parameters:
notebook_id(string): Notebook ID
Response: Same as POST response
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 a notebook.
Path Parameters:
notebook_id(string): Notebook ID
Response:
{
"message": "Notebook deleted successfully"
}Manage content sources within notebooks.
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 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 a specific source by ID.
Path Parameters:
source_id(string): Source ID
Response: Same as POST response
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 a source.
Path Parameters:
source_id(string): Source ID
Response:
{
"message": "Source deleted successfully"
}Manage notes within notebooks.
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 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 a specific note by ID.
Path Parameters:
note_id(string): Note ID
Response: Same as POST response
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 a note.
Path Parameters:
note_id(string): Note ID
Response:
{
"message": "Note deleted successfully"
}Perform full-text and vector search across content.
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"
}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..."}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?"
}Manage AI models and configurations.
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"
}
]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 a specific model by ID.
Path Parameters:
model_id(string): Model ID
Response: Same as POST response
Delete a model configuration.
Path Parameters:
model_id(string): Model ID
Response:
{
"message": "Model deleted successfully"
}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"
}Manage content transformations and AI-powered analysis.
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"
}
]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 a specific transformation by ID.
Path Parameters:
transformation_id(string): Transformation ID
Response: Same as POST response
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 a transformation.
Path Parameters:
transformation_id(string): Transformation ID
Response:
{
"message": "Transformation deleted successfully"
}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"
}Manage AI-generated insights for sources.
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"
}
]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
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"
}Generate professional multi-speaker podcasts.
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 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"
}
]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 a specific podcast episode.
Path Parameters:
episode_id(string): Episode ID
Response: Same as POST response
Download the generated audio file.
Path Parameters:
episode_id(string): Episode ID
Response: Audio file download (MP3 format)
Manage application settings and configuration.
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"]
}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
Manage chat sessions and conversational AI interactions within notebooks.
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"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 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
}
]
}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 a chat session and all its messages.
Path Parameters:
session_id(string): Chat session ID
Response:
{
"success": true,
"message": "Session deleted successfully"
}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": []}
}'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
}Manage context configuration for AI operations.
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
}Monitor and manage background jobs.
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 a specific command by ID.
Path Parameters:
command_id(string): Command ID
Response: Same as array item above
Cancel/delete a command.
Path Parameters:
command_id(string): Command ID
Response:
{
"message": "Command deleted successfully"
}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.
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_IDRebuild 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 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
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"
}# 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\"}"# 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# 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"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.
The API currently doesn't enforce rate limiting, but it's recommended to implement rate limiting in production deployments to prevent abuse.
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.