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.

Security

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

ResourceLimit per Minute
/v1/transcribe10 requests
/v1/search100 requests
General1,000 requests

Error Codes

CodeDescription
200 OKRequest was successful.
401 UnauthorizedMissing or invalid API key.
429 Too Many RequestsRate limit exceeded.
500 Internal ErrorSomething went wrong on our end.
Core API

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"
  }'
Generative

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.

Guides

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

bash
pip install epist

Complete Example

Create a file named epist_demo.py. This script demonstrates the full lifecycle.

python
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

bash
npm install epist

Complete Example

javascript
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}
Ecosystem

SDKs & Tools

MCP Server

Connect your audio data to Claude Desktop using the Model Context Protocol.

bash
pip install epist-mcp-server && epist-mcp install

Python Client

bash
pip install epist

JavaScript Client

bash
npm install epist

Embeddable Widget

Add semantic search to any website with a single script tag.

html
<script src="https://cdn.epist.ai/widget.js"></script>