{"record":{"id":"b4648947b46e60a6","repo":"FlowiseAI/Flowise","slug":"unknown-crawl-status-statusdata-status","errorCode":null,"errorMessage":"Unknown crawl status: ${statusData.status}","messagePattern":"Unknown crawl status: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts","lineNumber":496,"sourceCode":"    private async monitorJobStatus(jobId: string, headers: AxiosRequestHeaders, checkInterval: number): Promise<CrawlStatusResponse> {\n        let isJobCompleted = false\n        while (!isJobCompleted) {\n            const statusResponse: AxiosResponse = await this.getRequest(this.apiUrl + `/v1/crawl/${jobId}`, headers)\n            if (statusResponse.status === 200) {\n                const statusData = statusResponse.data as CrawlStatusResponse\n                switch (statusData.status) {\n                    case 'completed':\n                        isJobCompleted = true\n                        return statusData\n                    case 'scraping':\n                    case 'failed':\n                        if (statusData.status === 'failed') {\n                            throw new Error('Crawl job failed')\n                        }\n                        await new Promise((resolve) => setTimeout(resolve, Math.max(checkInterval, 2) * 1000))\n                        break\n                    default:\n                        throw new Error(`Unknown crawl status: ${statusData.status}`)\n                }\n            } else {\n                this.handleError(statusResponse, 'check crawl status')\n            }\n        }\n        throw new Error('Failed to monitor job status')\n    }\n\n    private async monitorExtractStatus(jobId: string, headers: AxiosRequestHeaders, checkInterval: number): Promise<ExtractStatusResponse> {\n        let isJobCompleted = false\n        while (!isJobCompleted) {\n            const statusResponse: AxiosResponse = await this.getRequest(this.apiUrl + `/v1/extract/${jobId}`, headers)\n            if (statusResponse.status === 200) {\n                const statusData = statusResponse.data as ExtractStatusResponse\n                switch (statusData.status) {\n                    case 'completed':\n                        isJobCompleted = true\n                        return statusData","sourceCodeStart":478,"sourceCodeEnd":514,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/documentloaders/FireCrawl/FireCrawl.ts#L478-L514","documentation":"Thrown by monitorJobStatus when the crawl-status response carries a `status` value not in {'completed','scraping','failed'}. The library's switch has no case for it, so it treats anything new (e.g. 'queued','cancelled','paused') as a hard failure.","triggerScenarios":"FireCrawl API introduces a new status string for crawl jobs (e.g. 'cancelled' after a TTL, 'queued' before scraping starts, or 'paused'). The local CrawlStatusResponse interface only documents `status: string`.","commonSituations":"FireCrawl API version bump adds statuses; self-hosted FireCrawl fork returns custom states; long-running crawl that gets queued or cancelled; cancelled jobs from dashboard.","solutions":["Upgrade the FireCrawl node package or patch the switch to handle the new status.","If the status is 'cancelled'/'queued', treat as transient and re-poll or restart the job.","Report the unknown status value to the FireCrawl maintainers with the API version.","Pin the FireCrawl API version until the library catches up."],"exampleFix":"// before\nswitch (statusData.status) {\n  case 'completed': ...\n  case 'scraping': case 'failed': ...\n  default: throw new Error(`Unknown crawl status: ${statusData.status}`)\n}\n\n// after\nswitch (statusData.status) {\n  case 'completed': ...\n  case 'scraping': case 'queued': /* poll again */ break\n  case 'failed': case 'cancelled': throw new Error(statusData.status)\n  default: throw new Error(`Unknown crawl status: ${statusData.status}`)\n}","handlingStrategy":"type-guard","validationCode":"const known = new Set(['completed','scraping','failed'])\nif (!known.has(statusData.status)) console.warn('unhandled crawl status:', statusData.status)","typeGuard":"type CrawlStatus = 'completed' | 'scraping' | 'failed' | 'cancelled' | 'queued'\nfunction isKnownCrawlStatus(s: string): s is CrawlStatus {\n  return ['completed','scraping','failed','cancelled','queued'].includes(s)\n}","tryCatchPattern":"try { return await app.crawlUrl(url, params) }\ncatch (e) {\n  if (/Unknown crawl status:/.test((e as Error).message)) { await sleep(2000); return app.crawlUrl(url, params) }\n  throw e\n}","preventionTips":["Pin the FireCrawl API version until the loader supports new statuses.","Patch the switch to treat 'queued'/'cancelled' as non-fatal.","Report new statuses upstream with the API version."],"tags":["firecrawl","crawl","status-enum","versioning"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}