Creating a Signal

What is a Signal?

A Signal is an AI-powered research request that answers a specific question about a company or contact. Think of it as asking an AI research assistant to investigate and provide verified answers with sources.

When you create a signal, Saber's AI:

  1. 🔍 Researches the target (company website, LinkedIn, public data sources)

  2. 🤖 Analyzes the information using advanced AI models

  3. Verifies findings against multiple sources

  4. 📊 Structures the answer in your requested format

  5. 🔗 Provides confidence scores and source citations

Signals support multiple answer types: text, numbers, booleans, lists, percentages, currency, URLs, and contacts.


Creating Signals

Company Signals analyze company domains to answer business intelligence questions like:

  • Technology stack and tools used

  • Company size, funding, and growth metrics

  • Market positioning and competitors

  • Products and services offered

Contact Signals analyze LinkedIn profiles to answer questions about individuals:

  • Professional interests and expertise

  • Career history and experience

  • Engagement and activity patterns

  • Communication preferences

Batch Creation allows you to efficiently create multiple signals at once using templates.

Create a company signal and block until the result is ready — returns the answer in the same response (recommended over async)

post

⭐ This is the recommended way to create signals and get results instead of async + webhooks.

Creates a signal and waits synchronously for it to complete, returning the result in the same request. This endpoint blocks until the signal processing finishes or a timeout is reached.


Why Use the Sync Endpoint?

Advantages over async + webhooks:

  • ✅ Get results immediately in one request

  • ✅ No webhook hosting required

  • ✅ No polling implementation needed

  • ✅ Simpler integration

  • ✅ Better for synchronous workflows


How It Works

  1. Send your signal creation request (same payload as regular POST /v1/companies/signals)

  2. The endpoint creates the signal and polls for completion

  3. Returns the completed signal with results when processing finishes

  4. If timeout is reached, returns the latest status (processing)


Timeout Configuration

  • Default timeout: Configured per API key

  • Max timeout: 900 seconds (15 minutes)

  • Custom timeout: Use X-Sbr-Timeout-Sec header to set custom timeout (up to max)

  • Error on timeout: Use X-Sbr-Timeout-Error: true header to return 408 on timeout instead of latest status


Response Codes

  • 200 OK - Signal completed successfully

  • 202 Accepted - Timeout reached, signal still processing

  • 408 Request Timeout - Timeout reached (when X-Sbr-Timeout-Error: true)


Using with Templates

Use signalTemplateId instead of defining questions inline for standardized research:

Templates let you reuse research questions, qualification criteria, and answer types across multiple companies. Create templates via POST /v1/companies/signals/templates.

Authorizations
AuthorizationstringRequired

API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.

Header parameters
X-Sbr-Timeout-Secinteger · min: 1 · max: 900Optional

Custom timeout in seconds (max 900). Defaults to your API key's configured timeout.

Example: 120
X-Sbr-Timeout-Errorstring · enumOptional

If "true", returns 408 Request Timeout on timeout instead of 202 with latest status

Example: falsePossible values:
Body
domainstring · min: 1 · max: 253Required

The company domain to research (e.g., "acme.com")

Example: acme.comPattern: ^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$
questionstring · min: 1 · max: 500Required

The research question to ask about the company

Example: What is Acme Corp's main business focus?
answerTypestring · enumOptional

The expected format of the answer

Default: open_textExample: open_textPossible values:
webhookUrlstring · uri · max: 2048Optional

Optional webhook URL to receive notifications when processing completes. Webhooks are only sent for freshly processed signals — cached results do not trigger webhooks. Set forceRefresh: true to bypass the cache and ensure webhook delivery.

Example: https://myapp.com/webhooks/signals
weightstring · enumOptional

The importance/weight of the signal

Example: importantPossible values:
signalTemplateIdstring · uuidOptional

Optional signal template ID to use. When provided, the template configuration (question, answerType, weight, qualificationCriteria) will be used. The system always resolves to the latest active version of the template. Only the domain parameter is required when using a template.

Example: a12b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
forceRefreshbooleanOptional

Force re-run of the signal analysis, skipping the cache. When set to true, a new signal will be created even if a cached result exists.

Default: falseExample: false
verificationModestring · enumOptional

Controls how strictly Saber verifies answers before responding.

  • strict: Only returns answers backed by verified sources (primary sources or trusted secondary sources like Crunchbase, PitchBook). Returns null when information is unavailable.
  • lenient: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.
Default: strictExample: strictPossible values:
Responses
chevron-right
200

Signal completed successfully

application/json
anyOptional

Polymorphic signal response (company or contact)

or
and
post
/v1/companies/signals/sync

