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
- Log in to KoeIQ and go to Settings → API Key.
- Click Generate Key.
- 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
| Parameter | Required | Description |
|---|---|---|
| file | ✅ | Audio file (WAV / MP3 / M4A / OGG) |
| call_id | Optional | Unique call identifier. Returns 409 if a duplicate exists. |
| language | Optional | Transcription language code (e.g., ja-JP, en-US). Falls back to org default if omitted. |
| operator_id | Optional | Agent ID from your CRM/HR system. Required for scorecard linking. |
| customer_id | Optional | Customer identifier used in reporting filters. |
| department | Optional | Department name or code. |
| call_date | Optional | Call 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 status | Meaning |
|---|---|
| 200 OK | File uploaded to S3 and added to the processing queue. |
| 409 Conflict | A call with this call_id already exists. |
| 413 Payload Too Large | File exceeds the 500 MB limit. |
| 401 Unauthorized | API key is missing or invalid. |
| 429 Too Many Requests | Rate 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.