Providers

Supported providers and the capability matrix.

Every verb runs through a provider. Set a default per verb (run marmot setup, or write directly to ~/.marmot/config.json), or override per call with --provider <slug>.

AI providers

ProviderSlugCapabilitiesEnv var
OpenRouteropenroutertext, image, speech, transcription, videoOPENROUTER_API_KEY
AnthropicanthropictextANTHROPIC_API_KEY
OpenAIopenaitext, image, speech, transcriptionOPENAI_API_KEY
Vercel AI Gatewayverceltext, image, speech, transcription, videoAI_GATEWAY_API_KEY
Cloudflare Workers AIcloudflaretext, image, speech, transcriptionCLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID
Ollamaollamatext (local)OLLAMA_HOST (no key)

Web Search providers

Content-aware retrieval providers — power search, scrape (cleaned markdown), answer, map, crawl, research, and findall.

ProviderSlugEnv varBest for
Brave SearchbraveBRAVE_API_KEYsearch, answer
ExaexaEXA_API_KEYsearch, scrape, research, findall
FirecrawlfirecrawlFIRECRAWL_API_KEYscrape, crawl, map, search
ParallelparallelPARALLEL_API_KEYsearch, scrape, research, findall
TavilytavilyTAVILY_API_KEYsearch, scrape, crawl, answer

Web Fetch / Scraping providers

Proxy / unblock providers — power the fetch verb for raw HTML retrieval, with JS rendering, country targeting, and residential proxies.

ProviderSlugEnv varBest for
ScrapeOpsscrapeopsSCRAPEOPS_API_KEYfetch (proxy aggregator, 30+ backends)
ScraperAPIscraperapiSCRAPERAPI_API_KEYfetch (JS rendering, Chromium)
ScrapingBeescrapingbeeSCRAPINGBEE_API_KEYfetch (residential proxies)
ZytezyteZYTE_API_KEYfetch (POST-based, target-status surfacing)

Enrichment providers

ProviderSlugCapabilitiesEnv var
Apolloapolloenrich, lookup (paid plan only for lookup and enrich --type person)APOLLO_API_KEY
Hunterhunterenrich, lookup --type email, verify --type emailHUNTER_API_KEY
People Data Labspdlenrich, lookupPDL_API_KEY
Tombatombaenrich, lookup --type email, lookup --type org, verify --type emailTOMBA_API_KEY + TOMBA_SECRET_KEY
Bouncerbouncerverify --type emailBOUNCER_API_KEY
Datagmadatagmaenrich --type person (with mobile phone), verify --type emailDATAGMA_API_KEY
ZeroBouncezerobounceverify --type emailZEROBOUNCE_API_KEY
Kickboxkickboxverify --type emailKICKBOX_API_KEY

Capability matrix

Not every provider supports every verb. Marmot validates the verb-provider pair at parse time. If the pair is unsupported, the call errors and lists the providers that do support the verb.

Web search verbs

Cleaned/processed content via search, scrape, answer, map, crawl, research, findall:

VerbBraveExaFirecrawlParallelTavily
search
scrape
answer✓ chained✓ inline
map
crawl✓ async✓ sync
research
findall

Web fetch / scraping verbs

Raw HTML through proxy/unblock services via fetch:

VerbScrapeOpsScraperAPIScrapingBeeZyte
fetch

fetch is distinct from scrape: it returns the bytes the target served, with knobs for JS rendering, country targeting, and residential proxies. Output format is one of html (default), markdown (turndown), text (tags stripped), or next (extract __NEXT_DATA__ JSON from Next.js Pages Router pages). See the fetch verb docs.

Enrichment verbs

Verb and typeApolloHunterPDLTombaBouncerDatagmaZeroBounceKickbox
enrich --type person✓ ¹
enrich --type org
lookup --type person
lookup --type org
lookup --type email
verify --type email✓ ²✓ ³✓ ⁴

¹ Datagma is the only enrichment provider that returns mobile phone numbers on the free tier. ² Bouncer is the only verifier that returns a retryAfter hint for greylisted addresses, plus toxicity (0–5) and resolved MX provider in the raw response. ³ ZeroBounce returns the deepest sub-status taxonomy (30+ values) for diagnosing why an email failed verification. ⁴ Kickbox is owned by Sendgrid/Twilio and returns a unique sendex confidence score (0–1, projected to 0–100 in the envelope's score).

Plan-tier notes

A handful of cells in the matrix above need a paid plan to work. Listed here so the matrix stays scannable.

  • Brave answer chains web/search into the Summarizer API, which requires a Pro Brave Search plan. Free-tier keys never receive a summarizer.key.
  • Exa findall uses the Websets API, which requires a Pro Exa plan. Personal plans return 401.
  • Apollo lookup and enrich --type person require a paid plan with master-key access. Free-tier keys return 403 with error_code: API_INACCESSIBLE.

Discovery: which providers are wired?

marmot providers list returns one row per supported provider — all 23, across AI, search, fetch, and enrichment — with the env vars it reads. Pass --check-keys to also report enabled state, per-env-var set/unset, and an overall ready boolean per row.

marmot providers list                # supported providers + env vars (human table on TTY, JSON when piped)
marmot providers list --check-keys   # adds enabled / keys / ready diagnostic
marmot providers list --json         # force JSON envelope
marmot providers list --markdown     # markdown pipe-table

Output mode is TTY-aware by default — interactive terminals get the human table; piped output falls back to JSON. Pass --json or --markdown to force.

For the bottom-line "what providers can I use right now?" answer, prefer marmot config show --json and read the readyProviders array. That field returns just the slugs of providers whose credentials resolve and that aren't disabled in config — same source data as --check-keys, but in a one-line summary instead of a per-row table.

API key precedence

Per call:

  1. --api-key <key> flag, where supported
  2. Custom env var name from providers.<slug>.apiKeyEnvVar in config, if set
  3. The provider's built-in env var (APOLLO_API_KEY, TAVILY_API_KEY, etc.)
  4. Auth error if none is set

Per-provider settings

In addition to verb defaults, each provider supports its own settings block. See Configuration for the full schema. Three knobs:

  • Enable / disable. Pause a provider without removing its key. Disabled providers error early on every call routed to them.
  • Custom env var names. Override the built-in env var name (e.g. read MY_APOLLO_KEY instead of APOLLO_API_KEY). Useful when you already use the default name for another tool.
  • Response cache. Web and data providers only. Cache responses on disk for a configurable TTL so repeat calls skip the network. Disabled by default. See Caching.

Walk through these via marmot setup (the "Configure provider settings" entry) or set them directly:

marmot config set providers.tavily.enabled false
marmot config set providers.tavily.cache.enabled true
marmot config set providers.tavily.cache.ttlDays 14
marmot config set providers.apollo.apiKeyEnvVar MY_APOLLO_KEY