FlowiseAI/Flowise · error · Error

Failed to fetch ${url} from Airtable: ${error.message}, stat

Error message

Failed to fetch ${url} from Airtable: ${error.message}, status: ${error.response?.status}

What it means

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).

Source

Thrown at packages/components/nodes/documentloaders/Airtable/Airtable.ts:322

    public async load(): Promise<IDocument[]> {
        if (this.returnAll) {
            return this.loadAll()
        }
        return this.loadLimit()
    }

    protected async fetchAirtableData(url: string, data: AirtableLoaderRequest): Promise<AirtableLoaderResponse> {
        try {
            const headers = {
                Authorization: `Bearer ${this.accessToken}`,
                'Content-Type': 'application/json',
                Accept: 'application/json'
            }
            const response = await axios.post(url, data, { headers })
            return response.data
        } catch (error) {
            if (axios.isAxiosError(error)) {
                throw new Error(`Failed to fetch ${url} from Airtable: ${error.message}, status: ${error.response?.status}`)
            } else {
                throw new Error(`Failed to fetch ${url} from Airtable: ${error}`)
            }
        }
    }

    private createDocumentFromPage(page: AirtableLoaderPage): IDocument {
        // Generate the URL
        const pageUrl = `https://api.airtable.com/v0/${this.baseId}/${this.tableId}/${page.id}`

        // Return a langchain document
        return new Document({
            pageContent: JSON.stringify(page.fields, null, 2),
            metadata: {
                url: pageUrl
            }
        })
    }

View on GitHub (pinned to abe4a8601a)

Solutions

  1. 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.
  2. Confirm the access token has data.records:read scope on the target base.
  3. Run the same request with curl using the Bearer token to isolate Flowise vs Airtable behavior.
Defensive patterns

Strategy: retry

Validate before calling

function assertAccessToken(token: unknown): asserts token is string {
  if (typeof token !== 'string' || token.trim() === '') {
    throw new Error('Airtable accessToken is missing - check credential mapping')
  }
}
// assertAccessToken(accessToken) before calling loader.load()

Try / catch

try {
  const docs = await loader.load()
} catch (error) {
  const msg = error instanceof Error ? error.message : String(error)
  const statusMatch = msg.match(/status: (\d+)/)
  const status = statusMatch ? Number(statusMatch[1]) : null
  if (status === 429) {
    // rate limited - back off and retry once
    await new Promise(r => setTimeout(r, 1000))
    return loader.load()
  }
  if (status === 401 || status === 403) throw new Error('Airtable credential invalid or lacks scope')
  if (status === 404) throw new Error('Airtable baseId/tableId not found')
  throw error
}

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Related errors


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