FlowiseAI/Flowise · error · Error
Crawl failed: ${error.response.data.error}
Error message
Crawl failed: ${error.response.data.error} What it means
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.
Source
Thrown at packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts:311
}
const response: AxiosResponse = await this.postRequest(this.apiUrl + '/v1/crawl', parameters, headers)
if (response.status === 200) {
const crawlResponse = response.data as CrawlResponse
if (!crawlResponse.success) {
throw new Error(`Crawl request failed: ${crawlResponse.error || 'Unknown error'}`)
}
if (waitUntilDone) {
return this.monitorJobStatus(crawlResponse.id, headers, pollInterval)
} else {
return crawlResponse
}
} else {
this.handleError(response, 'start crawl job')
}
} catch (error: any) {
if (error.response?.data?.error) {
throw new Error(`Crawl failed: ${error.response.data.error}`)
}
throw new Error(`Crawl failed: ${error.message}`)
}
return { success: false, id: '', url: '' }
}
async extract(
request: ExtractRequest,
waitUntilDone: boolean = true,
pollInterval: number = 2
): Promise<ExtractResponse | ExtractStatusResponse> {
const headers = this.prepareHeaders()
// Create a clean payload with only valid parameters
const validParams: any = {
urls: request.urls
}View on GitHub (pinned to abe4a8601a)
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.
Defensive patterns
Strategy: try-catch
Validate before calling
async function assertFirecrawlReachable(apiUrl = 'https://api.firecrawl.dev'): Promise<void> {
try {
const res = await fetch(apiUrl, { method: 'HEAD' })
if (res.status >= 500) throw new Error(`FireCrawl unhealthy (status ${res.status})`)
} catch (e) {
throw new Error(`FireCrawl unreachable at ${apiUrl}: ${(e as Error).message}`)
}
}
// await assertFirecrawlReachable(apiUrl) before app.crawlUrl(...) Try / catch
try {
await app.crawlUrl(url, params)
} catch (error) {
const msg = error instanceof Error ? error.message : String(error)
if (/Crawl failed:/.test(msg)) {
if (/payment|credit|quota|402/i.test(msg)) throw new Error('FireCrawl out of credits - upgrade plan')
if (/auth|unauthorized|401|403/i.test(msg)) throw new Error('FireCrawl API key invalid - rotate it')
if (/conflict|409/i.test(msg)) {
// idempotency collision - retry with a fresh key
return app.crawlUrl(url, params, true, 2, crypto.randomUUID())
}
}
throw error
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: Free plan exhausted; revoked API key; FireCrawl-side incident; idempotencyKey collision causing 409.
Related errors
- Failed to fetch ${url} from Airtable: ${error.message}, stat
- Crawl request failed: ${crawlResponse.error || 'Unknown erro
- Crawl failed: ${error.message}
- No API key provided
- Failed to scrape URL. Error: ${responseData.error}
AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12).
Data as JSON: /api/errors/5cc3bc3c21b3766c.
Report an issue: GitHub.