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
- 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.
- Reproduce with curl -H "Authorization: Bearer $KEY" against https://api.firecrawl.dev/v1/scrape to isolate FireCrawl-side vs client-side.
- 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
- Log the full error (including any axios response) at the call site because the library flattens it.
- Distinguish API-level vs transport errors via the message pattern before retrying.
- Patch the library to rethrow the original error or attach it via { cause }.
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
- Failed to scrape URL. Error: ${responseData.error}
- Crawl failed: ${error.message}
- Failed to fetch ${url} from Airtable: ${error}
- No relative links found
- ${e}
AI-assisted analysis of FlowiseAI/Flowise@abe4a8601a (2026-08-12).
Data as JSON: /api/errors/fe84def87cc262dc.
Report an issue: GitHub.