---
title: "Create a monitor"
method: POST
path: "/api/signals/monitors"
tags: ["Signals"]
---

# Create a monitor

`POST /api/signals/monitors`

Creates a new signal monitor for the authenticated user.

## Request body

- object
  - `name` string, required — The monitor name.
  - `signal_type` string, required — The signal type. Accepted values: `keyword_mention`, `new_hire`, `job_change`, `post_engagement`, `company_hiring`.
  - `keywords` string[] — Keywords to track (required for keyword_mention and post_engagement without post_url, max 5).
  - `webhook_url` string — Optional HTTPS URL to receive webhook notifications when new signals match.
  - `post_url` string — LinkedIn post URL to monitor engagement on (post_engagement only).
  - `profile_url` string — LinkedIn profile URL to monitor (alternative to post_url, post_engagement only).
  - `engagement_types` string[] — Engagement types to track (required for post_engagement). Accepted values: `like`, `comment`.
  - `enrichment_level` string — Contact enrichment level. Accepted values: `email`, `email_phone`.
  - `lead_list_id` integer — ID of a lead list to automatically add matched contacts to.
  - `ai_relevance_prompt` string — Optional custom prompt used to score AI relevance of matched signals (max 500 chars).
  - `target_companies` string[] — Target companies (names or domains) to filter signals (max 100). Only accepted for `new_hire` and `job_change` — returns 422 for any other signal type.
  - `is_shared` boolean — Opt-in flag to share the monitor with the user's current team (defaults to false).
  - `icp_filters` object — Optional ICP filter criteria to narrow signal matching.
    - `industries` string[] — Industries to match (LinkedIn Industry Codes V2).
    - `employee_count_ranges` string[] — Employee count ranges. Accepted values: `1-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000`, `5001-10000`, `10001+`.
    - `countries` string[] — 2-letter ISO 3166-1 alpha-2 country codes.
    - `job_title_keywords` string[] — Contact job title keywords (max 10, rejected for company_hiring — no contact).
    - `seniority_levels` integer[] — Seniority levels (rejected for company_hiring — no contact). (1=Entry, 4=IC, 6=Senior IC, 8=Management, 9=Director, 11=VP, 13=Executive, 14=C-Suite, 15=Founder).
  - `job_offer_title_keywords` string[] — Job offer title keywords to watch for (required for company_hiring, rejected for other types, max 10). Substring match, OR logic, case-insensitive.

## Response `201`

Created

- object
  - `id` integer
  - `name` string
  - `signal_type` string
  - `signal_type_label` string
  - `signal_level` string
  - `status` string
  - `keywords` string[]
  - `icp_filters` string, nullable
  - `webhook_url` string, nullable
  - `webhook_paused_at` string, nullable
  - `post_url` string, nullable
  - `profile_url` string, nullable
  - `engagement_types` string, nullable
  - `enrichment_level` string, nullable
  - `lead_list_id` string, nullable
  - `ai_relevance_prompt` string, nullable
  - `target_companies` string, nullable
  - `match_count` integer
  - `is_shared` boolean
  - `is_owner` boolean
  - `is_team_owner` boolean
  - `user_id` integer
  - `owner_name` string
  - `created_at` string

## Other responses

- `401` — Unauthenticated
- `404` — Feature disabled
- `422` — Validation failed

---

[API](https://skmtc.net/findymail/apis/findymail-api-documentation.md) · [All operations](https://skmtc.net/findymail/apis/findymail-api-documentation/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/findymail/findymail-api-documentation/revisions/ae7fddf16bf9/schema)
