JavaScript SDK¶
Coming Soon
The official JavaScript SDK is under development. In the meantime, you can use the REST API directly with fetch or any HTTP client.
Using the API with fetch¶
Here's a complete example using the built-in fetch API (Node.js 18+):
Full Example¶
import fs from 'fs';
import path from 'path';
const API_KEY = 'your-api-key';
const BASE_URL = 'https://api.icana.ai';
const HEADERS = { 'X-API-Key': API_KEY };
async function uploadFile(filePath) {
const formData = new FormData();
const fileBuffer = fs.readFileSync(filePath);
const blob = new Blob([fileBuffer]);
formData.append('file', blob, path.basename(filePath));
const response = await fetch(`${BASE_URL}/upload`, {
method: 'POST',
headers: HEADERS,
body: formData,
});
if (!response.ok) throw new Error(`Upload failed: ${response.status}`);
return response.json();
}
async function submitTranscription(s3Uri, language = 'en', prompt = null) {
const payload = { s3_uri: s3Uri, language };
if (prompt) payload.prompt = prompt;
const response = await fetch(`${BASE_URL}/transcribe`, {
method: 'POST',
headers: { ...HEADERS, 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
if (!response.ok) throw new Error(`Transcribe failed: ${response.status}`);
return response.json();
}
async function pollStatus(jobId, intervalMs = 10000) {
while (true) {
const response = await fetch(`${BASE_URL}/status/${jobId}`, {
headers: HEADERS,
});
if (!response.ok) throw new Error(`Status check failed: ${response.status}`);
const result = await response.json();
console.log(`Job ${jobId}: ${result.status}`);
if (['COMPLETE', 'FAILED', 'DELETED', 'ERROR'].includes(result.status)) {
return result;
}
await new Promise((resolve) => setTimeout(resolve, intervalMs));
}
}
async function deleteFiles(jobId, s3Uri) {
const response = await fetch(`${BASE_URL}/delete/${jobId}`, {
method: 'DELETE',
headers: { ...HEADERS, 'Content-Type': 'application/json' },
body: JSON.stringify({ s3_uri: s3Uri }),
});
if (!response.ok) throw new Error(`Delete failed: ${response.status}`);
return response.json();
}
// --- Usage ---
// 1. Upload
const upload = await uploadFile('meeting.mp3');
console.log(`Uploaded: ${upload.s3_uri}`);
// 2. Transcribe
const job = await submitTranscription(upload.s3_uri, 'en');
console.log(`Job submitted: ${job.aws_batch_job_id}`);
// 3. Wait for result
const result = await pollStatus(job.aws_batch_job_id);
if (result.status === 'COMPLETE') {
console.log(`\nTranscription:\n${result.transcription}`);
console.log(`\nDiarisation:\n${result.diarization}`);
} else {
console.log(`Job failed with status: ${result.status}`);
}
// 4. Clean up
await deleteFiles(job.aws_batch_job_id, upload.s3_uri);
Queue Status¶
async function getQueueStatus() {
const response = await fetch(`${BASE_URL}/queue/status`, {
headers: HEADERS,
});
if (!response.ok) throw new Error(`Queue status failed: ${response.status}`);
return response.json();
}
const status = await getQueueStatus();
console.log(`Total jobs in queue: ${status.total_jobs}`);
console.log('Breakdown:', status.status_counts);