Skip to main content

Create a discovery monitor

Discover matching job openings, LinkedIn posts or job changes on a recurring schedule, without automatically creating Leads.

POST/api/sales-signals/discovery-monitors
HTTP referenceScope (signals:read OR companies:read) AND (signals:read OR companies:write) AND (signals:read OR leads:read) AND (signals:read OR search:run) AND (signals:run OR companies:read) AND (signals:run OR companies:write) AND (signals:run OR leads:read) AND (signals:run OR search:run) AND (signals:write OR companies:read) AND (signals:write OR companies:write) AND (signals:write OR leads:read) AND (signals:write OR search:run)Updated October 29, 2026

This page documents the canonical HTTP contract for this endpoint.

Developer keys need signals:read and signals:run and signals:write, or the complete legacy combination of companies:read and companies:write and leads:read and search:run. Signals scopes do not grant general CRM or Search access.

This reference describes the Signals discovery-monitor contract. Check the selected server’s capabilities and Signals catalog for supported sources, criteria, cadences and current billing. API availability does not enable monitoring or establish provider readiness, completed collection or delivered Signals.

HTTP 201 confirms saved configuration and any returned queued-run receipt; it does not mean provider collection or paid delivery has finished. The default enabled=true and runNow=true starts the first asynchronous check. Set runNow=false to wait for the recurring cadence, or enabled=false to save paused configuration with no run. The result always includes monitor and nullable run.

Discovery is independent of saved-Company enrollment. Choose exactly one immutable source per monitor. Use the catalog’s source criteriaSchema, supportedFrequencies and defaultFrequency; explicit frequency is recommended. Job changes defaults weekly; jobs/posts default daily. Hourly is supported only for LinkedIn posts.

Job changes

Roles are custom phrases, not a fixed position list. The source searches new roles, then verifies required employer industry, actual size, HQ country and person-country evidence. Missing or incompatible required evidence is withheld with warnings; seller fit tags do not replace verified industry. Daily uses the source date window for the last day; weekly uses its last-seven-day date window. Event dates can differ.

At least one role, department or seniority must be selected; title phrases are optional. Omit or send null for maxCandidates and maxCreditsPerCheck to collect all available candidates within organization credits. Either optional cap accepts strict positive whole numbers, with no fixed five-candidate maximum. The runtime freezes an affordable raw-candidate allowance and resumes bounded provider activities until source exhaustion or that allowance/cap. Invalid, duplicate or excluded candidates consume acquisition allowance. Delivery costs 2 organization credits per new unique job-change Signal. Duplicate organization delivery is free. Configuration itself is free; the default first check can deliver paid Signals. A Job change creates saved Signals, not Leads; Save person is a separate explicit operation.

LinkedIn posts

Use criteria.keywordPhrases for added keywords or phrases. The server normalizes the list and searches for any phrase with one quoted OR query, for example "outbound sales" OR "pipeline generation" OR "sales development". Industry and author-profile filters apply to that whole query. A list of terms does not create separate monitors or one search per term. For an existing raw Boolean query, send keywords without keywordPhrases; the raw query is preserved. If both are sent, the phrase list determines keywords.

Read industry options and use numeric IDs for authorsIndustryId. The following create request searches post text for any of three phrases, with the same Software Development and author-profile filters applied to all three:

{
  "name": "Outbound sales conversations",
  "source": "linkedin_posts",
  "criteria": {
    "keywordPhrases": [
      "outbound sales",
      "pipeline generation",
      "sales development"
    ],
    "authorsIndustryId": "4",
    "authorKeywords": "RevOps",
    "excludePromotions": true
  },
  "frequency": "hourly",
  "enabled": true,
  "runNow": true,
  "requestId": "linkedin-post-monitor-example-1"
}

Hourly sets the check cadence; it does not apply a last-hour post filter. The current LinkedIn post discovery criteria do not expose a posted-date or lookback field. The feed’s window_days filters saved evidence when reading it; it does not change what a monitor collects.