Create a company signal asynchronously — returns immediately with a pending status; poll the returned ID or receive the result via webhook

post

Submit a domain and question to create a new research signal. The AI will analyze the domain and provide a structured answer based on the specified answer type.


When to Use This Endpoint

Use this endpoint for event-driven architectures where you need webhook notifications. For simpler integrations, use the /v1/companies/signals/sync endpoint (recommended) which returns results immediately.


Webhooks

Configure webhooks by including a webhookUrl parameter in your request.

Webhook events:

  • signal.completed - Signal processing finished successfully

  • signal.failed - Signal processing failed

Webhook security: All webhooks include HMAC-SHA256 signatures in the X-Webhook-Signature header for verification.

Webhook reliability:

  • Failed deliveries are retried up to 25 times with exponential backoff

  • Webhook requests timeout after 30 seconds

  • Your endpoint should respond with 2xx status code


Caching Behavior

Your response will be cached for up to 12 hours by default, unless you set the forceRefresh flag to true.

Cache is based on a hash of the following fields: domain (or contactProfileUrl for contact signals), question, answer type, verification mode, and output schema (if provided). Changing any of these fields will create a new signal. We will not send you the webhook if you hit the cache, even if the webhook URL in the payload is different from the original request.

Instead you will receive the latest status of the signal immediately in the response.


Using with Templates

Use signalTemplateId instead of defining questions inline for standardized research:

Templates let you reuse research questions, qualification criteria, and answer types across multiple companies. Create templates via POST /v1/companies/signals/templates.

Authorizations
AuthorizationstringRequired

API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.

Body
domainstring · min: 1 · max: 253Required

The company domain to research (e.g., "acme.com")

Example: acme.comPattern: ^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)*$
questionstring · min: 1 · max: 500Required

The research question to ask about the company

Example: What is Acme Corp's main business focus?
answerTypestring · enumOptional

The expected format of the answer

Default: open_textExample: open_textPossible values:
webhookUrlstring · uri · max: 2048Optional

Optional webhook URL to receive notifications when processing completes. Webhooks are only sent for freshly processed signals — cached results do not trigger webhooks. Set forceRefresh: true to bypass the cache and ensure webhook delivery.

Example: https://myapp.com/webhooks/signals
weightstring · enumOptional

The importance/weight of the signal

Example: importantPossible values:
signalTemplateIdstring · uuidOptional

Optional signal template ID to use. When provided, the template configuration (question, answerType, weight, qualificationCriteria) will be used. The system always resolves to the latest active version of the template. Only the domain parameter is required when using a template.

Example: a12b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
forceRefreshbooleanOptional

Force re-run of the signal analysis, skipping the cache. When set to true, a new signal will be created even if a cached result exists.

Default: falseExample: false
verificationModestring · enumOptional

Controls how strictly Saber verifies answers before responding.

  • strict: Only returns answers backed by verified sources (primary sources or trusted secondary sources like Crunchbase, PitchBook). Returns null when information is unavailable.
  • lenient: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.
Default: strictExample: strictPossible values:
Responses
post
/v1/companies/signals

Create multiple company signals in batch — combines domains and questions using a Cartesian product; use templates for batches over 100 signals

post

Submit multiple signals and domains to create signals using a Cartesian product pattern. Each signal is combined with each domain to create individual signals.

Two ways to create batch signals:

  1. Inline Questions: Define questions directly in the request for ad-hoc research without creating templates

  2. Using Templates (recommended for reusability): Reference pre-created templates by ID for consistent, reusable questions

Cartesian Product Logic:

  • If you submit 2 templates and 3 domains, the system creates 6 signals (2 × 3)

  • Sync mode (default): Maximum 100 resulting signals (templates × domains ≤ 100)

  • Async mode (async: true): Maximum 20,000 resulting signals (templates × domains ≤ 20,000)

Sync Mode (default):

  • Returns inline results with individual signal statuses

  • Maximum 100 signals per batch

  • Returns 202 with results[] array

Async Mode (async: true):

  • For large batches up to 20,000 signals

  • Returns immediately with a batchId for tracking

  • Signals are processed in background chunks

  • Returns 202 with batchId, totalSignals, status: "accepted"

  • Poll /v1/companies/signals/batches/status?domain=... for progress

Partial Failure Handling (sync mode):

  • Individual signal failures don't block other signals from processing

  • Each signal in the response includes its own status (accepted or failed)

  • Returns 202 if at least one signal is scheduled successfully

  • Returns 422 if all signals failed to be scheduled

Processing:

  • All signals are processed asynchronously

  • No guarantee of processing order

  • Use the /v1/companies/signals/sync endpoint (recommended) to retrieve results as they complete

