n8n-io/n8n · warning · NodeOperationError
Video task ${taskId} did not complete within the maximum pol
Error message
Video task ${taskId} did not complete within the maximum polling time. You can query the task manually using the task ID. What it means
Thrown by pollVideoTask when the loop exceeds MAX_POLL_ATTEMPTS (60) without hitting a terminal status. With DEFAULT_POLL_INTERVAL_MS of 15000, this caps total polling at roughly 15 minutes. The error is recoverable: the task is not necessarily failed, just not yet terminal, and the user is told they can query it manually via the task ID.
Source
Thrown at packages/@n8n/nodes-langchain/nodes/vendors/MiniMax/transport/index.ts:82
const errorMessage = response?.base_resp?.status_msg || 'Video generation task failed';
throw new NodeOperationError(this.getNode(), `Task failed: [${errorCode}] ${errorMessage}`);
}
const fileId = response?.file_id as string;
if (!fileId) {
throw new NodeOperationError(
this.getNode(),
'Video generation succeeded but no file_id was returned',
);
}
return { fileId, status };
}
await sleep(pollIntervalMs);
}
throw new NodeOperationError(
this.getNode(),
`Video task ${taskId} did not complete within the maximum polling time. You can query the task manually using the task ID.`,
);
}
export async function getVideoDownloadUrl(
this: IExecuteFunctions,
fileId: string,
): Promise<string> {
const response = await apiRequest.call(this, 'GET', '/files/retrieve', {
qs: { file_id: fileId },
});
const downloadUrl = response?.file?.download_url as string;
if (!downloadUrl) {
throw new NodeOperationError(
this.getNode(),
`Failed to retrieve download URL for file ${fileId}`,View on GitHub (pinned to 5ac6606e81)
Solutions
- Capture the taskId from the error context and re-query GET /query/video_generation?task_id=<id> manually until terminal.
- If pollVideoTask accepts a larger pollIntervalMs in your call path, raise it (note: total budget = attempts × interval).
- Wait a few minutes and resubmit a polling check for the same task rather than creating a new one.
- For routinely slow jobs, consider lowering resolution/duration so renders finish within the window.
Defensive patterns
Strategy: retry
Validate before calling
// The timeout is governed by MAX_POLL_ATTEMPTS (60) and pollIntervalMs (default 15000),
// i.e. ~15 min budget. If your call path lets you pass pollIntervalMs, size it so
// attempts * interval covers your worst-case render time.
function sizePollInterval(maxAttempts: number, expectedRenderMs: number): number {
return Math.ceil(expectedRenderMs / maxAttempts);
} Type guard
function isPollingTimeoutError(e: unknown): boolean {
return e instanceof NodeOperationError && /did not complete within the maximum polling time/.test(e.message);
} Try / catch
let result: { fileId: string; status: string };
try {
result = await pollVideoTask.call(this, taskId);
} catch (error) {
if (error instanceof NodeOperationError && /did not complete within the maximum polling time/.test(error.message)) {
// Task is still running — keep the task_id and let the user re-query later.
return [{ json: { taskId, status: 'still-running', message: 'Polling timed out; query the task manually.' } }];
}
throw error;
} Prevention
- Treat the polling timeout as recoverable: persist the task_id and re-query later instead of failing the workflow.
- If your integration lets you pass pollIntervalMs, size attempts × interval to cover realistic render times for high-resolution video.
- Lower resolution/duration for routinely slow jobs so renders finish inside the window.
- Surface the task_id in the error output so the user can resume manually.
When it happens
Trigger: Video rendering genuinely takes longer than 15 minutes (long/high-resolution videos); MiniMax backend under heavy load queuing the job; a custom pollIntervalMs was passed that, combined with MAX_POLL_ATTEMPTS=60, shortens the window; the job is stuck in a non-terminal status indefinitely.
Common situations: High-resolution or long-duration videos on a loaded backend; a caller passing a small pollIntervalMs which reduces total wall-clock budget; account in a slow queue tier; transient MiniMax slowness.
Related errors
- Task ${taskId} did not complete within the maximum polling t
- Task failed: [${errorCode}] ${errorMessage}
- Video generation succeeded but no file_id was returned
- 500
- Task failed: [${errorCode}] ${errorMessage}
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/745445fa9e94d5db.
Report an issue: GitHub.