Monitors run Exa searches on a cron schedule and deliver results to a webhook endpoint. Each run finds and synthesizes results, with automatic deduplication so you only see new content across runs.Use them to track competitor announcements, new funding rounds, regulatory changes, research publications, or any topic you want to follow over time.
from exa_py import Exaimport osexa = Exa(os.getenv("EXA_API_KEY"))# Create a monitormonitor = exa.monitors.create(params={ "name": "AI Funding Tracker", "search": { "query": "AI startups that raised Series A funding", "numResults": 10 }, "webhook": { "url": "https://example.com/webhook" }})print(f"Monitor ID: {monitor.id}")# Store the webhook secret securely — only returned on creationprint(f"Webhook secret: {monitor.webhook_secret}")# Trigger a run manuallyexa.monitors.trigger(monitor.id)# Poll for resultsimport timewhile True: runs = exa.monitors.runs.list(monitor.id) latest = runs.data[0] if latest.status in ("completed", "failed"): break time.sleep(2)# Print resultsif latest.status == "completed" and latest.output: run = exa.monitors.runs.get(monitor.id, latest.id) for result in run.output.results: print(f"- {result['title']}: {result['url']}")
Copy
Ask AI
npm install exa-js
Copy
Ask AI
import Exa from "exa-js";const exa = new Exa(process.env.EXA_API_KEY);// Create a monitorconst monitor = await exa.monitors.create({ name: "AI Funding Tracker", search: { query: "AI startups that raised Series A funding", numResults: 10 }, webhook: { url: "https://example.com/webhook" }});console.log(`Monitor ID: ${monitor.id}`);// Store the webhook secret securely — only returned on creationconsole.log(`Webhook secret: ${monitor.webhookSecret}`);// Trigger a run manuallyawait exa.monitors.trigger(monitor.id);// Poll for resultslet latest;while (true) { const runs = await exa.monitors.runs.list(monitor.id); latest = runs.data[0]; if (latest.status === "completed" || latest.status === "failed") break; await new Promise(r => setTimeout(r, 2000));}// Print resultsif (latest.status === "completed" && latest.output) { const run = await exa.monitors.runs.get(monitor.id, latest.id); for (const result of run.output.results) { console.log(`- ${result.title}: ${result.url}`); }}
Copy
Ask AI
# Create a monitorcurl -X POST "https://api.exa.ai/monitors" \ -H "Content-Type: application/json" \ -H "x-api-key: $EXA_API_KEY" \ -d '{ "name": "AI Funding Tracker", "search": { "query": "AI startups that raised Series A funding", "numResults": 10 }, "webhook": { "url": "https://example.com/webhook" } }'# Trigger a runcurl -X POST "https://api.exa.ai/monitors/{MONITOR_ID}/trigger" \ -H "x-api-key: $EXA_API_KEY"# List runscurl "https://api.exa.ai/monitors/{MONITOR_ID}/runs" \ -H "x-api-key: $EXA_API_KEY"# Get a specific runcurl "https://api.exa.ai/monitors/{MONITOR_ID}/runs/{RUN_ID}" \ -H "x-api-key: $EXA_API_KEY"