Post relevance is inferred automatically from the search intent and available organization context. Search intent stays primary; organization context can clarify relevance but cannot override it. Omit the legacy topic and relevanceMode fields in new requests.

Job openings and collection coverage

Jobs and LinkedIn posts retain all valid matches in batches and cost 0.2 credit per new unique delivered job/post. Duplicate deliveries do not incur another application delivery charge. No application delivery credits are charged for jobs/posts previews; provider acquisition costs are separate. Use criteria.providerSelection="automatic" to select the sources that enforce every active jobs filter; the wizard uses this mode without a provider list. Unsupported combinations fail instead of dropping filters. Explicit manual provider lists remain compatible; new monitor requests without a source plan use automatic routing. A blank job query is allowed only for jobType="remote"; remote-only acquisition retains explicit provider remote evidence. A jobs search market is not Company HQ geography. Read the full schemas from the catalog.

Omit maxResults: it is accepted only for compatibility and does not cap collection. Jobs/posts continue across provider pages in resumable batches; a processing batch is not an overall result limit. Job changes uses its own criteria.maxCandidates and credit limit. Source availability, provider coverage or credit holds can prevent complete collection; inspect collectionStatus and warnings. Saving a monitor, seeing an active state or receiving a queued run is not proof of delivery.

Reuse requestId after an uncertain create response with the same source, criteria, name, cadence and flags. A different payload using that ID returns 409. There is a maximum of 500 saved discovery monitors per organization/runtime. Poll monitor status, then read the saved feed with monitor_id; do not poll a discovery ID through the company-subscription run endpoint.

Compatibility: older API payloads may contain qualificationText, post topic or relevanceMode fields. These are legacy fields rather than current monitor inputs; omit them in new requests. Non-empty Job changes qualificationText is rejected.

Command Center can prepare a native approval plan with create_signal_discovery_monitor for this same command. Approval describes the saved configuration and any initial or recurring paid collection. The selected runtime must expose that native binding; API availability alone does not establish it. CLI source 0.2.126 adds autotouch signals create-discovery-monitor --data-file monitor.json, or named flags including --criteria-json. Omit enabled/runNow to retain server defaults, or explicitly use --no-enabled/--no-run-now. Inspect the installed CLI version; source support, package publication and backend deployment are separate.

Job monitor windows and employment types

For source=jobs, frequency=daily is the default and selects a past-day search; weekly selects the past seven days. The same window applies to preview, create, update and fresh scheduled checks. Omit the deprecated datePosted and linkedinDateRestrict inputs: they do not override monitor frequency.

Automatic routing can use Indeed, Google Jobs and LinkedIn when the other filters are compatible. Google Jobs uses its native posting-date filter. LinkedIn uses Scrappa’s Google-based search-date restriction, which is not an independently verified job-posting cutoff. Indeed checks returned posting dates before preview or delivery and excludes old, future, missing or unreadable dates; first-seen time never substitutes for posting time. Indeed requests date sorting unless another sort was saved, and still pages past old rows within bounded batches. Glassdoor has no supported lookback and is excluded from automatic date-window searches.

Omit jobType or use an empty string for Any job type. Current filters are part_time, contract, internship and remote. Legacy full_time/fulltime values are unrestricted. Paid continuation batches keep their saved search, date bounds and cursors; fresh checks use the current cadence. Selected-server deployment is separate from CLI 0.2.127 and these source-contract docs; inspect its catalog before relying on new behavior.

For source=fda, send frequency=weekly or omit it; daily and hourly are rejected. FDA activity monitors deliver free regulatory_action Signals for device, drug and food recalls, 510(k) clearances, PMA approvals and supplements, drug approvals and FDA warning letters. See the discovery guide for criteria.

