FlowiseAI/Flowise · error · Error

Crawl failed: ${error.message}

Error message

Crawl failed: ${error.message}

What it means

Fallback branch in crawlUrl's catch: the error had no error.response.data.error, so only error.message survives. Covers pure transport errors (ECONNRESET, ETIMEDOUT, ENOTFOUND), the 'Crawl request failed' throw from [117], the 'Too many redirects' or SSRF deny-list throws from secureAxiosRequest, and the non-200 handleError throws when response.data had no error field.

Source

Thrown at packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts:313

            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
        }

        // Add optional parameters if they exist and are not empty

View on GitHub (pinned to abe4a8601a)

Solutions

  1. Read the message: 'Too many redirects' or a URL-validation message points at the SSRF guard; ETIMEDOUT/ECONNRESET points at transport; 'Crawl request failed' points at [117].
  2. Confirm outbound HTTPS to api.firecrawl.dev works from the host (curl -v).
  3. If using a self-hosted apiUrl on internal infrastructure, ensure the URL is allowed by resolveAndValidate or is publicly resolvable.
  4. For transient transport errors, retry with backoff.

Example fix

// before
} catch (error: any) {
  if (error.response?.data?.error) {
    throw new Error(`Crawl failed: ${error.response.data.error}`)
  }
  throw new Error(`Crawl failed: ${error.message}`)
}
// after - preserve cause for diagnosis
} catch (error: any) {
  const detail = error.response?.data?.error ?? error.message
  throw new Error(`Crawl failed: ${detail}`, { cause: error })
}
Defensive patterns

Strategy: retry

Validate before calling

import { resolve as dnsResolve } from 'dns/promises'

async function assertFirecrawlDns(hostname = 'api.firecrawl.dev'): Promise<void> {
  try { await dnsResolve(hostname) }
  catch { throw new Error(`DNS lookup failed for ${hostname} - cannot reach FireCrawl`) }
}
// await assertFirecrawlDns(new URL(apiUrl).hostname) before crawlUrl

Try / catch

async function crawlWithRetry(app: FirecrawlApp, url: string, params: any, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    try {
      return await app.crawlUrl(url, params)
    } catch (error) {
      const msg = error instanceof Error ? error.message : String(error)
      if (/ETIMEDOUT|ECONNRESET|ENOTFOUND|EAI_AGAIN/.test(msg) && i < attempts - 1) {
        await new Promise((r) => setTimeout(r, 2 ** i * 500))
        continue
      }
      throw error
    }
  }
  throw new Error('unreachable')
}

Prevention

When it happens

Trigger: Network cannot reach api.firecrawl.dev; TLS handshake failed; too many redirects; URL/IP blocked by the SSRF guard in secureAxiosRequest; handleError threw 'Unexpected error ... Status code: <n>' for a status not in [402,408,409,500].

Common situations: DNS outage; corporate firewall blocking outbound HTTPS; self-hosted FireCrawl apiUrl pointing at an internal IP that the SSRF guard blocks; intermittent 502/503 from a load balancer (not in handleError's list).

Related errors


AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12). Data as JSON: /api/errors/846c5f12ce22c1aa. Report an issue: GitHub.