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
| Provider | Slug | Capabilities | Env var |
|---|---|---|---|
| OpenRouter | openrouter | text, image, speech, transcription, video | OPENROUTER_API_KEY |
| Anthropic | anthropic | text | ANTHROPIC_API_KEY |
| OpenAI | openai | text, image, speech, transcription | OPENAI_API_KEY |
| Vercel AI Gateway | vercel | text, image, speech, transcription, video | AI_GATEWAY_API_KEY |
| Cloudflare Workers AI | cloudflare | text, image, speech, transcription | CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID |
| Ollama | ollama | text (local) | OLLAMA_HOST (no key) |
Web Search providers
Content-aware retrieval providers — power search, scrape (cleaned markdown), answer, map, crawl, research, and findall.
| Provider | Slug | Env var | Best for |
|---|---|---|---|
| Brave Search | brave | BRAVE_API_KEY | search, answer |
| Exa | exa | EXA_API_KEY | search, scrape, research, findall |
| Firecrawl | firecrawl | FIRECRAWL_API_KEY | scrape, crawl, map, search |
| Parallel | parallel | PARALLEL_API_KEY | search, scrape, research, findall |
| Tavily | tavily | TAVILY_API_KEY | search, 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.
| Provider | Slug | Env var | Best for |
|---|---|---|---|
| ScrapeOps | scrapeops | SCRAPEOPS_API_KEY | fetch (proxy aggregator, 30+ backends) |
| ScraperAPI | scraperapi | SCRAPERAPI_API_KEY | fetch (JS rendering, Chromium) |
| ScrapingBee | scrapingbee | SCRAPINGBEE_API_KEY | fetch (residential proxies) |
| Zyte | zyte | ZYTE_API_KEY | fetch (POST-based, target-status surfacing) |
Enrichment providers
| Provider | Slug | Capabilities | Env var |
|---|---|---|---|
| Apollo | apollo | enrich, lookup (paid plan only for lookup and enrich --type person) | APOLLO_API_KEY |
| Hunter | hunter | enrich, lookup --type email, verify --type email | HUNTER_API_KEY |
| People Data Labs | pdl | enrich, lookup | PDL_API_KEY |
| Tomba | tomba | enrich, lookup --type email, lookup --type org, verify --type email | TOMBA_API_KEY + TOMBA_SECRET_KEY |
| Bouncer | bouncer | verify --type email | BOUNCER_API_KEY |
| Datagma | datagma | enrich --type person (with mobile phone), verify --type email | DATAGMA_API_KEY |
| ZeroBounce | zerobounce | verify --type email | ZEROBOUNCE_API_KEY |
| Kickbox | kickbox | verify --type email | KICKBOX_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:
| Verb | Brave | Exa | Firecrawl | Parallel | Tavily |
|---|---|---|---|---|---|
search | ✓ | ✓ | ✓ | ✓ | ✓ |
scrape | ✓ | ✓ | ✓ | ✓ | |
answer | ✓ chained | ✓ | ✓ inline | ||
map | ✓ | ✓ | |||
crawl | ✓ async | ✓ sync | |||
research | ✓ | ✓ | ✓ | ✓ | |
findall | ✓ | ✓ |
Web fetch / scraping verbs
Raw HTML through proxy/unblock services via fetch:
| Verb | ScrapeOps | ScraperAPI | ScrapingBee | Zyte |
|---|---|---|---|---|
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 type | Apollo | Hunter | PDL | Tomba | Bouncer | Datagma | ZeroBounce | Kickbox |
|---|---|---|---|---|---|---|---|---|
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
answerchainsweb/searchinto the Summarizer API, which requires a Pro Brave Search plan. Free-tier keys never receive asummarizer.key. - Exa
findalluses the Websets API, which requires a Pro Exa plan. Personal plans return 401. - Apollo
lookupandenrich --type personrequire a paid plan with master-key access. Free-tier keys return 403 witherror_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-tableOutput 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:
--api-key <key>flag, where supported- Custom env var name from
providers.<slug>.apiKeyEnvVarin config, if set - The provider's built-in env var (
APOLLO_API_KEY,TAVILY_API_KEY, etc.) - 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_KEYinstead ofAPOLLO_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