For source=sec_filings, send frequency=daily or weekly (default weekly). SEC filings monitors deliver free Signals for Form D private offerings, 8-K executive changes, completed acquisitions and material agreements, and S-1/F-1 IPO registrations.

Body parameters

  • namerequired

    string

    Monitor name, 1–120 characters after trimming.

  • sourcerequired

    string

    jobs, linkedin_posts, job_changes, fda, or sec_filings. The source is immutable after creation.

  • criteriarequired

    object

    Complete source-specific criteria. Read discovery.sources[].criteriaSchema from the Signals catalog; JobsCriteria, LinkedInPostsCriteria and JobChangesCriteria are expanded below.

  • frequency · optional

    string

    Jobs: daily (default) searches the past day; weekly searches the past seven days, using each source’s date semantics. Job changes: daily/weekly, default weekly. LinkedIn posts: hourly/daily/weekly polling, default daily, with no post lookback. FDA activity: weekly only (default), matching FDA's weekly publication. SEC filings: daily or weekly, default weekly; checks read the last 2 or 8 days.

  • maxResults · optional

    integer|null

    Deprecated legacy field, 1–50 when supplied. Ignored by collection; returned as null. Use criteria.maxCandidates for the Job changes candidate bound.

  • enabled · optional

    boolean

    Defaults true. False saves a paused monitor and starts no collection.

  • runNow · optional

    boolean

    Defaults true. On create, enabled=true queues the initial asynchronous check; false saves for the next scheduled check. Preview never creates a monitor or schedule.

  • requestId · optional

    string

    Optional retry identity, 8–120 ASCII letters, digits, underscores or hyphens. Reuse only for the same explicit action and unchanged payload; a completed replay returns its saved result. A changed payload or an uncertain/in-flight preview can return 409.

  • previewMode · optional

    string

    Job changes: count (default) returns a free count; sample explicitly purchases at most one candidate for up to 2 app credits. Jobs/posts retain bounded provider acquisition; count does not make those sources a free count request.

Definitions

JobsCriteria

source=jobs. New clients can request automatic compatible-source selection. Existing manual provider lists remain supported.

Fields

  • providerSelection · optional

    string

    automatic is the default for new monitor authoring and derives every compatible source. Explicit manual mode preserves a selected provider list.

  • providers · optional

    array<string>

    Manual source list: indeed, google, linkedin or glassdoor; 1–4 unique sources. Omit for automatic routing. A supplied list cannot override the automatic plan. Date-window searches can use Indeed, Google Jobs and LinkedIn; other filters can narrow this further.

  • query · optional

    string

    Role/title query, 2–300 characters when nonempty. May be blank only with jobType=remote.

  • location · optional

    string

    Indeed location, at most 200 characters.

  • country · optional

    string

    Optional ISO-2 search market (Indeed) or localization (Google/LinkedIn), not employer HQ or worker eligibility. New automatic monitors default blank; legacy manual criteria can retain their saved market.

  • jobType · optional

    string

    Omit or use an empty string for Any job type. Current filters: part_time, contract, internship or remote (Indeed/Google). Legacy full_time/fulltime values normalize to unrestricted; they do not filter for full-time jobs. Remote-only acquisition retains explicit provider remote evidence.

  • radius · optional

    integer

    Indeed only, 0–100; radiusUnit is MILES (default) or KILOMETERS.

  • radiusUnit · optional

    string

    MILES or KILOMETERS; used with radius.

  • datePosted · optional

    string

    Deprecated compatibility input. New monitors derive today/week from daily/weekly frequency; this field cannot override that monitor window. Existing paid batches retain their saved search criteria. Omit in new requests.

  • sort · optional

    string

    Indeed only: blank, relevance or date. A required lookback uses date sorting unless an explicit sort was saved; posting dates are still checked after retrieval. Sorting is not proof of complete coverage.

  • language · optional

    string

    Optional two-letter lowercase language for Indeed/Google/LinkedIn.

  • linkedinDateRestrict · optional

    string

    Deprecated compatibility input. The lower-level LinkedIn search uses Google date restrictions such as d1/d7, but new monitors derive the restriction from daily/weekly frequency. Omit in monitor requests; search-result dates are not verified job-posting dates.

  • linkedinCountryRestriction · optional

    string

    LinkedIn only: country plus an ISO-2 country, for example countryUS.

  • linkedinLanguageRestriction · optional

    string

    LinkedIn only: lang_ plus a lowercase two-letter language, for example lang_en.

