{"record":{"id":"647fa44240050e9f","repo":"FlowiseAI/Flowise","slug":"failed-to-fetch-url-from-airtable-error-mess","errorCode":null,"errorMessage":"Failed to fetch ${url} from Airtable: ${error.message}, status: ${error.response?.status}","messagePattern":"Failed to fetch (.+?) from Airtable: (.+?), status: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/documentloaders/Airtable/Airtable.ts","lineNumber":322,"sourceCode":"    public async load(): Promise<IDocument[]> {\n        if (this.returnAll) {\n            return this.loadAll()\n        }\n        return this.loadLimit()\n    }\n\n    protected async fetchAirtableData(url: string, data: AirtableLoaderRequest): Promise<AirtableLoaderResponse> {\n        try {\n            const headers = {\n                Authorization: `Bearer ${this.accessToken}`,\n                'Content-Type': 'application/json',\n                Accept: 'application/json'\n            }\n            const response = await axios.post(url, data, { headers })\n            return response.data\n        } catch (error) {\n            if (axios.isAxiosError(error)) {\n                throw new Error(`Failed to fetch ${url} from Airtable: ${error.message}, status: ${error.response?.status}`)\n            } else {\n                throw new Error(`Failed to fetch ${url} from Airtable: ${error}`)\n            }\n        }\n    }\n\n    private createDocumentFromPage(page: AirtableLoaderPage): IDocument {\n        // Generate the URL\n        const pageUrl = `https://api.airtable.com/v0/${this.baseId}/${this.tableId}/${page.id}`\n\n        // Return a langchain document\n        return new Document({\n            pageContent: JSON.stringify(page.fields, null, 2),\n            metadata: {\n                url: pageUrl\n            }\n        })\n    }","sourceCodeStart":304,"sourceCodeEnd":340,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/documentloaders/Airtable/Airtable.ts#L304-L340","documentation":"AxiosError branch of fetchAirtableData: the POST to api.airtable.com rejected with a recognizable axios error. Preserves both error.message and the HTTP status from error.response. Airtable uses standard statuses: 401 (bad token), 403 (no permission to the base/table), 404 (wrong baseId/tableId), 422 (bad filterByFormula), 429 (rate limited).","triggerScenarios":"Expired or revoked personal access token (401); token lacks scopes for the table (403); baseId/tableId typo (404); malformed filterByFormula (422); burst requests past Airtable's 5 req/sec per base limit (429).","commonSituations":"Airtable token regenerated but the Flowise credential not updated; user copied the table name instead of the tableId; complex filterByFormula referencing a non-existent field.","solutions":["Read the embedded status: 401/403 -> regenerate/fix the accessToken credential; 404 -> re-verify baseId and tableId; 422 -> simplify filterByFormula and test it in the Airtable web formula bar; 429 -> lower 'limit' or add delay between runs.","Confirm the access token has data.records:read scope on the target base.","Run the same request with curl using the Bearer token to isolate Flowise vs Airtable behavior."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"function assertAccessToken(token: unknown): asserts token is string {\n  if (typeof token !== 'string' || token.trim() === '') {\n    throw new Error('Airtable accessToken is missing - check credential mapping')\n  }\n}\n// assertAccessToken(accessToken) before calling loader.load()","typeGuard":null,"tryCatchPattern":"try {\n  const docs = await loader.load()\n} catch (error) {\n  const msg = error instanceof Error ? error.message : String(error)\n  const statusMatch = msg.match(/status: (\\d+)/)\n  const status = statusMatch ? Number(statusMatch[1]) : null\n  if (status === 429) {\n    // rate limited - back off and retry once\n    await new Promise(r => setTimeout(r, 1000))\n    return loader.load()\n  }\n  if (status === 401 || status === 403) throw new Error('Airtable credential invalid or lacks scope')\n  if (status === 404) throw new Error('Airtable baseId/tableId not found')\n  throw error\n}","preventionTips":["Keep token scopes to data.records:read only and verify the target base is shared with the token.","Stay under 5 requests/sec per base; lower 'limit' and add delays in batch flows.","Test filterByFormula in the Airtable web UI before pasting it into the node."],"tags":["network","airtable","api-errors","authentication","rate-limit"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}