Subtype Filtering

Filter search and enrich results to specific signal subtypes with the signal_subtypes parameter.

Every signal has a signal_type (e.g. hiring-trends) and, within it, a signal_subtype - a more specific sub-category (e.g. hiringSalesRoles vs. hiringEngineeringRoles). The signal_subtypes request parameter filters server-side, so only the subtypes you care about come back. The full vocabulary lives in the Signal Catalog.

Subtype filtering is supported on all four search and enrich endpoints:

EndpointNotes
POST /v1/companies/searchFilters which signals qualify a company
POST /v1/contacts/searchFilters which signals qualify a contact
POST /v1/companies/enrichFilters which signals are returned (and billed)
POST /v1/contacts/enrichFilters which signals are returned (and billed)

Request fields (JSON body, all four endpoints):

FieldTypeDescription
signal_subtypesstring[]Subtype values to match. Max 25. OR semantics - a signal matching any value passes.
signal_subtypestringLegacy single-value form. If both are sent, the value is unioned into signal_subtypes.

Step 1: Discover the Vocabulary

Don't guess subtype slugs - pull them from the free types endpoint. The response includes a per-type subtypes map. Add ?include_counts=true if you also want signal volumes per type.

curl https://signals.autobound.ai/v1/signals/types \
  -H "x-api-key: YOUR_API_KEY"

Response (truncated):

{
  "signal_types": ["news", "hiring-trends", "sec-8k", "..."],
  "subtypes": {
    "hiring-trends": [
      "hiringEngineeringRoles",
      "hiringMachineLearningRoles",
      "hiringSalesRoles",
      "..."
    ],
    "sec-8k": [
      "aiInvestment",
      "ceoChange",
      "cybersecurityIncident",
      "..."
    ],
    "news": [
      "acquires",
      "launches",
      "receives_financing",
      "..."
    ]
  }
}

Naming style varies by type (camelCase for most, snake_case for news) - another reason to copy values from this map rather than inventing them. Matching is case-insensitive either way.


Filtering Search

Add signal_subtypes alongside signal_types to only match companies (or contacts) with the specific activity you care about - here, companies hiring for sales or marketing roles:

curl -X POST https://signals.autobound.ai/v1/companies/search \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "signal_types": ["hiring-trends"],
    "signal_subtypes": ["hiringSalesRoles", "hiringMarketingRoles"],
    "limit": 10
  }'

High-volume types: when a subtype filter is applied to a high-volume signal type on search (linkedin-post-*, work-milestones, website-intelligence, twitter-*, seo-traffic, hiring-trends, hiring-velocity), the scanned window is capped to the most recent 14 days and the response includes a notice saying so. This clamp does not apply to enrich.


Filtering Enrich

The same fields work on both enrich endpoints. Company enrich - only the AI-investment content tags from Salesforce's recent SEC filings:

curl -X POST https://signals.autobound.ai/v1/companies/enrich \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "salesforce.com",
    "signal_types": ["sec-8k", "sec-10k"],
    "signal_subtypes": ["aiInvestment"],
    "limit": 50
  }'

Contact enrich - signal_types is optional; a subtype filter alone applies across everything returned:

curl -X POST https://signals.autobound.ai/v1/contacts/enrich \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_email": "[email protected]",
    "signal_subtypes": ["jobChange", "promotion"]
  }'

Billing: enrich bills 2 credits per returned signal, so a subtype filter directly reduces your bill - fewer signals returned, fewer credits spent. If the filter matches nothing, the call is free: you get a 200 with an empty signals array plus response metadata, never a 404, as long as the company or contact itself resolves.


Matching Semantics

The rules are identical on all four endpoints:

RuleBehavior
OR semanticsA signal matching any value in signal_subtypes passes the filter.
Max 25 valuesPer request, across the array.
Cross-typeOne list applies across all requested signal_types. SEC filing types share content-tag subtypes, so signal_types: ["sec-8k", "sec-10k"] + signal_subtypes: ["aiInvestment"] returns AI-investment signals from both filing types with a single filter.
Case-insensitiveValues are matched case-insensitively against the known vocabulary - hiringsalesroles matches hiringSalesRoles.
Unknown valuesA value not in the vocabulary falls back to an exact match - typically 0 results - and adds an entry to a warnings array in the response. It is never a 400 error, so one bad value doesn't break a batch integration.
Singular signal_subtypeStill accepted for backwards compatibility. Sent together with signal_subtypes, the two are unioned.

Next Steps


Did this page help you?