skills/monitor-api/SKILL.md
Monitor API integration of Parallel. Use when building applications with Parallel Monitor API.
npx skillsauth add janwilmake/parallel-coding-skills monitor-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Track web changes continuously with scheduled queries and webhook notifications
The Monitor API lets you continuously track the web for changes relevant to a query, on a schedule you control. Create a monitor with a natural-language query, choose a cadence (hourly, daily, weekly), and receive webhook notifications when changes are detected.
<Note> **Alpha Notice**: The Monitor API is currently in public alpha. Endpoints and request/response formats are subject to change. </Note>The Monitor API automates continuous research for any topic, including companies, products, or regulatory areas—without building complicated web monitoring infrastructure. Define a query once along with the desired schedule, and the service will detect relevant changes and deliver concise updates (with source links) to your systems via webhooks.
Current Features:
10d)Common Use Cases:
| Use Case | Example Query | | --------------------- | ------------------------------------------------------------------- | | News tracking | "What is the latest AI funding news?" | | Brand mentions | "Let me know when someone mentions Parallel Web Systems on the web" | | Product announcements | "Alert me when Apple announces new MacBook models" | | Regulatory updates | "Notify me of any new FDA guidance on AI in medical devices" | | Price monitoring | "Let me know when the price for AirPods drops below $150" | | Stock availability | "Alert me when the PS5 Pro is back in stock at Best Buy" | | Content updates | "Notify me when the React documentation is updated" | | Policy changes | "Track changes to OpenAI's terms of service" |
Generate your API key on Platform, then set it in your shell:
export PARALLEL_API_KEY="PARALLEL_API_KEY"
Create a monitor that gathers daily AI news:
curl --request POST \
--url https://api.parallel.ai/v1alpha/monitors \
--header 'Content-Type: application/json' \
--header "x-api-key: $PARALLEL_API_KEY" \
--data '{
"query": "Extract recent news about quantum in AI",
"cadence": "daily",
"webhook": {
"url": "https://example.com/webhook",
"event_types": ["monitor.event.detected"]
},
"metadata": { "key": "value" }
}'
Response:
{
"monitor_id": "monitor_b0079f70195e4258a3b982c1b6d8bd3a",
"query": "Extract recent news about quantum in AI",
"status": "active",
"cadence": "daily",
"metadata": { "key": "value" },
"webhook": {
"url": "https://example.com/webhook",
"event_types": ["monitor.event.detected"]
},
"created_at": "2025-04-23T20:21:48.037943Z"
}
Creates a monitor that periodically runs the specified query over the web at the specified cadence (hourly, daily, or weekly). The monitor runs once at creation and then continues according to the specified frequency.
Request Body:
| Parameter | Type | Required | Description |
| --------------- | -------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| query | string | Yes | Search query to monitor for material changes. |
| cadence | string | Yes | Cadence of the monitor. One of: daily, weekly, hourly |
| webhook | object | null | No | Webhook to receive notifications about the monitor's execution. |
| metadata | object | null | No | User-provided metadata stored with the monitor. This field is returned in webhook notifications and GET requests, enabling you to map responses to corresponding objects in your application. For example, if you are building a Slackbot that monitors changes, you could store the Slack thread ID here. |
| output_schema | object | null | No | Output schema for the monitor event. See Structured Outputs. |
Webhook Object:
| Parameter | Type | Required | Description |
| ------------- | -------------- | -------- | ----------------------------------------------------------------------------------------- |
| url | string | Yes | URL for the webhook. |
| event_types | array[string] | No | Event types to send webhook notifications for. See Webhooks for event types. |
Response:
Returns a MonitorResponse object with status code 201.
Example Request:
<CodeGroup> ```bash cURL curl --request POST \ --url https://api.parallel.ai/v1alpha/monitors \ --header 'Content-Type: application/json' \ --header "x-api-key: $PARALLEL_API_KEY" \ --data '{ "query": "Extract recent news about AI", "cadence": "daily", "webhook": { "url": "https://example.com/webhook", "event_types": ["monitor.event.detected"] }, "metadata": { "key": "value" } }' ```from httpx import Response
from parallel import Parallel
client = Parallel(api_key="PARALLEL_API_KEY")
res = client.post(
"/v1alpha/monitors",
cast_to=Response,
body={
"query": "Extract recent news about AI",
"cadence": "daily",
"webhook": {
"url": "https://example.com/webhook",
"event_types": ["monitor.event.detected"],
},
"metadata": {"key": "value"},
},
).json()
print(res["monitor_id"])
import Parallel from "parallel-web";
const client = new Parallel({ apiKey: process.env.PARALLEL_API_KEY! });
async function create_monitor() {
const monitor = await client.post("/v1alpha/monitors", {
body: {
query: "Extract recent news about AI",
cadence: "daily",
webhook: {
url: "https://example.com/webhook",
event_types: ["monitor.event.detected"],
},
metadata: { key: "value" },
},
});
console.log(monitor.monitor_id);
}
create_monitor();
</CodeGroup>
Monitors produce a stream of events each time they run. These events capture:
Related events are grouped by an event_group_id so you can fetch the full set of results that belong to the same discovery.
Event groups collect related results under a single event_group_id. When a monitor detects new results, it creates an event group. Subsequent runs can add additional events to the same group if they're related to the same discovery.
Use event groups to present the full context of a discovery (multiple sources, follow-up updates) as one unit.
Besides events with new results, monitors emit:
type: "event"): indicates a material change was detectedtype: "completion"): indicates a run finished successfully without detected eventstype: "error"): indicates a run failedRetrieves all events for a specific event group.
Path Parameters:
| Parameter | Type | Required | Description |
| ---------------- | ------ | -------- | --------------------- |
| monitor_id | string | Yes | ID of the monitor |
| event_group_id | string | Yes | ID of the event group |
Example Request:
<CodeGroup> ```bash cURL curl --request GET \ --url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>/event_groups/<event_group_id>" \ --header "x-api-key: $PARALLEL_API_KEY" ```from httpx import Response
from parallel import Parallel
client = Parallel(api_key="PARALLEL_API_KEY")
group = client.get(
f"/v1alpha/monitors/{monitor_id}/event_groups/{event_group_id}",
cast_to=Response,
).json()
print(group["events"])
import Parallel from "parallel-web";
const client = new Parallel({ apiKey: process.env.PARALLEL_API_KEY! });
async function getEventGroup(monitorId: string, eventGroupId: string) {
const res = (await client.get(
`/v1alpha/monitors/${monitorId}/event_groups/${eventGroupId}`,
)) as any;
console.log(res.events);
}
getEventGroup();
</CodeGroup>
Response:
{
"events": [
{
"type": "event",
"event_group_id": "mevtgrp_b0079f70195e4258eab1e7284340f1a9ec3a8033ed236a24",
"output": "New product launch announced",
"event_date": "2025-01-15",
"source_urls": ["https://example.com/news"],
"result": {
"type": "text",
"content": "New product launch announced"
}
}
]
}
Retrieves events from the monitor, including events with errors and material changes. The endpoint checks up to the specified lookback period or the previous 300 event groups, whichever is less.
Events will be returned in reverse chronological order, with the most recent event groups first. All events from an event group will be flattened out into individual entries in the list.
Path Parameters:
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ----------------- |
| monitor_id | string | Yes | ID of the monitor |
Query Parameters:
| Parameter | Type | Default | Description |
| ----------------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| lookback_period | string | 10d | Lookback period to fetch events from. Sample values: 10d, 1w. A minimum of 1 day is supported with one day increments. Use d for days, w for weeks. |
Example Request:
curl --request GET \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>/events?lookback_period=10d" \
--header "x-api-key: $PARALLEL_API_KEY"
Response:
{
"events": [
{
"type": "event",
"event_group_id": "mevtgrp_b0079f70195e4258eab1e7284340f1a9ec3a8033ed236a24",
"output": "New product launch announced",
"event_date": "2025-01-15",
"source_urls": ["https://example.com/news"],
"result": {
"type": "text",
"content": "New product launch announced"
}
},
{
"type": "completion",
"monitor_ts": "completed_2025-01-15T10:30:00Z"
},
{
"type": "error",
"error": "Error occurred while processing the event",
"id": "error_2025-01-15T10:30:00Z",
"date": "2025-01-15T10:30:00Z"
}
]
}
You can receive events via webhooks (recommended) or retrieve them via endpoints.
Webhooks (recommended): lowest latency, push-based delivery. Subscribe to monitor.event.detected, monitor.execution.completed, and monitor.execution.failed. See Webhooks for more details.
Endpoints (for history/backfill):
GET /v1alpha/monitors/{monitor_id}/events — list events for a monitor in reverse chronological order (up to recent ~300 runs). This flattens out events, meaning that multiple events from the same event group will be listed as different events.GET /v1alpha/monitors/{monitor_id}/event_groups/{event_group_id} - list all events given an event_group_id.This guide focuses on Monitor-specific webhook events and payloads. </Note>
Webhooks allow you to receive real-time notifications when a Monitor execution completes, fails, or when material events are detected, eliminating the need for polling. This is especially useful for scheduled monitors that run at long gaps (hourly, daily, or weekly) and notify your systems only when relevant changes occur.
To register a webhook for a Monitor, include a webhook parameter when creating the monitor:
curl --request POST \
--url https://api.parallel.ai/v1alpha/monitors \
--header "Content-Type: application/json" \
--header "x-api-key: $PARALLEL_API_KEY" \
--data '{
"query": "Extract recent news about AI",
"cadence": "daily",
"webhook": {
"url": "https://your-domain.com/webhooks/monitor",
"event_types": [
"monitor.event.detected",
"monitor.execution.completed",
"monitor.execution.failed"
]
},
"metadata": { "team": "research" }
}'
Webhook Parameters:
| Parameter | Type | Required | Description |
| ------------- | -------------- | -------- | --------------------------------------------------------- |
| url | string | Yes | Your webhook endpoint URL. Can be any domain you control. |
| event_types | array[string] | Yes | Event types to subscribe to. See Event Types below. |
Monitors support the following webhook event types:
| Event Type | Description |
| ----------------------------- | ---------------------------------------------------------------------------- |
| monitor.event.detected | Emitted when a run detects one or more material events. |
| monitor.execution.completed | Emitted when a Monitor run completes successfully (without detected events). |
| monitor.execution.failed | Emitted when a Monitor run fails due to an error. |
You can subscribe to any combination of these event types in your webhook configuration. Note that monitor.event.detected and monitor.execution.completed are mutually distinct and correspond to different runs.
For Monitor webhooks, the data object contains:
monitor_id: The unique ID of the Monitorevent: The event record for this runmetadata: User-provided metadata from the Monitor (if any){
"type": "monitor.execution.completed",
"timestamp": "2025-10-27T14:56:05.619331Z",
"data": {
"monitor_id": "monitor_0c9d7f7d5a7841a0b6c269b2b9b1e6aa",
"event": {
"type": "completion",
"monitor_ts": "completed_2025-01-15T10:30:00Z"
},
"metadata": { "team": "research" }
}
}
{
"type": "monitor.execution.failed",
"timestamp": "2025-10-27T14:57:30.789012Z",
"data": {
"monitor_id": "monitor_0c9d7f7d5a7841a0b6c269b2b9b1e6aa",
"event": {
"type": "error",
"error": "Error occurred while processing the event",
"id": "error_2025-01-15T10:30:00Z",
"date": "2025-01-15T10:30:00Z"
},
"metadata": { "team": "research" }
}
}
</CodeGroup>
When you receive a webhook with an event_group_id (for a detected change), fetch the full set of related events using the event group endpoint described above.
For HMAC signature verification and language-specific examples, see the Webhook Setup Guide - Security & Verification.
See Webhook Setup Guide - Retry Policy for delivery retries and backoff details.
Structured outputs enable you to define a JSON schema for monitor events. Each detected event conforms to the specified schema, returning data in a consistent, machine-readable format suitable for downstream processing in databases, analytics pipelines, or automation workflows.
<Note> **Schema Complexity**: Output schemas are currently limited to the complexity supported by the core processor. Use flat schemas with a small number of clearly defined fields. </Note>Include an output_schema field when creating a monitor:
curl --request POST \
--url https://api.parallel.ai/v1alpha/monitors \
--header 'Content-Type: application/json' \
--header "x-api-key: $PARALLEL_API_KEY" \
--data '{
"query": "monitor ai news",
"cadence": "daily",
"output_schema": {
"type": "json",
"json_schema": {
"type": "object",
"properties": {
"company_name": {
"type": "string",
"description": "Name of the company the news is about, NA if not company-specific"
},
"sentiment": {
"type": "string",
"description": "Sentiment of the news: positive or negative"
},
"description": {
"type": "string",
"description": "Brief description of the news"
}
}
}
}
}'
Events from monitors configured with structured outputs include a result field containing the parsed JSON object:
curl --request GET \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>/events" \
--header "x-api-key: $PARALLEL_API_KEY"
Response:
{
"events": [
{
"type": "event",
"event_group_id": "mevtgrp_f9727e22dd4a42ba5e7fdcaa36b2b8ea2ef7c11f15fb4061",
"event_date": "2025-12-02",
"source_urls": [
"https://www.cnbc.com/2025/12/02/youtube-ai-biometric-data-creator-deepfake.html"
],
"result": {
"type": "json",
"content": {
"company_name": "YouTube/Google",
"sentiment": "negative",
"description": "YouTube expanded a likeness detection deepfake tracking tool; experts warn the sign-up requires government ID and a biometric video."
}
}
},
{
"type": "event",
"event_group_id": "mevtgrp_f9727e22dd4a42ba5e7fdcaa36b2b8ea2ef7c11f15fb4061",
"event_date": "2025-12-02",
"source_urls": [
"https://fox59.com/business/press-releases/globenewswire/9595236/kloudfuse-launches-kloudfuse-3-5"
],
"result": {
"type": "json",
"content": {
"company_name": "Kloudfuse",
"sentiment": "positive",
"description": "Kloudfuse announced version 3.5 with AI-native observability features including LLM observability integrated into APM."
}
}
}
]
}
description fields for each property to improve extraction accuracystring and enum types for reliable parsingThe simulate event endpoint allows you to test your webhook integration without waiting for a scheduled monitor run.
Path Parameters:
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ----------------- |
| monitor_id | string | Yes | ID of the monitor |
Query Parameters:
| Parameter | Type | Default | Description |
| ------------ | ------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| event_type | string | monitor.event.detected | Event type to simulate. One of: monitor.event.detected, monitor.execution.completed, monitor.execution.failed |
Response:
Returns 204 No Content on success.
Errors:
| Status | Description | | ------ | --------------------------------------- | | 400 | Webhook not configured for this monitor | | 404 | Monitor not found |
Example:
curl --request POST \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>/simulate_event?event_type=monitor.event.detected" \
--header "x-api-key: $PARALLEL_API_KEY"
When you simulate a monitor.event.detected event, the webhook payload includes a test event_group_id. You can retrieve this test event group using the standard endpoint:
curl --request GET \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>/event_groups/<test_event_group_id>" \
--header "x-api-key: $PARALLEL_API_KEY"
Response:
<CodeGroup> ```json No Structured Output { "events": [ { "type": "event", "event_group_id": "test_abc", "output": "", "event_date": "2025-12-05", "source_urls": [ "https://test.example.com" ], "result": { "type": "text", "content": "This is a test event." } } ] } ```{
"events": [
{
"type": "event",
"event_group_id": "test_def",
"output": "",
"event_date": "2025-12-05",
"source_urls": ["https://test.example.com"],
"result": {
"type": "json",
"content": {
"sentiment": "",
"stock_ticker_symbol": "",
"description": ""
}
}
}
]
}
</CodeGroup>
Test event group IDs return dummy event data, allowing you to verify your full webhook processing pipeline—from receiving the webhook to fetching event details.
List all monitors for your account.
Example:
curl --request GET \
--url https://api.parallel.ai/v1alpha/monitors \
--header "x-api-key: $PARALLEL_API_KEY"
Retrieve a specific monitor by ID.
Path Parameters:
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ----------------- |
| monitor_id | string | Yes | ID of the monitor |
Example:
curl --request GET \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>" \
--header "x-api-key: $PARALLEL_API_KEY"
Update a monitor's configuration. You can update the cadence, webhook, and metadata.
Path Parameters:
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ----------------- |
| monitor_id | string | Yes | ID of the monitor |
Request Body:
| Parameter | Type | Required | Description |
| ---------- | -------------- | -------- | --------------------------------------------------- |
| cadence | string | No | Cadence of the monitor: daily, weekly, hourly |
| webhook | object | null | No | Webhook configuration |
| metadata | object | null | No | User-provided metadata |
Example:
curl --request PATCH \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>" \
--header 'Content-Type: application/json' \
--header "x-api-key: $PARALLEL_API_KEY" \
--data '{
"cadence": "weekly",
"metadata": { "updated": "true" }
}'
Delete a monitor, stopping all future executions. Deleted monitors can no longer be updated or retrieved.
Path Parameters:
| Parameter | Type | Required | Description |
| ------------ | ------ | -------- | ----------------- |
| monitor_id | string | Yes | ID of the monitor |
Example:
curl --request DELETE \
--url "https://api.parallel.ai/v1alpha/monitors/<monitor_id>" \
--header "x-api-key: $PARALLEL_API_KEY"
The Parallel Slack app brings Monitor directly into your Slack workspace. Create monitors with slash commands and receive updates in dedicated threads.
/invite @ParallelCreate a daily monitor:
/monitor latest AI research papers
The bot posts your query and replies in a thread when changes are detected.
Create an hourly monitor for fast-moving topics:
/hourly breaking news about OpenAI
View available commands:
/help
Reply to the monitoring thread with:
cancelmonitor
The bot will cancel the monitor and confirm in the thread.
Monitors created via Slack use the same pricing as the Monitor API. See Pricing for details.
Clear queries with explicit instructions lead to higher-quality event detection. Monitor works best with natural language queries that clearly describe what you're looking for.
| ❌ Bad Query | ✅ Good Query | | --------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | "Parallel OR Parallel Web Systems OR Parallel AI AND Funding OR Launch OR Announcement" | "Parallel Web Systems (parallel.ai) launch or funding updates" |
Unlike a search engine, the query doesn't need to be keyword-heavy—it needs to be intent-heavy.
hourly for fast-moving topicsdaily for most newsweekly for slower changesDon't use for historical research: Monitor is designed to track new updates as they happen, not to retrieve past news. Use Deep Research for historical queries.
| ❌ Bad Query | ✅ Good Query | | ------------------------------------------------ | ---------------------------------- | | "Find all AI funding news from the last 2 years" | "AI startup funding announcements" |
Monitor automatically tracks updates from when it's created. Adding specific dates to your query is unnecessary and can cause confusion.
| ❌ Bad Query | ✅ Good Query | | ------------------------------------ | ------------------------------ | | "Tesla news after December 12, 2025" | "Tesla news and announcements" |
Use webhooks to avoid unnecessary polling and reduce latency to updates. This is especially important for hourly and daily monitors.
Cancel monitors you no longer need to reduce your usage bills.
The Monitor API follows a straightforward lifecycle:
query, cadence, and optional webhook and metadataAt any point, you can retrieve the list of events for a monitor or events within a specific event group.
See Rate Limits for default quotas and how to request higher limits.
To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.parallel.ai/llms.txt
development
Monitor API integration of Parallel. Use when building applications with Parallel Monitor API.
development
Findall API integration of Parallel. Use when building applications with Parallel FindAll API.
development
Findall API integration of Parallel. Use when building applications with Parallel FindAll API.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.