Webhooks:

  • Each signal in the batch can include a webhookUrl to receive notifications on completion

  • Webhooks fire individually per signal as each one completes processing

  • Webhook events: signal.completed (success) or signal.failed (failure)

  • All webhooks include HMAC-SHA256 signatures in the X-Webhook-Signature header

Caching Behavior:

  • Signals are cached based on a hash of domain, question, answer type, verification mode, and output schema (if provided)

  • If a matching cached result exists, the cached response is returned immediately and no webhook is sent

  • To force fresh processing (and webhook delivery), set forceRefresh: true on individual signals

Automatic Summary Generation:

  • Set generateSummaryOnComplete to true to automatically generate summaries when all signals in the batch complete

  • Summaries are generated per domain (one summary per unique domain in the batch)

  • Summary generation is triggered automatically once all signals for a domain have completed

  • Use the /v1/companies/signals/summaries endpoint to retrieve generated summaries

Authorizations
AuthorizationstringRequired

API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.

Body
domainsstring[] · min: 1 · max: 100Required

Array of company domains to research. Each domain will be combined with each signal template using Cartesian product logic. The total resulting signals (len(signals) × len(domains)) must not exceed 100.

Example: acme.com
generateSummaryOnCompletebooleanOptional

Whether to automatically generate a summary when all signals in the batch are completed. When set to true, a summary will be automatically generated for each unique domain in the batch once all signals for that domain have completed processing.

Default: falseExample: false
asyncbooleanOptional

When true, enables async processing with a higher limit of 20,000 signals. Returns a batchId for tracking instead of inline results. The response shape differs from sync mode — returns { batchId, submittedAt, totalSignals, status, async }. Use /v1/companies/signals/batches/status?domain=... to poll for progress.

Default: falseExample: false
Responses
post
/v1/companies/signals/batch

Create a contact signal and block until the result is ready — returns the answer in the same response (recommended over async)

post

⭐ This is the recommended way to create contact signals and get results instead of async + webhooks.

Creates a contact signal and waits synchronously for it to complete, returning the result in the same request. Works identically to the company signals sync endpoint but for contact-based signals.


Why Use the Sync Endpoint?

Advantages over async + webhooks:

  • ✅ Get results immediately in one request

  • ✅ No webhook hosting required

  • ✅ No polling implementation needed

  • ✅ Simpler integration

  • ✅ Better for synchronous workflows


How It Works

  1. Send your signal creation request (same payload as regular POST /v1/contacts/signals)

  2. The endpoint creates the signal and polls for completion

  3. Returns the completed signal with results when processing finishes

  4. If timeout is reached, returns the latest status (processing)


Timeout Configuration

  • Default timeout: Configured per API key

  • Max timeout: 900 seconds (15 minutes)

  • Custom timeout: Use X-Sbr-Timeout-Sec header to set custom timeout (up to max)

  • Error on timeout: Use X-Sbr-Timeout-Error: true header to return 408 on timeout instead of latest status


Response Codes

  • 200 OK - Signal completed successfully

  • 202 Accepted - Timeout reached, signal still processing

  • 408 Request Timeout - Timeout reached (when X-Sbr-Timeout-Error: true)


Using with Templates

Use signalTemplateId instead of defining questions inline for standardized research:

Templates let you reuse research questions, qualification criteria, and answer types across multiple contacts. Create templates via POST /v1/companies/signals/templates.

Authorizations
AuthorizationstringRequired

API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.

Header parameters
X-Sbr-Timeout-Secinteger · min: 1 · max: 900Optional

Custom timeout in seconds (max 900). Defaults to your API key's configured timeout.

Example: 120
X-Sbr-Timeout-Errorstring · enumOptional

If "true", returns 408 Request Timeout on timeout instead of 202 with latest status

Example: falsePossible values:
Body
contactProfileUrlstring · uri · min: 1 · max: 500Required

The contact profile URL to research (e.g., "https://linkedin.com/in/johndoe")

Example: https://linkedin.com/in/johndoe
questionstring · min: 1 · max: 500Required

The research question to ask about the contact

Example: What are this person's main professional interests?
answerTypestring · enumOptional

The expected format of the answer

Default: open_textExample: open_textPossible values:
webhookUrlstring · uri · max: 2048Optional

Optional webhook URL to receive notifications when processing completes. Webhooks are only sent for freshly processed signals — cached results do not trigger webhooks. Set forceRefresh: true to bypass the cache and ensure webhook delivery.

Example: https://myapp.com/webhooks/signals
weightstring · enumOptional

The importance/weight of the signal

Example: importantPossible values:
signalTemplateIdstring · uuidOptional

Optional signal template ID to use

Example: a12b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
verificationModestring · enumOptional

