koala73/worldmonitor · error

Acquisition provider '${name}' is not configured. Set the re

Error message

Acquisition provider '${name}' is not configured. Set the required API key env var.

What it means

registry.getProvider() throws when the requested name is absent from the provider map. initProviders() registers 'playwright' unconditionally, but 'exa', 'firecrawl' and 'p0' only when EXA_API_KEY, FIRECRAWL_API_KEY or P0_API_KEY were present at init time. So this error means one of: initProviders never ran, it ran without the key, or teardownAll() cleared the map mid-process.

Source

Thrown at consumer-prices-core/src/acquisition/registry.ts:25

const _providers = new Map<AcquisitionProviderName, AcquisitionProvider>();

export function initProviders(env: Record<string, string | undefined>) {
  _providers.set('playwright', new PlaywrightProvider());

  if (env.EXA_API_KEY) {
    _providers.set('exa', new ExaProvider(env.EXA_API_KEY));
  }
  if (env.FIRECRAWL_API_KEY) {
    _providers.set('firecrawl', new FirecrawlProvider(env.FIRECRAWL_API_KEY));
  }
  if (env.P0_API_KEY) {
    _providers.set('p0', new P0Provider(env.P0_API_KEY, env.P0_BASE_URL));
  }
}

export function getProvider(name: AcquisitionProviderName): AcquisitionProvider {
  const p = _providers.get(name);
  if (!p) throw new Error(`Acquisition provider '${name}' is not configured. Set the required API key env var.`);
  return p;
}

export async function teardownAll(): Promise<void> {
  for (const p of _providers.values()) {
    await p.teardown?.();
  }
  _providers.clear();
}

/**
 * Fetch a URL using the provider chain defined in config.
 * Tries primary provider first; on failure, tries fallback.
 */
export async function fetchWithFallback(
  url: string,
  config: AcquisitionConfig,
  opts?: FetchOptions,

View on GitHub (pinned to eeab0a219f)

Solutions

  1. Set the missing env var (EXA_API_KEY / FIRECRAWL_API_KEY / P0_API_KEY) in the environment initProviders reads
  2. Ensure initProviders(process.env) runs before any getProvider call
  3. If this fires after teardownAll(), re-run initProviders for the next batch instead of reusing the cleared registry
  4. Pass the same env object to initProviders that the config loader validated

Example fix

// before — registry consulted before env was loaded
const p = getProvider('firecrawl');

// after — init once, after env is loaded
initProviders(process.env);
const p = getProvider('firecrawl'); // throws only if FIRECRAWL_API_KEY is truly absent
Defensive patterns

Strategy: validation

Validate before calling

const KEY_FOR: Partial<Record<AcquisitionProviderName, string>> = {
  exa: 'EXA_API_KEY', firecrawl: 'FIRECRAWL_API_KEY', p0: 'P0_API_KEY',
};
// fail fast at boot: every provider named by any retailer config must have its key
for (const cfg of retailerConfigs) {
  for (const name of [cfg.acquisition?.provider, cfg.acquisition?.fallback]) {
    if (name && KEY_FOR[name] && !process.env[KEY_FOR[name]]) {
      throw new Error(`missing ${KEY_FOR[name]} for provider '${name}'`);
    }
  }
}

Type guard

function providerAvailable(name: AcquisitionProviderName): boolean {
  try { getProvider(name); return true; } catch { return false; }
}

Try / catch

try {
  return getProvider(name);
} catch (err) {
  if (err instanceof Error && err.message.includes('is not configured')) {
    return getProvider('playwright'); // always registered — degrade instead of crash
  }
  throw err;
}

Prevention

When it happens

Trigger: getProvider('firecrawl') when FIRECRAWL_API_KEY was unset when initProviders(env) ran; calling getProvider before initProviders; a second scrape phase calling getProvider after teardownAll() cleared the registry; env loaded from a different source than the object passed to initProviders.

Common situations: CI or a fresh deployment missing the secret; .env loaded after initProviders(process.env) already captured an empty env; a long-lived worker that tears down after one run then handles another request; a typo'd env var name in the deploy manifest.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of koala73/worldmonitor@eeab0a219f (2026-08-21). Data as JSON: /api/errors/cba7b74c31eb5298. Report an issue: GitHub.