LinkedInPostsCriteria

criteria when source=linkedin_posts. Supply keywordPhrases for added literal terms, or keywords for a raw query. Unknown fields are rejected. All author filters apply to the same search.

Fields

  • keywordPhrases · optional

    array<string>

    1–10 literal post phrases, each at least 2 characters after normalization. Required unless keywords is supplied. Whitespace and surrounding quotes are normalized; blank entries are removed and phrases deduplicate without case. Embedded double quotes, backslashes and remaining non-printable characters are rejected. The compiled quoted OR query, including quotes and separators, must fit 300 characters. When supplied, this list determines keywords.

  • keywords · optional

    string

    Raw post-text query, 2–300 characters. Required unless keywordPhrases is supplied. Existing Boolean queries remain unchanged when keywordPhrases is omitted. With keywordPhrases, the server replaces this value with the compiled quoted OR query.

  • authorsIndustryId · optional

    string

    Canonical industry IDs from the industries lookup, comma-separated for multiple choices, for example 4 or 4,17. Filters the author’s employer industry. Defaults to an empty string with no industry restriction.

  • authorKeywords · optional

    string

    Optional author-profile search text, at most 300 characters. Applies to all post phrases in the query. Defaults to an empty string.

  • excludePromotions · optional

    boolean

    Exclude promotional posts during qualification. Defaults true.

JobChangesCriteria

criteria when source=job_changes. At least one nonempty roles, departments or seniorities list is required. Company filters alone cannot authorize an unrestricted search. Required company/person facts must be verified before delivery.

Fields

  • roles · optional

    array<string>

    0–10 optional role phrases of 2–150 characters. Each title is a query variant sharing the candidate allowance; title-free department/seniority queries are supported.

  • departments · optional

    array<string>

    Up to 12 supported values: marketing, sales, engineering, product, design, operations, finance, people, data, customer_success, growth, legal. Defaults [].

  • seniorities · optional

    array<string>

    Up to 7 values: founder, c_level, vp, director, head, lead, manager. Defaults [].

  • industries · optional

    array<string>

    Up to 20 canonical labels from the industries lookup, such as Software Development. Use labels, not numeric IDs. Defaults [].

  • companySizes · optional

    array<string>

    Any of 1-10, 11-50, 51-100, 101-250, 251-500, 501-1000, 1000-plus. The final band starts at 1,001 employees. Defaults [].

  • companyCountries · optional

    array<string>

    Up to 25 two-letter ISO country codes for the employer headquarters. Codes normalize to uppercase. Defaults [].

  • personCountries · optional

    array<string>

    Up to 25 two-letter ISO country codes for the person location, separate from Company HQ. Defaults [].

  • maxCandidates · optional

    integer | null

    Optional strict positive whole candidate cap. Omit or null collects all available candidates within organization credits. No fixed maximum of five.

  • maxCreditsPerCheck · optional

    integer | null

    Optional strict positive whole app-credit ceiling. Omit or null means no user-set ceiling. Collection also respects maxCandidates and an affordable allowance frozen from the organization balance; raw duplicates/invalid/excluded candidates consume that acquisition allowance.

FdaCriteria

criteria when source=fda. All fields are optional; each filter applies only to records that carry its field. Filters apply to FDA's own record fields; there is no relevance qualification.

