{"record":{"id":"f1aa7bba4d6238b7","repo":"refinedev/refine","slug":"not-implemented-on-refine-airtable-data-provider","errorCode":null,"errorMessage":"Not implemented on refine-airtable data provider.","messagePattern":"Not implemented on refine-airtable data provider\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/airtable/src/dataProvider.ts","lineNumber":151,"sourceCode":"          id,\n          ...fields,\n        } as any,\n      };\n    },\n\n    deleteMany: async ({ resource, ids }) => {\n      const data = await base(resource).destroy(ids.map(String));\n\n      return {\n        data: data.map((p) => ({\n          id: p.id,\n          ...p.fields,\n        })) as any,\n      };\n    },\n\n    getApiUrl: () => {\n      throw Error(\"Not implemented on refine-airtable data provider.\");\n    },\n\n    custom: async () => {\n      throw Error(\"Not implemented on refine-airtable data provider.\");\n    },\n  };\n};\n","sourceCodeStart":133,"sourceCodeEnd":159,"githubUrl":"https://github.com/refinedev/refine/blob/779d52a20e29b0307ac0df04d135beba434370dc/packages/airtable/src/dataProvider.ts#L133-L159","documentation":"`getApiUrl` is an optional method on the refine data provider contract; the Airtable provider does not use a single REST API URL (each table has its own endpoint), so it throws `Error(\"Not implemented on refine-airtable data provider.\")` when called. Any code that assumes a REST base URL (auth providers, custom fetch code, `useCustom`-adjacent helpers) will hit this.","triggerScenarios":"Calling `dataRouterProvider.getApiUrl()` (directly or via a helper like an authProvider's check/login that builds URLs, or third-party code that reads getApiUrl) while the refine app uses `refine-airtable` as its dataProvider.","commonSituations":"Mixing a REST-style authProvider or file upload logic with the Airtable provider; copying examples written for the REST/strapi providers; libraries that call getApiUrl defensively but unconditionally.","solutions":["Remove or guard the getApiUrl call — build Airtable-specific URLs (https://api.airtable.com/v0/{baseId}/{table}) where needed","If you need a REST-style API alongside Airtable, register a second data provider and route resources accordingly","Wrap the call in a feature check: `typeof dp.getApiUrl === 'function'` before invoking"],"exampleFix":"// before\nconst apiUrl = dataProvider.getApiUrl();\n// after\nconst apiUrl =\n  typeof dataProvider.getApiUrl === 'function'\n    ? dataProvider.getApiUrl()\n    : `https://api.airtable.com/v0/${BASE_ID}`;","handlingStrategy":"type-guard","validationCode":"if (typeof dataProvider.getApiUrl !== 'function') {\n  // build the Airtable URL yourself\n  apiUrl = `https://api.airtable.com/v0/${baseId}`;\n}","typeGuard":"const supportsGetApiUrl = (dp: unknown): dp is { getApiUrl: () => string } =>\n  typeof (dp as any)?.getApiUrl === 'function';","tryCatchPattern":"try {\n  url = dataProvider.getApiUrl();\n} catch {\n  url = `https://api.airtable.com/v0/${baseId}`;\n}","preventionTips":["Feature-check optional provider methods before calling them","Don't reuse REST-provider helpers (auth, uploads) with Airtable without adapters"],"tags":["airtable","data-provider","get-api-url","not-implemented","refine"],"backgroundTag":"provider-method-not-implemented","analyzedSha":"779d52a20e29b0307ac0df04d135beba434370dc","analyzedAt":"2026-08-27T11:15:25.854Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}