Create a user-defined keyword signal type with its own prompts, keywords, and source scope.
enabled: false is passed).
Required fields:
name — unique display name (1-100 chars, case-sensitive uniqueness per caller)keywords — 1-50 non-empty search terms, applied across all enabled sourcessearch_instructions — prompt telling the scanner what content to look forscoring_criteria — prompt telling the scorer how to rank matchessources — at least one source from: news, reddit, hacker_news, x_twitter, linkedin_posts, linkedin_jobs, g2_capterrasignal_type_sources row per registered source, enabling only those listed in sources. You can tweak per-source behavior later via PATCH /api/v1/signals/types/{id}/sources/{sourceId}.
Callers are capped at 20 total signal types. Attempting to create a 21st returns 400.
Prompt reset. There’s also POST /api/v1/signals/types/{id}/reset — it restores search_instructions and scoring_criteria on BUILT-IN types to their system defaults. It does not apply to custom types (use PATCH to edit prompts directly).
POST /api/v1/signals/types/{id}/generate — the background task fills in production-quality prompts.Source scope is later edited per-source. sources on create is a simple allowlist. Fine-grained control (per-source extra keywords, prompt overrides) is managed through the sources subresource.Uniqueness is per-caller. Two different partners can both have a layoffs type; conflicts are 409 only when the same caller tries it twice.This is the public partner API — rate-limited at 100 req/min. Use this rather than the internal /api/signals/types endpoint.Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Create a custom keyword signal type. Users are capped at 20 total types.
Display name. Must be unique across the caller's types.
1 - 100Search terms used across all enabled sources. 1-50 non-empty strings.
1 - 50 elements1Prompt telling the scanner what kind of content to look for. Required.
1Prompt telling the AI how to rank/score hits for relevance. Required.
1At least one source must be enabled.
1External data source that feeds signals. A signal type can be scoped to any subset of sources; the scanner fans out across the enabled set and classifies each hit.
news, reddit, hacker_news, x_twitter, linkedin_posts, linkedin_jobs, g2_capterra Short description shown in the UI. Defaults to empty string.
500Defaults to true — the new type scans on the next run.
Signal type created. Returns the full type object.
Public signal type. Returned by every signal-type endpoint and referenced from each signal via its signal_type label.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Display name, shown in the UI and echoed as signal_type.
structured — built-in type (hiring, funding, management_change, competitor_mentions) with a typed config payload. keyword — free-form user-defined type driven by keywords + search_instructions + scoring_criteria.
structured, keyword If false, the scanner skips this type entirely.
Exclusion phrases. An AI judge skips hits that match any disqualifier.
Structured-type payload. Keys depend on the underlying type (e.g. roles/seniority for hiring; stages/industries for funding). Null for keyword types.
JSON Schema describing the shape of config. Null for keyword types — there's no structured config.
Built-in types cannot be renamed, deleted, or have their sources changed. Only their prompts, keywords, disqualifiers, and structured config are editable.
Subset of sources enabled for this type. Null means no restriction was ever set; otherwise only listed sources feed this type.
External data source that feeds signals. A signal type can be scoped to any subset of sources; the scanner fans out across the enabled set and classifies each hit.
news, reddit, hacker_news, x_twitter, linkedin_posts, linkedin_jobs, g2_capterra