Controls how strictly Saber verifies answers before responding.

  • strict: Only returns answers backed by verified sources (primary sources or trusted secondary sources like Crunchbase, PitchBook). Returns null when information is unavailable.
  • lenient: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.
Default: strictExample: strictPossible values:
forceRefreshbooleanOptional

Force re-run of the signal analysis, skipping the cache. When set to true, a new signal will be created even if a cached result exists.

Default: falseExample: false
Responses
chevron-right
200

Signal completed successfully

application/json

Polymorphic signal response (company or contact)

completedAtstring · date-timeOptional

When the signal processing completed (only present when status is completed)

Example: 2024-01-15T10:32:15Z
answerone ofOptional

The AI-generated answer (only present when status is completed)

or
or
or
or
or
or
or
or
or
or
reasoningstringOptional

Detailed reasoning for the answer (only present when status is completed)

Example: Based on the company's website and public information, Acme Corp specializes in enterprise software.
confidencenumber · float · max: 1Optional

Confidence score for the answer (0-1, only present when status is completed)

Example: 0.95
errorstringOptional

Error message (only present when status is failed)

Example: LinkedIn data is currently unavailable due to rate limits. Please try again later.
errorCodestring · enumOptional

Machine-readable error code (only present when status is failed)

Example: LINKEDIN_RATE_LIMIT_EXCEEDEDPossible values:
errorActionstringOptional

Suggested action to resolve the error (only present when status is failed)

Example: You can: (1) Set connectors.salesNavigator.enabled="off" to skip LinkedIn data, (2) Add more LinkedIn connectors, or (3) Try again in 24 hours when rate limits reset.
verificationModestring · enumOptional

Verification mode used for signal generation

Example: strictPossible values:
contactProfileUrlstring · uriOptional

Contact profile URL

post
/v1/contacts/signals/sync

Create a contact signal asynchronously — returns immediately with a pending status; poll the returned ID or receive the result via webhook

post

Submit a LinkedIn URL and question to create a new research signal for an individual contact. The AI will analyze the contact's profile and provide a structured answer based on the specified answer type.

Contact signals work similarly to company signals but focus on individual contacts using their LinkedIn profile URLs.


When to Use This Endpoint

Use this endpoint for event-driven architectures where you need webhook notifications. For simpler integrations, use the /v1/contacts/signals/sync endpoint (recommended) which returns results immediately.


Webhooks

Configure webhooks by including a webhookUrl parameter in your request.

Webhook events:

  • signal.completed - Signal processing finished successfully

  • signal.failed - Signal processing failed

Webhook security: All webhooks include HMAC-SHA256 signatures in the X-Webhook-Signature header for verification.

Webhook reliability:

  • Failed deliveries are retried up to 25 times with exponential backoff

  • Webhook requests timeout after 30 seconds

  • Your endpoint should respond with 2xx status code


Using with Templates

Use signalTemplateId instead of defining questions inline for standardized research:

Templates let you reuse research questions, qualification criteria, and answer types across multiple contacts. Create templates via POST /v1/companies/signals/templates.


Note: Contact signals currently return placeholder data and will be fully implemented in a future release.

Authorizations
AuthorizationstringRequired

API key authentication using Bearer token. Format: sk_live_ followed by a secure random string.

Body
contactProfileUrlstring · uri · min: 1 · max: 500Required

The contact profile URL to research (e.g., "https://linkedin.com/in/johndoe")

Example: https://linkedin.com/in/johndoe
questionstring · min: 1 · max: 500Required

The research question to ask about the contact

Example: What are this person's main professional interests?
answerTypestring · enumOptional

The expected format of the answer

Default: open_textExample: open_textPossible values:
webhookUrlstring · uri · max: 2048Optional

Optional webhook URL to receive notifications when processing completes. Webhooks are only sent for freshly processed signals — cached results do not trigger webhooks. Set forceRefresh: true to bypass the cache and ensure webhook delivery.

Example: https://myapp.com/webhooks/signals
weightstring · enumOptional

The importance/weight of the signal

Example: importantPossible values:
signalTemplateIdstring · uuidOptional

Optional signal template ID to use

Example: a12b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
verificationModestring · enumOptional

Controls how strictly Saber verifies answers before responding.

  • strict: Only returns answers backed by verified sources (primary sources or trusted secondary sources like Crunchbase, PitchBook). Returns null when information is unavailable.
  • lenient: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.
Default: strictExample: strictPossible values:
forceRefreshbooleanOptional

Force re-run of the signal analysis, skipping the cache. When set to true, a new signal will be created even if a cached result exists.

Default: falseExample: false
Responses
post
/v1/contacts/signals

Last updated