FlowiseAI/Flowise · error · Error

${error.message}

Error message

${error.message}

What it means

Catch-all around scrapeUrl. Anything thrown inside the try (including the [115] success:false throw, handleError throws, and network errors from postRequest -> secureAxiosRequest) is re-wrapped as new Error(error.message). The error type and stack are lost; only the message string survives. This obliterates the distinction between the API-level error [115] and a transport error.

Source

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

        try {
            const parameters = {
                ...validParams,
                integration: 'flowise'
            }
            const response: AxiosResponse = await this.postRequest(this.apiUrl + '/v1/scrape', parameters, headers)
            if (response.status === 200) {
                const responseData = response.data
                if (responseData.success) {
                    return responseData
                } else {
                    throw new Error(`Failed to scrape URL. Error: ${responseData.error}`)
                }
            } else {
                this.handleError(response, 'scrape URL')
            }
        } catch (error: any) {
            throw new Error(error.message)
        }
        return { success: false, error: 'Internal server error.' }
    }

    async crawlUrl(
        url: string,
        params: Params | null = null,
        waitUntilDone: boolean = true,
        pollInterval: number = 2,
        idempotencyKey?: string
    ): Promise<CrawlResponse | CrawlStatusResponse> {
        const headers = this.prepareHeaders(idempotencyKey)

        // Create a clean payload with only valid parameters
        const validParams: any = {
            url
        }

View on GitHub (pinned to abe4a8601a)

Solutions

  1. Read the message: 'Failed to scrape URL. Error:' indicates an API-level failure (see 115); 'Failed to scrape URL. Status code:' indicates a non-200 handled by handleError; a connection error message indicates transport.
  2. Reproduce with curl -H "Authorization: Bearer $KEY" against https://api.firecrawl.dev/v1/scrape to isolate FireCrawl-side vs client-side.
  3. Fix the library code to rethrow the original error rather than wrapping: } catch (error) { throw error; } - or attach it via { cause: error }.

Example fix

// before
} catch (error: any) {
  throw new Error(error.message)
}
// after - preserve type and chain the cause
} catch (error: any) {
  if (error instanceof Error) throw error
  throw new Error(String(error?.message ?? error))
}
Defensive patterns

Strategy: try-catch

Type guard

function isFirecrawlFailureMessage(msg: string): boolean {
  return /Failed to scrape URL\. Error:/.test(msg)
}
// detect at call site whether the wrapped error came from [115] vs transport

Try / catch

try {
  await app.scrapeUrl(url, params)
} catch (error) {
  const msg = error instanceof Error ? error.message : String(error)
  if (/Failed to scrape URL\. Error:/.test(msg)) {
    // FireCrawl-side failure - do not retry the same params unchanged
  } else if (/ENOTFOUND|ETIMEDOUT|ECONNRESET|Too many redirects/.test(msg)) {
    // transport - safe to retry with backoff
    await new Promise((r) => setTimeout(r, 1000))
    return app.scrapeUrl(url, params)
  }
  throw error
}

Prevention

When it happens

Trigger: Underlying error is an AxiosError (network/TLS/timeout), an SSRF deny-list rejection, a non-200 status handled by handleError, or the success:false throw from [115].

Common situations: User sees a generic message and cannot tell whether the API rejected the request or the network failed; the re-wrap hides axios.isAxiosError so downstream handlers cannot branch on status codes.

Related errors


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