Docs/Ingest API

Ingest API

Push calls programmatically from your recording system, CRM, or telephony platform into KoeIQ — fully automated, no manual uploads.

Overview

The Ingest API is a REST endpoint authenticated with an X-API-Key header — no JWT required, making it ideal for server-side automation.

  • Endpoint: POST /api/ingest/upload
  • Auth: X-API-Key: <your_key>
  • Content-Type: multipart/form-data
  • Supported formats: WAV, MP3, M4A, OGG (max 500 MB)

Getting Your API Key

  1. Log in to KoeIQ and go to Settings → API Key.
  2. Click Generate Key.
  3. Copy and store the key securely — it is only shown once.
⚠️Your API key is a secret. Never include it in client-side code or public repositories.

Request Parameters

ParameterRequiredDescription
fileAudio file (WAV / MP3 / M4A / OGG)
call_idOptionalUnique call identifier. Returns 409 if a duplicate exists.
languageOptionalTranscription language code (e.g., ja-JP, en-US). Falls back to org default if omitted.
operator_idOptionalAgent ID from your CRM/HR system. Required for scorecard linking.
customer_idOptionalCustomer identifier used in reporting filters.
departmentOptionalDepartment name or code.
call_dateOptionalCall timestamp in ISO 8601 format: 2026-03-16T09:30:00Z

Code Sample — cURL

curl -X POST https://app.koeiq.com/api/ingest/upload \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@/path/to/call.wav" \
  -F "call_id=CRM-20260316-001" \
  -F "language=ja-JP" \
  -F "operator_id=agent-42"

Code Sample — Python

import requests

with open("call.wav", "rb") as f:
    resp = requests.post(
        "https://app.koeiq.com/api/ingest/upload",
        headers={"X-API-Key": "YOUR_API_KEY"},
        files={"file": ("call.wav", f, "audio/wav")},
        data={
            "call_id": "CRM-20260316-001",
            "language": "ja-JP",
            "operator_id": "agent-42",
        },
    )
print(resp.json())  # {"voicelog_id": "...", "status": "queued"}

Code Sample — Node.js

const form = new FormData();
form.append("file", fs.createReadStream("call.wav"), "call.wav");
form.append("call_id", "CRM-20260316-001");
form.append("language", "ja-JP");
form.append("operator_id", "agent-42");

const res = await fetch("https://app.koeiq.com/api/ingest/upload", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY", ...form.getHeaders() },
  body: form,
});
console.log(await res.json());

Response Codes

HTTP statusMeaning
200 OKFile uploaded to S3 and added to the processing queue.
409 ConflictA call with this call_id already exists.
413 Payload Too LargeFile exceeds the 500 MB limit.
401 UnauthorizedAPI key is missing or invalid.
429 Too Many RequestsRate limit reached (60 requests per minute).

Pre-signed URLs (Large Files)

For files approaching 500 MB or when you want the client to upload directly to S3, use the pre-sign endpoint to avoid routing traffic through the API server.

# Step 1: Get a pre-signed upload URL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://app.koeiq.com/api/ingest/presign?call_id=CRM-001&language=ja-JP"

# Step 2: PUT the file directly to the returned URL
curl -X PUT "<presigned_url>" \
  -H "Content-Type: audio/wav" \
  --data-binary @call.wav
💡Auto-analytics: Enable "Auto-Generate Analytics" in Admin Settings to run all four analytics (summary, emotion, intent, quality) automatically after every transcription — no API calls needed.

Next steps

All DocsContact Support →