{"record":{"id":"5cc3bc3c21b3766c","repo":"FlowiseAI/Flowise","slug":"crawl-failed-error-response-data-error","errorCode":null,"errorMessage":"Crawl failed: ${error.response.data.error}","messagePattern":"Crawl failed: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts","lineNumber":311,"sourceCode":"            }\n            const response: AxiosResponse = await this.postRequest(this.apiUrl + '/v1/crawl', parameters, headers)\n            if (response.status === 200) {\n                const crawlResponse = response.data as CrawlResponse\n                if (!crawlResponse.success) {\n                    throw new Error(`Crawl request failed: ${crawlResponse.error || 'Unknown error'}`)\n                }\n\n                if (waitUntilDone) {\n                    return this.monitorJobStatus(crawlResponse.id, headers, pollInterval)\n                } else {\n                    return crawlResponse\n                }\n            } else {\n                this.handleError(response, 'start crawl job')\n            }\n        } catch (error: any) {\n            if (error.response?.data?.error) {\n                throw new Error(`Crawl failed: ${error.response.data.error}`)\n            }\n            throw new Error(`Crawl failed: ${error.message}`)\n        }\n\n        return { success: false, id: '', url: '' }\n    }\n\n    async extract(\n        request: ExtractRequest,\n        waitUntilDone: boolean = true,\n        pollInterval: number = 2\n    ): Promise<ExtractResponse | ExtractStatusResponse> {\n        const headers = this.prepareHeaders()\n\n        // Create a clean payload with only valid parameters\n        const validParams: any = {\n            urls: request.urls\n        }","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts#L293-L329","documentation":"Axios-shaped error during crawlUrl carried an error.response.data.error field, which is surfaced directly. This typically maps to a 402 (payment required), 408, 409, 500 (from handleError), or any response where FireCrawl returned a JSON body with an error string. The status code itself is not included in the message.","triggerScenarios":"Out-of-credits response (402); concurrent crawl conflict (409); FireCrawl server error (500); 401/403 with a JSON error body from an invalid API key.","commonSituations":"Free plan exhausted; revoked API key; FireCrawl-side incident; idempotencyKey collision causing 409.","solutions":["Map the error string: 'payment' / 'credits' -> upgrade or wait for reset; 'authentication' / 'unauthorized' -> rotate API key; 'conflict' -> retry with a fresh idempotencyKey.","Check https://status.firecrawl.dev for active incidents on 500-class errors.","Log error.response.status alongside this message at the call site for diagnosis."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"async function assertFirecrawlReachable(apiUrl = 'https://api.firecrawl.dev'): Promise<void> {\n  try {\n    const res = await fetch(apiUrl, { method: 'HEAD' })\n    if (res.status >= 500) throw new Error(`FireCrawl unhealthy (status ${res.status})`)\n  } catch (e) {\n    throw new Error(`FireCrawl unreachable at ${apiUrl}: ${(e as Error).message}`)\n  }\n}\n// await assertFirecrawlReachable(apiUrl) before app.crawlUrl(...)","typeGuard":null,"tryCatchPattern":"try {\n  await app.crawlUrl(url, params)\n} catch (error) {\n  const msg = error instanceof Error ? error.message : String(error)\n  if (/Crawl failed:/.test(msg)) {\n    if (/payment|credit|quota|402/i.test(msg)) throw new Error('FireCrawl out of credits - upgrade plan')\n    if (/auth|unauthorized|401|403/i.test(msg)) throw new Error('FireCrawl API key invalid - rotate it')\n    if (/conflict|409/i.test(msg)) {\n      // idempotency collision - retry with a fresh key\n      return app.crawlUrl(url, params, true, 2, crypto.randomUUID())\n    }\n  }\n  throw error\n}","preventionTips":["Keep API key valid and monitor credit usage on the FireCrawl dashboard.","Use unique idempotencyKey per logical crawl to avoid 409 conflicts.","On 500-class errors, check FireCrawl status page before retrying."],"tags":["firecrawl","network","crawl","api-errors","authentication"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}