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
- Set the missing env var (EXA_API_KEY / FIRECRAWL_API_KEY / P0_API_KEY) in the environment initProviders reads
- Ensure initProviders(process.env) runs before any getProvider call
- If this fires after teardownAll(), re-run initProviders for the next batch instead of reusing the cleared registry
- 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
- Validate provider env vars against retailer acquisition configs at startup, not lazily mid-scrape
- Call initProviders once after env loading, and never after teardownAll in the same process
- Name env vars in deploy manifests exactly: EXA_API_KEY, FIRECRAWL_API_KEY, P0_API_KEY
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
- EXA_API_KEY is required for exa-search adapter
- Generic adapter requires acquisition config (retailer: ${ctx
- Desktop authentication failed
- Dashboard is no longer available.
AI-assisted analysis of koala73/worldmonitor@eeab0a219f (2026-08-21).
Data as JSON: /api/errors/cba7b74c31eb5298.
Report an issue: GitHub.