Documentation
Welcome to the Epist.ai Developer Hub. Integrate powerful audio intelligence into your applications with our production-ready API.
Quickstart
Transcribe and search your first file in minutes.
SDKs & Tools
Libraries for Python, Node.js, and MCP.
Authentication & Limits
Authenticate all requests using the X-API-Key header. Secure your keys and manage them in the Dashboard.
# Example Request - Check API Status curl -H "X-API-Key: sk_live_..." https://api.epist.ai/api/v1/health
Security Best Practice
Never reproduce your API keys in client-side code (browsers, mobile apps). Always route requests through your own backend server.
Rate Limits
| Resource | Limit per Minute |
|---|---|
| /v1/transcribe | 10 requests |
| /v1/search | 100 requests |
| General | 1,000 requests |
Error Codes
| Code | Description |
|---|---|
| 200 OK | Request was successful. |
| 401 Unauthorized | Missing or invalid API key. |
| 429 Too Many Requests | Rate limit exceeded. |
| 500 Internal Error | Something went wrong on our end. |
Audio & Transcription
Upload audio files directly or provide a URL. Our engine automatically handles speaker diarization, timestamps, and semantic indexing.
Upload Local File
// Loading...
Transcribe Remote URL
curl -X POST https://api.epist.ai/api/v1/audio/transcribe_url \
-H "X-API-Key: $EPIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"audio_url": "https://storage.example.com/podcast.mp3",
"rag_enabled": true,
"language": "en"
}'Semantic Search
Perform hybrid search (Dense Vector + Sparse Keyword) across your audio knowledge base. This endpoint is optimized for RAG applications.
const results = await fetch('https://api.epist.ai/api/v1/search', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.EPIST_API_KEY
},
body: JSON.stringify({
query: 'What was the conclusion on the Q3 roadmap?',
limit: 5,
rrf_k: 60
})
});Chat (RAG)
A drop-in replacement for OpenAI Chat Completions that has access to your audio data. Citations are automatically included in the response.
// Loading...
Citations Included
Each response message includes a citations array. Each citation maps generated text to specific start_time and end_time in the source audio.
Tutorial: getting Started
Learn how to integrate powerful audio intelligence into your applications. This tutorial covers file uploads, URL transcription, status polling, and semantic search.
1. Python SDK Integration
The Python SDK is the recommended way to interact with Epist. It handles authentication, error handling, and file uploads automatically.
Installation
pip install epist
Complete Example
Create a file named epist_demo.py. This script demonstrates the full lifecycle.
import os
import time
from epist import Epist
# Initialize the client
# Ensure EPIST_API_KEY is set in your environment or passed explicitly
client = Epist(api_key="YOUR_API_KEY")
def main():
# --- 1. Upload a Local File ---
print("\n[1] Uploading 'interview.mp3'...")
try:
# Uploads are synchronous but processing is asynchronous
upload_res = client.upload_file("interview.mp3")
task_id = upload_res["id"]
print(f"Upload successful. Task ID: {task_id}")
except Exception as e:
print(f"Upload failed: {e}")
return
# --- 2. Poll for Completion ---
# We must wait for the audio to be processed before we can search it.
print(f"\n[2] Polling status for task: {task_id}")
while True:
status_res = client.get_status(task_id)
status = status_res.get("status")
print(f"Status: {status}")
if status == "completed":
print("Processing complete!")
break
elif status == "failed":
print(f"Task failed: {status_res.get('error')}")
return
time.sleep(2)
# --- 3. Semantic Search ---
# Now that the file is indexed, we can ask questions about it.
query = "What was discussed about the roadmap?"
print(f"\n[3] Searching knowledge base for: '{query}'")
search_res = client.search(query=query, limit=3)
for idx, item in enumerate(search_res, 1):
print(f"\nResult {idx}:")
print(f"Text: {item.get('text', '')[:150]}...")
print(f"Score: {item.get('score')}")
if __name__ == "__main__":
main()2. Node.js Integration
For Node.js applications, use the epist package to interact with the API.
Installation
npm install epist
Complete Example
const { Epist } = require('epist');
// Initialize the client
const client = new Epist({
apiKey: "YOUR_API_KEY",
baseUrl: "https://epist-api-staging-920152096400.us-central1.run.app/api/v1"
});
async function main() {
// --- 1. Transcribe from URL ---
const audioUrl = "https://storage.googleapis.com/cloud-samples-data/speech/brooklyn_bridge.flac";
console.log(`\n[1] Transcribing URL: ${audioUrl}`);
try {
const urlRes = await client.transcribeUrl(audioUrl, true);
const taskId = urlRes.id;
console.log(`Task started. ID: ${taskId}`);
// --- 2. Poll Status ---
await pollStatus(client, taskId);
// --- 3. Search ---
const query = "How old is the bridge?";
console.log(`\n[3] Searching for: '${query}'`);
const searchRes = await client.search(query, 1);
searchRes.forEach(result => {
console.log(`\nAnswer: ${result.text}`);
});
} catch (error) {
console.error("Error:", error.message);
}
}
async function pollStatus(client, id) {
while (true) {
const res = await client.getStatus(id);
const status = res.status;
console.log(`Status: ${status}`);
if (status === 'completed' || status === 'failed') break;
await new Promise(r => setTimeout(r, 2000));
}
}
main();Observability
Debug and monitor your integrations with built-in tracing.
Request Logs
curl .../api/v1/logs?limit=50
Traces
curl .../api/v1/traces/{id}SDKs & Tools
MCP Server
Connect your audio data to Claude Desktop using the Model Context Protocol.
pip install epist-mcp-server && epist-mcp install
Python Client
pip install epist
JavaScript Client
npm install epist
Embeddable Widget
Add semantic search to any website with a single script tag.
<script src="https://cdn.epist.ai/widget.js"></script>