Fields

  • activities · optional

    array<string>

    What to include. Medical devices: device_recalls, device_clearances (510(k)), pma_approvals, pma_supplements (incl. 30-day manufacturing-change notices), device_warning_letters. Drugs & biologics: drug_recalls, drug_approvals (original NDA/BLA), generic_approvals (original ANDA), drug_warning_letters. Food & supplements: food_recalls, food_warning_letters. Other: other_warning_letters. Defaults to device_recalls, device_clearances and device_warning_letters; at least one is required when sent. Legacy recalls and clearances map to device_recalls and device_clearances.

  • recallClasses · optional

    array<string>

    I, II and/or III. Defaults to I and II. Class I is the most serious. Applies to all recalls.

  • recallRootCauses · optional

    array<string>

    Device recalls only: design, manufacturing, supplier, labeling, undetermined or other, grouped from FDA's recorded root cause. Empty means all.

  • specialties · optional

    array<string>

    Device review panel codes such as CV (Cardiovascular), OR (Orthopedic) or RA (Radiology). Applies to 510(k) and PMA records; recall records carry no specialty. Empty means all.

  • letterViolations · optional

    array<string>

    Warning letters only: quality_system (21 CFR 820), drug_cgmp, food_safety, reporting (21 CFR 803, 806), unapproved_products or clinical_research, from the regulations each letter cites. Empty means all.

  • countries · optional

    array<string>

    ISO-2 countries of the firm's FDA address, at most 50. Empty means all countries. Drug approvals carry no address and never match a location filter.

  • usStates · optional

    array<string>

    Two-letter US states. When set, only US firms in those states match.

  • productKeywords · optional

    array<string>

    Up to ten terms of 2–80 characters; a record matches any term in its product, recall reason, root cause, device name or warning letter text.

SecCriteria

criteria when source=sec_filings. All fields are optional. Filters apply to EDGAR search facts and, for Form D, the filed offering details; there is no relevance qualification.

Fields

  • filingKinds · optional

    array<string>

    Which filings to include. Funding: funding_rounds (Form D private raises), public_offerings (8-K Item 3.02, 424B4/424B5), debt_financing (8-K Item 2.03), ipo_filings (S-1/F-1). Leadership & ownership: executive_changes (8-K Item 5.02), change_in_control (8-K Item 5.01), activist_stakes (Schedule 13D; the signal is on the target company). Deals: acquisitions (8-K Item 2.01), mergers_tender_offers (S-4/F-4, SC TO-T), material_agreements (8-K Item 1.01), terminated_agreements (8-K Item 1.02). Risk & distress: restructuring (8-K Item 2.05), cybersecurity_incidents (8-K Item 1.05), auditor_changes (8-K Item 4.01), delisting_notices (8-K Item 3.01). Other: earnings (8-K Item 2.02), other_events (8-K Item 8.01), annual_reports (10-K/20-F; best with filingKeywords). Defaults to funding_rounds, executive_changes and acquisitions. Amendments are excluded.

  • sectors · optional

    array<string>

    Sector keys such as software_it, biotech_pharma, medical_devices or banking_finance. Mapped to SIC codes for 8-K and S-1/F-1 filers and to the Form D industry group. Empty means all.

  • states · optional

    array<string>

    Two-letter US states of the filer's business address. Empty means all.

  • filingKeywords · optional

    array<string>

    Up to five EDGAR full-text search terms of 2–80 characters; a filing matches any term.

  • includeFunds · optional

    boolean

    Private raises only: also include funds and investment vehicles (pooled funds, SPVs, trusts, foundations, holding and single-property LLCs). Defaults false; vehicles are still collected.

  • minOfferingAmount · optional

    integer

    Form D only: minimum total offering amount in US dollars. Indefinite offerings do not pass a minimum.

Errors

StatusMeaning
401Missing or invalid authentication or organization/user context.
403The developer key lacks one or more listed scopes.
409Request ID reused with different configuration, or the monitor limit was reached.
422Invalid source criteria, bounds, cadence or request fields.

Docs