refinedev/refine · error · Error

Not implemented on refine-airtable data provider.

Error message

Not implemented on refine-airtable data provider.

What it means

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

Source

Thrown at packages/airtable/src/dataProvider.ts:151

          id,
          ...fields,
        } as any,
      };
    },

    deleteMany: async ({ resource, ids }) => {
      const data = await base(resource).destroy(ids.map(String));

      return {
        data: data.map((p) => ({
          id: p.id,
          ...p.fields,
        })) as any,
      };
    },

    getApiUrl: () => {
      throw Error("Not implemented on refine-airtable data provider.");
    },

    custom: async () => {
      throw Error("Not implemented on refine-airtable data provider.");
    },
  };
};

View on GitHub (pinned to 779d52a20e)

Solutions

  1. Remove or guard the getApiUrl call — build Airtable-specific URLs (https://api.airtable.com/v0/{baseId}/{table}) where needed
  2. If you need a REST-style API alongside Airtable, register a second data provider and route resources accordingly
  3. Wrap the call in a feature check: `typeof dp.getApiUrl === 'function'` before invoking

Example fix

// before
const apiUrl = dataProvider.getApiUrl();
// after
const apiUrl =
  typeof dataProvider.getApiUrl === 'function'
    ? dataProvider.getApiUrl()
    : `https://api.airtable.com/v0/${BASE_ID}`;
Defensive patterns

Strategy: type-guard

Validate before calling

if (typeof dataProvider.getApiUrl !== 'function') {
  // build the Airtable URL yourself
  apiUrl = `https://api.airtable.com/v0/${baseId}`;
}

Type guard

const supportsGetApiUrl = (dp: unknown): dp is { getApiUrl: () => string } =>
  typeof (dp as any)?.getApiUrl === 'function';

Try / catch

try {
  url = dataProvider.getApiUrl();
} catch {
  url = `https://api.airtable.com/v0/${baseId}`;
}

Prevention

When it happens

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

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

Related errors


AI-assisted analysis of refinedev/refine@779d52a20e (2026-08-27). Data as JSON: /api/errors/f1aa7bba4d6238b7. Report an issue: GitHub.