Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Execute AssemblyAI production deployment checklist and rollback procedures. Use when deploying AssemblyAI integrations to production, preparing for launch, or implementing go-live procedures for transcription services. Trigger with phrases like "assemblyai production", "deploy assemblyai", "assemblyai go-live", "assemblyai launch checklist".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -13% | 0% |
Complete checklist for deploying AssemblyAI-powered transcription services to production with health checks, monitoring, and rollback procedures.
transcript.status === 'error' cases handledtranscript.status === 'error' logged with transcript ID and error messagewebhook_url instead of pollingtypescriptimport { AssemblyAI } from 'assemblyai'; const client = new AssemblyAI({ apiKey: process.env.ASSEMBLYAI_API_KEY!, }); export async function healthCheck(): Promise<{ status: 'healthy' | 'degraded' | 'down'; assemblyai: { connected: boolean; latencyMs: number }; }> { const start = Date.now(); try { // List transcripts as a lightweight connectivity check await client.transcripts.list({ limit: 1 }); return { status: 'healthy', assemblyai: { connected: true, latencyMs: Date.now() - start }, }; } catch (error) { return { status: 'degraded', assemblyai: { connected: false, latencyMs: Date.now() - start }, }; } }
typescript// Instead of polling, use webhooks for transcription completion const transcript = await client.transcripts.submit({ audio: audioUrl, webhook_url: 'https://your-app.com/webhooks/assemblyai', webhook_auth_header_name: 'X-Webhook-Secret', webhook_auth_header_value: process.env.ASSEMBLYAI_WEBHOOK_SECRET!, speaker_labels: true, sentiment_analysis: true, }); console.log('Submitted:', transcript.id, '(webhook will fire on completion)');
typescript// Webhook handler import express from 'express'; app.post('/webhooks/assemblyai', express.json(), async (req, res) => { // Verify auth header const secret = req.headers['x-webhook-secret']; if (secret !== process.env.ASSEMBLYAI_WEBHOOK_SECRET) { return res.status(401).json({ error: 'Unauthorized' }); } const { transcript_id, status } = req.body; if (status === 'completed') { // Fetch full transcript const transcript = await client.transcripts.get(transcript_id); await processCompletedTranscript(transcript); } else if (status === 'error') { console.error(`Transcript ${transcript_id} failed:`, req.body.error); await handleFailedTranscript(transcript_id, req.body.error); } res.status(200).json({ received: true }); });
| Alert | Condition | Severity | |-------|-----------|----------| | API unreachable | Health check fails 3x consecutive | P1 | | High error rate | >5% of transcriptions fail | P2 | | Rate limited | 429 errors > 5/min | P2 | | Auth failure | Any 401 response | P1 | | Slow transcription | Queue wait > 5 min | P3 | | Webhook delivery failure | Webhook retries exhausted | P2 |
bash# 1. Pre-flight: verify AssemblyAI API is healthy curl -s https://status.assemblyai.com/api/v2/status.json | jq '.status.description' # 2. Deploy to canary (10% traffic) # 3. Monitor error rate and latency for 10 minutes # 4. If healthy, roll to 50%, then 100% # 5. Keep previous version ready for instant rollback
| Issue | Detection | Response | |-------|-----------|----------| | API key invalid in prod | 401 on first call | Rotate key immediately | | Transcription backlog | Queue size growing | Scale workers, check rate limits | | Webhook endpoint down | Missed completion events | Poll for stuck transcripts | | Audio upload timeout | Large file failures | Increase timeout, validate file size |
For version upgrades, see assemblyai-upgrade-migration.
Other measured skills in the registry, with their headline benchmark lift.