# Models

## The CreateMarketSignalSubscriptionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateMarketSignalSubscriptionRequest":{"type":"object","required":["type","webhookUrl"],"properties":{"type":{"type":"string","description":"The type of market signal to monitor. Determines which data sources are polled\nand which filter schema is accepted.\n","enum":["JOB_POSTS","LINKEDIN_POST","FUND_RAISED","RECENT_INVESTMENT","IPO"]},"name":{"type":"string","description":"Optional display name for the subscription","maxLength":200},"prompt":{"type":"string","description":"Natural language prompt for AI-based filter generation (JOB_POSTS only).\nWhen provided without filters, the AI generates complete filters from the prompt.\nWhen provided with filters, the AI augments the filters with prompt intent.\nNot yet supported for LINKEDIN_POST.\n"},"filters":{"type":"object","description":"Subscription filters. The schema depends on the `type` field:\n\n**JOB_POSTS filters:**\n- `titleKeywords` (string[]): Natural language title matching\n- `excludeTitleKeywords` (string[]): Title exclusions\n- `titlePatterns` (string[]): Regex patterns for job titles\n- `excludeTitlePatterns` (string[]): Regex exclusion patterns for titles\n- `descriptionKeywords` (string[]): Description keyword matching\n- `excludeDescriptionKeywords` (string[]): Description exclusions\n- `descriptionPatterns` (string[]): Regex patterns for descriptions\n- `excludeDescriptionPatterns` (string[]): Regex exclusion patterns for descriptions\n- `countries` (string[]): ISO country codes for job location\n- `seniority` (string[]): Seniority levels (c_level, staff, senior, mid_level, junior)\n- `technologySlugs` (string[]): Required technologies\n- `minSalaryUsd` (number): Minimum annual salary in USD\n- `maxSalaryUsd` (number): Maximum annual salary in USD\n- `remote` (boolean): Filter for remote jobs only\n- `companyDomains` (string[]): Specific company domains to monitor\n- `excludeCompanyDomains` (string[]): Company domains to exclude\n- `companyNames` (string[]): Partial match company names\n- `excludeCompanyNames` (string[]): Company names to exclude\n- `minEmployees` (number): Minimum company size\n- `maxEmployees` (number): Maximum company size\n- `companyCountries` (string[]): Company HQ country codes\n- `companyTechnologySlugs` (string[]): Company tech stack filter\n- `excludeRecruitingAgencies` (boolean): Filter out staffing agencies\n- `fundingStages` (string[]): Funding stages (seed, series_a, series_b, etc.)\n- `industryIds` (string[]): LinkedIn industry IDs to include\n- `excludeIndustryIds` (string[]): LinkedIn industry IDs to exclude\n- `promptFilter` (string): AI-based relevance scoring prompt\n- `maxLookbackDays` (number): How far back to look in days\n\n**LINKEDIN_POST filters:**\n- `keywordsAll` (string[]): Boolean AND keywords\n- `keywordsAny` (string[]): Boolean OR keywords\n- `keywordsNone` (string[]): Boolean NOT keywords\n- `promptFilter` (string): AI-based content + persona filtering prompt\n- `maxLookbackDays` (number): Lookback period in days\n\n**FUND_RAISED / RECENT_INVESTMENT / IPO filters (shared):**\n- `searchQueries` (string[]): Custom search queries\n- `keywords` (string[]): Keywords appended to default queries\n- `excludeKeywords` (string[]): Excluded keywords\n- `countries` (string[]): Geographic filtering (reserved)\n- `minAmountUsd` (number): Minimum deal size (reserved)\n- `maxLookbackDays` (number): Lookback period in days\n- `promptFilter` (string): AI-based relevance scoring prompt (reserved)\n\nRequired for LINKEDIN_POST. Optional for JOB_POSTS when `prompt` is provided.\n","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"URL to receive webhook notifications when new signals are matched","maxLength":2048},"webhookSecret":{"type":"string","description":"Optional secret for HMAC-SHA256 webhook signature verification"},"intervalSignalLimit":{"type":"integer","description":"Maximum number of signals to deliver per polling interval (1-10000, default 500)","minimum":1,"maximum":10000,"default":500},"interval":{"type":"string","description":"Polling interval for checking new signals","enum":["daily","weekly"],"default":"daily"}},"additionalProperties":false}}}}
```

## The UpdateMarketSignalSubscriptionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateMarketSignalSubscriptionRequest":{"type":"object","description":"Partial update for a market signal subscription. All fields are optional; only provided\nfields are updated. The subscription `type` is immutable and cannot be changed.\n","properties":{"name":{"type":"string","description":"Updated display name","maxLength":200},"prompt":{"type":"string","description":"Updated natural language prompt (JOB_POSTS only)"},"filters":{"type":"object","description":"Updated subscription filters (must match the subscription's type schema)","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"Updated webhook URL","maxLength":2048},"webhookSecret":{"type":"string","description":"Updated webhook secret"},"intervalSignalLimit":{"type":"integer","description":"Updated maximum signals per interval (1-10000)","minimum":1,"maximum":10000},"interval":{"type":"string","description":"Updated polling interval. Changing this restarts the polling schedule.","enum":["daily","weekly"]}},"additionalProperties":false}}}}
```

## The MarketSignalSubscriptionResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"MarketSignalSubscriptionResponse":{"type":"object","description":"A market signal subscription with its current configuration and status","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the subscription"},"organizationId":{"type":"string","description":"Organization that owns this subscription"},"type":{"type":"string","description":"The subscription type (immutable after creation)","enum":["JOB_POSTS","LINKEDIN_POST","FUND_RAISED","RECENT_INVESTMENT","IPO"]},"name":{"type":["string","null"],"description":"Display name for the subscription"},"status":{"type":"string","description":"Current subscription status (derived from timestamps)","enum":["active","paused","deleted"]},"prompt":{"type":["string","null"],"description":"Natural language prompt used for filter generation (if applicable)"},"filters":{"type":"object","description":"The active filter configuration (structure varies by subscription type)","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"Webhook delivery URL"},"intervalSignalLimit":{"type":"integer","description":"Maximum signals per polling interval"},"interval":{"type":"string","description":"Polling interval","enum":["daily","weekly"]},"createdAt":{"type":"string","format":"date-time","description":"When the subscription was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the subscription was last updated"}},"required":["id","organizationId","type","status","filters","webhookUrl","intervalSignalLimit","interval","createdAt","updatedAt"]}}}}
```

## The MarketSignalSubscriptionListResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"MarketSignalSubscriptionListResponse":{"type":"object","description":"Paginated list of market signal subscriptions","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MarketSignalSubscriptionResponse"}},"total":{"type":"integer","description":"Total number of subscriptions matching the query"},"limit":{"type":"integer","description":"Maximum subscriptions per page"},"offset":{"type":"integer","description":"Number of subscriptions skipped"}},"required":["items","total","limit","offset"]},"MarketSignalSubscriptionResponse":{"type":"object","description":"A market signal subscription with its current configuration and status","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the subscription"},"organizationId":{"type":"string","description":"Organization that owns this subscription"},"type":{"type":"string","description":"The subscription type (immutable after creation)","enum":["JOB_POSTS","LINKEDIN_POST","FUND_RAISED","RECENT_INVESTMENT","IPO"]},"name":{"type":["string","null"],"description":"Display name for the subscription"},"status":{"type":"string","description":"Current subscription status (derived from timestamps)","enum":["active","paused","deleted"]},"prompt":{"type":["string","null"],"description":"Natural language prompt used for filter generation (if applicable)"},"filters":{"type":"object","description":"The active filter configuration (structure varies by subscription type)","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"Webhook delivery URL"},"intervalSignalLimit":{"type":"integer","description":"Maximum signals per polling interval"},"interval":{"type":"string","description":"Polling interval","enum":["daily","weekly"]},"createdAt":{"type":"string","format":"date-time","description":"When the subscription was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the subscription was last updated"}},"required":["id","organizationId","type","status","filters","webhookUrl","intervalSignalLimit","interval","createdAt","updatedAt"]}}}}
```

## The MarketSignalResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"MarketSignalResponse":{"type":"object","description":"A single market signal matched by a subscription","properties":{"id":{"type":"string","description":"Unique identifier for the signal"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription that matched this signal"},"jobPostingId":{"type":["string","null"],"description":"Job posting ID (for JOB_POSTS signals)"},"externalSignalId":{"type":["string","null"],"description":"External identifier from the data source (e.g., LinkedIn post URN, EDGAR filing ID)"},"payload":{"type":["object","null"],"description":"Raw payload from the data source. Structure varies by subscription type:\n\n**JOB_POSTS**: Job posting details (title, company, location, description, URL, etc.)\n**LINKEDIN_POST**: Post content, author info, engagement metrics, company data\n**FUND_RAISED / RECENT_INVESTMENT / IPO**: Announcement details, amounts, companies involved\n","additionalProperties":true},"confidenceScore":{"type":["number","null"],"format":"float","minimum":0,"maximum":1,"description":"AI confidence score for the signal's relevance (0-1)"},"status":{"type":"string","description":"Delivery status of the signal","enum":["pending","delivered","skipped"]},"publishedAt":{"type":["string","null"],"format":"date-time","description":"When the original content was published at the source"},"createdAt":{"type":"string","format":"date-time","description":"When the signal was matched and stored"},"deliveredAt":{"type":["string","null"],"format":"date-time","description":"When the signal was delivered via webhook (null if not yet delivered)"}},"required":["id","subscriptionId","status","createdAt"]}}}}
```

## The MarketSignalListResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"MarketSignalListResponse":{"type":"object","description":"Paginated list of market signals for a subscription","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MarketSignalResponse"}},"total":{"type":"integer","description":"Total number of signals for the subscription"},"limit":{"type":"integer","description":"Maximum signals per page"},"offset":{"type":"integer","description":"Number of signals skipped"}},"required":["items","total","limit","offset"]},"MarketSignalResponse":{"type":"object","description":"A single market signal matched by a subscription","properties":{"id":{"type":"string","description":"Unique identifier for the signal"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription that matched this signal"},"jobPostingId":{"type":["string","null"],"description":"Job posting ID (for JOB_POSTS signals)"},"externalSignalId":{"type":["string","null"],"description":"External identifier from the data source (e.g., LinkedIn post URN, EDGAR filing ID)"},"payload":{"type":["object","null"],"description":"Raw payload from the data source. Structure varies by subscription type:\n\n**JOB_POSTS**: Job posting details (title, company, location, description, URL, etc.)\n**LINKEDIN_POST**: Post content, author info, engagement metrics, company data\n**FUND_RAISED / RECENT_INVESTMENT / IPO**: Announcement details, amounts, companies involved\n","additionalProperties":true},"confidenceScore":{"type":["number","null"],"format":"float","minimum":0,"maximum":1,"description":"AI confidence score for the signal's relevance (0-1)"},"status":{"type":"string","description":"Delivery status of the signal","enum":["pending","delivered","skipped"]},"publishedAt":{"type":["string","null"],"format":"date-time","description":"When the original content was published at the source"},"createdAt":{"type":"string","format":"date-time","description":"When the signal was matched and stored"},"deliveredAt":{"type":["string","null"],"format":"date-time","description":"When the signal was delivered via webhook (null if not yet delivered)"}},"required":["id","subscriptionId","status","createdAt"]}}}}
```

## The ConnectorsListResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ConnectorsListResponse":{"type":"object","properties":{"connectors":{"type":"array","description":"List of connectors configured for the organization","items":{"$ref":"#/components/schemas/Connector"}}},"required":["connectors"]},"Connector":{"type":"object","description":"A data integration connector and its current connection status","properties":{"source":{"type":"string","description":"The connector type identifier","enum":["salesNavigator","hubspotApp"]},"status":{"type":"string","description":"The current connection status of the connector","enum":["connected","disconnected","needs-authentication","ready-to-connect","error"]}},"required":["source","status"]}}}}
```

## The Connector object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Connector":{"type":"object","description":"A data integration connector and its current connection status","properties":{"source":{"type":"string","description":"The connector type identifier","enum":["salesNavigator","hubspotApp"]},"status":{"type":"string","description":"The current connection status of the connector","enum":["connected","disconnected","needs-authentication","ready-to-connect","error"]}},"required":["source","status"]}}}}
```

## The CreateContactSignalRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateContactSignalRequest":{"type":"object","required":["contactProfileUrl","question"],"properties":{"contactProfileUrl":{"type":"string","format":"uri","description":"The contact profile URL to research (e.g., \"https://linkedin.com/in/johndoe\")","minLength":1,"maxLength":500},"question":{"type":"string","description":"The research question to ask about the contact","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contacts_generation","contact_posts","contact_engagements","json_schema"],"default":"open_text"},"outputSchema":{"type":"object","description":"JSON Schema defining the expected output structure. Required when answerType is \"json_schema\".\nSee CreateSignalRequest.outputSchema for full documentation.\n","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"Optional webhook URL to receive notifications when processing completes.\nWebhooks are only sent for freshly processed signals — cached results do not trigger webhooks.\nSet `forceRefresh: true` to bypass the cache and ensure webhook delivery.\n","maxLength":2048},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType (same structure as company signals)","additionalProperties":true},"signalTemplateId":{"type":"string","format":"uuid","description":"Optional signal template ID to use"},"connectors":{"type":"object","description":"Connector configuration for signal generation","properties":{"salesNavigator":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"string","enum":["required","preferred","off"],"default":"preferred","description":"Controls Sales Navigator usage during signal generation:\n- **required**: Fail request if Sales Navigator unavailable (rate limited/disconnected)\n- **preferred**: Attempt Sales Navigator, degrade gracefully if unavailable (default)\n- **off**: Do not attempt Sales Navigator\n\nNote: Contact signals always require LinkedIn, so this setting is accepted but ignored for contact signals.\n"}}}}},"verificationMode":{"type":"string","description":"Controls how strictly Saber verifies answers before responding.\n\n- **strict**: Only returns answers backed by verified sources (primary or trusted secondary sources). Returns null when information is unavailable.\n- **lenient**: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.\n","enum":["strict","lenient"],"default":"strict"},"forceRefresh":{"type":"boolean","description":"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":false}},"additionalProperties":false}}}}
```

## The CreateSignalBatchRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateSignalBatchRequest":{"type":"object","required":["signals","domains"],"properties":{"signals":{"type":"array","description":"Array of signals to create. Each signal will be combined with each domain\nusing Cartesian product logic. You can either:\n- Provide inline signal configuration with `question` and optional fields (quick ad-hoc research)\n- Use `templateId` to reference a pre-created template (recommended for reusability)\n","minItems":1,"items":{"type":"object","properties":{"question":{"type":"string","description":"The research question. Required if templateId is not provided.\nIf templateId is provided, this overrides the template's question.\n","minLength":1,"maxLength":500},"templateId":{"type":"string","format":"uuid","description":"ID of the signal template to use. If provided, other fields (except question) use template settings."},"answerType":{"type":"string","description":"Expected answer format (only used for inline signals without templateId)","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","json_schema"]},"outputSchema":{"type":"object","description":"JSON Schema for custom output (only used when answerType is json_schema)","additionalProperties":true},"weight":{"type":"string","description":"Signal importance (only used for inline signals without templateId)","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria for the answer (only used for inline signals without templateId)","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"URL to receive a webhook notification when the signal completes processing.\nWebhooks are only sent for freshly processed signals — cached results do not trigger webhooks.\nSet `forceRefresh: true` to bypass the cache and ensure webhook delivery.\n","maxLength":2048},"forceRefresh":{"type":"boolean","description":"When true, bypasses the signal cache and forces fresh processing.\nThis ensures the webhook is delivered even if a cached result exists.\n","default":false}}}},"domains":{"type":"array","description":"Array of company domains to research. Each domain will be combined with each signal template\nusing Cartesian product logic. The total resulting signals (len(signals) × len(domains)) must not exceed 100.\n","minItems":1,"maxItems":100,"items":{"type":"string","description":"Company domain (e.g., \"acme.com\")","pattern":"^[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])?)*$","minLength":1,"maxLength":253}},"generateSummaryOnComplete":{"type":"boolean","description":"Whether to automatically generate a summary when all signals in the batch are completed.\nWhen set to `true`, a summary will be automatically generated for each unique domain in the batch\nonce all signals for that domain have completed processing.\n","default":false},"async":{"type":"boolean","description":"When `true`, enables async processing with a higher limit of 20,000 signals.\nReturns a `batchId` for tracking instead of inline results.\nThe response shape differs from sync mode — returns `{ batchId, submittedAt, totalSignals, status, async }`.\nUse `/v1/companies/signals/batches/status?domain=...` to poll for progress.\n","default":false}},"additionalProperties":false}}}}
```

## The SignalBatchResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SignalBatchResponse":{"type":"object","properties":{"submittedAt":{"type":"string","format":"date-time","description":"Timestamp when the batch was submitted"},"totalSignals":{"type":"integer","description":"Total number of signals created from Cartesian product (templates × domains)","minimum":0,"maximum":100},"accepted":{"type":"integer","description":"Number of signals successfully scheduled for processing","minimum":0},"rejected":{"type":"integer","description":"Number of signals that failed to be scheduled","minimum":0},"results":{"type":"array","description":"Array of results for each signal in the batch, ordered by Cartesian product expansion","items":{"$ref":"#/components/schemas/SignalResponse"}}},"required":["submittedAt","totalSignals","accepted","rejected","results"]},"SignalResponse":{"description":"Polymorphic signal response (company or contact)","oneOf":[{"$ref":"#/components/schemas/CompanySignalResponse"},{"$ref":"#/components/schemas/ContactSignalResponse"}],"discriminator":{"propertyName":"signalType","mapping":{"COMPANY":"#/components/schemas/CompanySignalResponse","CONTACT":"#/components/schemas/ContactSignalResponse"}}},"CompanySignalResponse":{"description":"Response for company signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["COMPANY"]},"domain":{"type":"string","description":"The domain that was researched"}},"required":["domain"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]},"ContactSignalResponse":{"description":"Response for contact signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["CONTACT"]},"contactProfileUrl":{"type":"string","description":"LinkedIn profile URL"}},"required":["contactProfileUrl"]}]}}}}
```

## The AsyncBatchResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"AsyncBatchResponse":{"type":"object","description":"Response returned when `async: true` is set in the batch request","properties":{"batchId":{"type":"string","format":"uuid","description":"Unique identifier for the async batch. Use this to track progress."},"submittedAt":{"type":"string","format":"date-time","description":"Timestamp when the batch was accepted"},"totalSignals":{"type":"integer","description":"Total number of signals that will be processed","minimum":1,"maximum":20000},"status":{"type":"string","description":"Status of the batch submission","enum":["accepted"]},"async":{"type":"boolean","description":"Always `true` for async batch responses"}},"required":["batchId","submittedAt","totalSignals","status","async"]}}}}
```

## The CreateSignalRequest object

````json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateSignalRequest":{"type":"object","required":["domain","question"],"properties":{"domain":{"type":"string","description":"The company domain to research (e.g., \"acme.com\")","pattern":"^[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])?)*$","minLength":1,"maxLength":253},"question":{"type":"string","description":"The research question to ask about the company","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contacts_generation","contact_posts","contact_engagements","json_schema"],"default":"open_text"},"outputSchema":{"type":"object","description":"JSON Schema defining the expected output structure. Required when answerType is \"json_schema\".\nThe AI will generate data conforming to this schema.\n\n**Supported JSON Schema features:**\n- `type`: object, array, string, number, integer, boolean, null\n- `properties`: Define object properties\n- `required`: List of required property names\n- `items`: Schema for array items\n- `enum`: Enumeration of allowed values\n- `description`: Property descriptions (helps AI generate better data)\n\n**Limitations:**\n- Maximum 100 total properties\n- Maximum 5 levels of nesting\n- `anyOf`, `oneOf`, `allOf` are not supported\n- `$ref` only supports self-references for recursive schemas\n","additionalProperties":true},"webhookUrl":{"type":"string","format":"uri","description":"Optional webhook URL to receive notifications when processing completes.\nWebhooks are only sent for freshly processed signals — cached results do not trigger webhooks.\nSet `forceRefresh: true` to bypass the cache and ensure webhook delivery.\n","maxLength":2048},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType. The structure must match the answerType specified.\n\nFor boolean answerType:\n```json\n{\n  \"yes\": \"good\",\n  \"no\": \"disqualified\"\n}\n```\n\nFor number, percentage, or currency answerType:\n```json\n{\n  \"ranges\": [\n    { \"rangeStart\": 0, \"rangeEnd\": 100, \"answerValue\": \"neutral\" },\n    { \"rangeStart\": 101, \"rangeEnd\": 1000, \"answerValue\": \"good\" }\n  ]\n}\n```\n\nFor list answerType:\n```json\n{\n  \"choices\": {\n    \"salesforce\": { \"answerValue\": \"good\", \"label\": \"Salesforce\" },\n    \"hubspot\": { \"answerValue\": \"neutral\", \"label\": \"HubSpot\" },\n    \"none\": { \"answerValue\": \"disqualified\", \"label\": \"No CRM\" }\n  }\n}\n```\n\nValid answerValue options (from worst to best):\n- disqualified: Answer indicates a deal-breaker or disqualifying factor\n- poor: Answer indicates a weak fit\n- neutral: Answer is acceptable but not ideal\n- good: Answer indicates a strong fit\n- excellent: Answer indicates an exceptional fit\n","additionalProperties":true},"signalTemplateId":{"type":"string","format":"uuid","description":"Optional signal template ID to use. When provided, the template configuration (question, answerType, weight, qualificationCriteria) will be used.\nThe system always resolves to the latest active version of the template.\nOnly the domain parameter is required when using a template.\n"},"forceRefresh":{"type":"boolean","description":"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":false},"connectors":{"type":"object","description":"Connector configuration for signal generation","properties":{"salesNavigator":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"string","enum":["required","preferred","off"],"default":"preferred","description":"Controls Sales Navigator usage during signal generation:\n- **required**: Fail request if Sales Navigator unavailable (rate limited/disconnected)\n- **preferred**: Attempt Sales Navigator, degrade gracefully if unavailable (default)\n- **off**: Do not attempt Sales Navigator\n"}}}}},"verificationMode":{"type":"string","description":"Controls how strictly Saber verifies answers before responding.\n\n- **strict**: Only returns answers backed by verified sources (primary or trusted secondary sources). Returns null when information is unavailable.\n- **lenient**: Allows logical inference and best-effort estimates when direct evidence is missing. Uses industry benchmarks, logical correlates, and quantitative metrics.\n","enum":["strict","lenient"],"default":"strict"}},"additionalProperties":false}}}}
````

## The BaseSignalResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]}}}}
```

## The CompanySignalResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanySignalResponse":{"description":"Response for company signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["COMPANY"]},"domain":{"type":"string","description":"The domain that was researched"}},"required":["domain"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]}}}}
```

## The ContactSignalResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactSignalResponse":{"description":"Response for contact signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["CONTACT"]},"contactProfileUrl":{"type":"string","description":"LinkedIn profile URL"}},"required":["contactProfileUrl"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]}}}}
```

## The SignalResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SignalResponse":{"description":"Polymorphic signal response (company or contact)","oneOf":[{"$ref":"#/components/schemas/CompanySignalResponse"},{"$ref":"#/components/schemas/ContactSignalResponse"}],"discriminator":{"propertyName":"signalType","mapping":{"COMPANY":"#/components/schemas/CompanySignalResponse","CONTACT":"#/components/schemas/ContactSignalResponse"}}},"CompanySignalResponse":{"description":"Response for company signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["COMPANY"]},"domain":{"type":"string","description":"The domain that was researched"}},"required":["domain"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]},"ContactSignalResponse":{"description":"Response for contact signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["CONTACT"]},"contactProfileUrl":{"type":"string","description":"LinkedIn profile URL"}},"required":["contactProfileUrl"]}]}}}}
```

## The SignalDetailResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SignalDetailResponse":{"allOf":[{"$ref":"#/components/schemas/SignalResponse"},{"type":"object","properties":{"completedAt":{"type":"string","format":"date-time","description":"When the signal processing completed (only present when status is completed)"},"answer":{"oneOf":[{"$ref":"#/components/schemas/Answer"},{"type":"null"}],"description":"The AI-generated answer (null when status is not completed)"},"reasoning":{"type":"string","description":"Detailed reasoning for the answer (only present when status is completed)"},"confidence":{"type":"number","format":"float","minimum":0,"maximum":1,"description":"Confidence score for the answer (0-1, only present when status is completed)"},"sources":{"type":"array","description":"Sources used to generate the answer (only present when status is completed, maximum 20 sources)","maxItems":20,"items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string"},"snippet":{"type":"string"}}}},"metadata":{"type":"object","description":"Additional metadata about the processing (only present when status is completed)","additionalProperties":true,"properties":{"companyName":{"type":"string","description":"Company name (for company signals)"},"processingTimeMs":{"type":"number","description":"Processing time in milliseconds"},"connectors":{"type":"object","description":"Connector status information","properties":{"salesNavigator":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ok","degraded"],"description":"Connector status for this request"},"reason":{"type":"string","enum":["rate_limited","disconnected"],"description":"Reason for degraded status (only present when status is degraded)"}}}}},"linkedInContext":{"$ref":"#/components/schemas/LinkedInContext"}}},"error":{"type":"string","description":"Error message (only present when status is failed)"},"errorCode":{"type":"string","description":"Machine-readable error code (only present when status is failed)","enum":["LINKEDIN_RATE_LIMIT_EXCEEDED","LINKEDIN_CONNECTOR_REQUIRED","CONNECTOR_UNAVAILABLE","VALIDATION_ERROR"]},"errorAction":{"type":"string","description":"Suggested action to resolve the error (only present when status is failed)"},"changeContext":{"$ref":"#/components/schemas/ChangeContext","description":"Information about changes between signal versions (only present when status is completed and a previous version exists)"},"verificationMode":{"type":"string","description":"Verification mode used for signal generation","enum":["strict","lenient"]},"company":{"$ref":"#/components/schemas/CompanyFirmographics","description":"Company firmographic data (only present in webhook payloads for company signals)"}}}]},"SignalResponse":{"description":"Polymorphic signal response (company or contact)","oneOf":[{"$ref":"#/components/schemas/CompanySignalResponse"},{"$ref":"#/components/schemas/ContactSignalResponse"}],"discriminator":{"propertyName":"signalType","mapping":{"COMPANY":"#/components/schemas/CompanySignalResponse","CONTACT":"#/components/schemas/ContactSignalResponse"}}},"CompanySignalResponse":{"description":"Response for company signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["COMPANY"]},"domain":{"type":"string","description":"The domain that was researched"}},"required":["domain"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]},"ContactSignalResponse":{"description":"Response for contact signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["CONTACT"]},"contactProfileUrl":{"type":"string","description":"LinkedIn profile URL"}},"required":["contactProfileUrl"]}]},"Answer":{"description":"Discriminated union representing different answer types.\nThe 'type' field indicates which specific answer format is used.\n","oneOf":[{"type":"object","required":["type","open_text"],"properties":{"type":{"type":"string","enum":["open_text"],"description":"The answer type discriminator"},"open_text":{"$ref":"#/components/schemas/OpenTextAnswer"}}},{"type":"object","required":["type","number"],"properties":{"type":{"type":"string","enum":["number"],"description":"The answer type discriminator"},"number":{"$ref":"#/components/schemas/NumberAnswer"}}},{"type":"object","required":["type","boolean"],"properties":{"type":{"type":"string","enum":["boolean"],"description":"The answer type discriminator"},"boolean":{"$ref":"#/components/schemas/BooleanAnswer"}}},{"type":"object","required":["type","list"],"properties":{"type":{"type":"string","enum":["list"],"description":"The answer type discriminator"},"list":{"$ref":"#/components/schemas/ListAnswer"}}},{"type":"object","required":["type","percentage"],"properties":{"type":{"type":"string","enum":["percentage"],"description":"The answer type discriminator"},"percentage":{"$ref":"#/components/schemas/PercentageAnswer"}}},{"type":"object","required":["type","currency"],"properties":{"type":{"type":"string","enum":["currency"],"description":"The answer type discriminator"},"currency":{"$ref":"#/components/schemas/CurrencyAnswer"}}},{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["url"],"description":"The answer type discriminator"},"url":{"$ref":"#/components/schemas/URLAnswer"}}},{"type":"object","required":["type","contacts"],"properties":{"type":{"type":"string","enum":["contacts"],"description":"The answer type discriminator"},"contacts":{"$ref":"#/components/schemas/ContactsAnswer"}}},{"type":"object","required":["type","contactPosts"],"properties":{"type":{"type":"string","enum":["contact_posts"],"description":"The answer type discriminator"},"contactPosts":{"$ref":"#/components/schemas/ContactPostsAnswer"}}},{"type":"object","required":["type","contactEngagements"],"properties":{"type":{"type":"string","enum":["contact_engagements"],"description":"The answer type discriminator"},"contactEngagements":{"$ref":"#/components/schemas/ContactEngagementsAnswer"}}},{"type":"object","required":["type","jsonSchema"],"properties":{"type":{"type":"string","enum":["json_schema"],"description":"The answer type discriminator"},"jsonSchema":{"$ref":"#/components/schemas/JSONSchemaAnswer"}}}],"discriminator":{"propertyName":"type","mapping":{"open_text":"#/components/schemas/OpenTextAnswer","number":"#/components/schemas/NumberAnswer","boolean":"#/components/schemas/BooleanAnswer","list":"#/components/schemas/ListAnswer","percentage":"#/components/schemas/PercentageAnswer","currency":"#/components/schemas/CurrencyAnswer","url":"#/components/schemas/URLAnswer","contacts":"#/components/schemas/ContactsAnswer","contact_posts":"#/components/schemas/ContactPostsAnswer","contact_engagements":"#/components/schemas/ContactEngagementsAnswer","json_schema":"#/components/schemas/JSONSchemaAnswer"}}},"OpenTextAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"Free-form text response"}}},"NumberAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"number","description":"Numeric value"}}},"BooleanAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"boolean","description":"True or false value"}}},"ListAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of string items (maximum 500 items)","maxItems":500,"items":{"type":"string"}}}},"PercentageAnswer":{"type":"object","required":["value","unit"],"properties":{"value":{"type":"number","description":"Percentage value"},"unit":{"type":"string","description":"Unit symbol (typically \"%\")"}}},"CurrencyAnswer":{"type":"object","required":["value","currency"],"properties":{"value":{"type":"number","description":"Monetary amount"},"currency":{"type":"string","description":"ISO 4217 currency code"}}},"URLAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","format":"uri","description":"Valid URL string"}}},"ContactsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of contact objects with detailed information (maximum 100 contacts)","maxItems":100,"items":{"$ref":"#/components/schemas/Contact"}}}},"Contact":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Professional headline"},"summary":{"type":"string","description":"Professional summary"},"positions":{"type":"array","description":"Array of current and past positions","items":{"$ref":"#/components/schemas/ContactPosition"}},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Avatar/profile picture URL"},"location":{"type":"string","description":"Location of the contact"},"followerCount":{"type":"integer","description":"Number of followers on LinkedIn"},"education":{"type":"array","description":"Array of education entries","items":{"$ref":"#/components/schemas/Education"}}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactPostsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of post objects with detailed information","items":{"$ref":"#/components/schemas/Post"}}}},"Post":{"type":"object","required":["postUrl"],"properties":{"postUrl":{"type":"string","format":"uri","description":"LinkedIn post URL (identity key for tracking changes)"},"postText":{"type":"string","description":"Text content of the post"},"activityUrn":{"type":"string","description":"LinkedIn activity URN"},"publishedAt":{"type":"string","description":"Publication date"},"postType":{"type":"string","enum":["original","shared","repost"],"description":"Type of post"},"author":{"$ref":"#/components/schemas/PostAuthor"},"engagement":{"$ref":"#/components/schemas/PostEngagement"},"subject":{"type":"string","description":"AI-generated one-sentence summary of the post"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}},"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}},"ContactEngagementsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of engagement objects (maximum 100 engagements)","maxItems":100,"items":{"$ref":"#/components/schemas/ContactEngagement"}}}},"ContactEngagement":{"type":"object","required":["postUrl","engagementType"],"properties":{"postUrl":{"type":"string","format":"uri","description":"URL of the LinkedIn post where the engagement occurred"},"postAuthor":{"$ref":"#/components/schemas/PostAuthor","description":"Author of the original post"},"postText":{"type":"string","description":"Snippet of post content"},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 post publication timestamp"},"engagementType":{"type":"string","enum":["comment","reaction"],"description":"Type of engagement"},"engagementDate":{"type":"string","format":"date-time","description":"ISO 8601 engagement timestamp"},"commentText":{"type":"string","description":"Text of comment (if engagementType is comment)"},"reactionText":{"type":"string","description":"Reaction text extracted from LinkedIn header (e.g., \"John celebrates this\", \"John likes this\", \"John finds this insightful\")"}}},"JSONSchemaAnswer":{"type":"object","description":"The generated data conforming to the user-provided JSON Schema (payload at answer.jsonSchema directly)","additionalProperties":true},"LinkedInContext":{"type":"object","description":"LinkedIn capability usage context for a signal (only present when LinkedIn tools were involved)","required":["linkedInToolsUsed","mode","capabilities"],"properties":{"linkedInToolsUsed":{"type":"boolean","description":"Whether any LinkedIn tools were used"},"mode":{"type":"string","enum":["required","preferred","off"],"description":"LinkedIn connector mode used"},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/LinkedInCapabilityStatus"},"description":"Per-capability status"},"degraded":{"type":"boolean","description":"Whether the signal was degraded due to LinkedIn limitations"}}},"LinkedInCapabilityStatus":{"type":"object","description":"Status of a single LinkedIn capability during signal generation","required":["capability","used"],"properties":{"capability":{"type":"string","enum":["contact_search","profile_enrichment","company_data","company_search","activity_tracking","post_search"],"description":"LinkedIn capability name"},"used":{"type":"boolean","description":"Whether this capability was used during signal generation"},"rateLimited":{"type":"boolean","description":"Whether this capability was rate-limited"}}},"ChangeContext":{"type":"object","description":"Information about changes between signal versions. The changeType field uses graduated change types: INITIAL for first versions, NO_CHANGE for identical or semantically equivalent results, and MINOR_CHANGE/MAJOR_CHANGE for graduated severity (replacing the legacy binary CHANGED type). Subscribers can filter broadly on changedFields (any event on a field) or precisely on addedFields/updatedFields/removedFields without inspecting the delta structure.\n","required":["changeType","changedFields","addedFields","updatedFields","removedFields"],"properties":{"changeType":{"$ref":"#/components/schemas/ChangeType"},"changeDelta":{"oneOf":[{"$ref":"#/components/schemas/ChangeDelta"},{"type":"null"}],"description":"Structured delta of the change (structure varies by answer type)"},"previousSignalId":{"type":["string","null"],"description":"ID of the previous signal version","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"changedFields":{"type":"array","items":{"type":"string"},"description":"Union of addedFields + updatedFields + removedFields. Use this to subscribe to any event on a field regardless of change type (e.g. changedFields.includes(\"headline\")). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"addedFields":{"type":"array","items":{"type":"string"},"description":"Fields where new values appeared (new contacts/posts, new certifications, etc.). Entity-level additions use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"updatedFields":{"type":"array","items":{"type":"string"},"description":"Fields where existing values were modified (headline changed, engagement updated, etc.). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"removedFields":{"type":"array","items":{"type":"string"},"description":"Fields where values were removed (contacts left, skills removed, etc.). Entity-level removals use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"}}},"ChangeType":{"type":"string","description":"Type of change detected between signal versions. INITIAL = first signal version, NO_CHANGE = identical or semantically equivalent to previous, MINOR_CHANGE = low-impact semantic change, CHANGED = significant change (legacy, pre-graduated), MAJOR_CHANGE = high-impact semantic change.\n","enum":["INITIAL","NO_CHANGE","CHANGED","MINOR_CHANGE","MAJOR_CHANGE"]},"ChangeDelta":{"type":"object","description":"Structured delta of the change between signal versions.\nThe structure varies based on the answer type:\n- LIST: {type: \"LIST\", added: string[], removed: string[]}\n- NUMBER: {type: \"NUMBER\", previous: number, current: number, change: number}\n- CURRENCY: {type: \"CURRENCY\", previous: number | object, current: number | object, currency?: string, change: number | string}\n- PERCENTAGE: {type: \"PERCENTAGE\", previous: number, current: number, unit: string, change: number}\n- BOOLEAN: {type: \"BOOLEAN\", previous: boolean, current: boolean}\n- GENERIC: {type: \"GENERIC\", previous: Answer | null, current: Answer | null}\n- SEMANTIC: {type: \"SEMANTIC\", previous: Answer | null, current: Answer | null, similarityScore: number}\n- SEMANTIC_LIST: {type: \"SEMANTIC_LIST\", added: string[], removed: string[], matched: [{previous: string, current: string, similarityScore: number}], similarityScore: number}\n- CONTACTS: {type: \"CONTACTS\", added: Contact[], removed: Contact[], updated: [{previous: Contact, current: Contact, fieldChanges: [...]}]}\n- CONTACT_POSTS: {type: \"CONTACT_POSTS\", added: Post[], removed: Post[], updated: [{previous: Post, current: Post, fieldChanges: [...], engagementGrowth?: EngagementGrowth}]}\n","additionalProperties":true},"CompanyFirmographics":{"type":"object","description":"Company firmographic and LinkedIn enrichment data included in webhook payloads","properties":{"id":{"type":"string","description":"Company ID"},"name":{"type":"string","description":"Company name"},"domain":{"type":"string","description":"Company domain"},"industry":{"type":"string","description":"Industry classification"},"website":{"type":"string","description":"Company website URL"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type (e.g. private, public)"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City of headquarters"},"state":{"type":"string","description":"State or region of headquarters"},"countryCode":{"type":"string","description":"ISO country code"},"handle":{"type":"string","description":"Company handle/slug"},"linkedInId":{"type":"integer","description":"LinkedIn numeric company ID"},"linkedInUrl":{"type":"string","format":"uri","description":"LinkedIn company page URL"},"linkedInFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"employeeCount":{"type":"integer","description":"Approximate employee count from LinkedIn"},"description":{"type":"string","description":"Company description"},"logoUrl":{"type":"string","format":"uri","description":"Company logo URL"}}}}}}
```

## The CompanyFirmographics object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyFirmographics":{"type":"object","description":"Company firmographic and LinkedIn enrichment data included in webhook payloads","properties":{"id":{"type":"string","description":"Company ID"},"name":{"type":"string","description":"Company name"},"domain":{"type":"string","description":"Company domain"},"industry":{"type":"string","description":"Industry classification"},"website":{"type":"string","description":"Company website URL"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type (e.g. private, public)"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City of headquarters"},"state":{"type":"string","description":"State or region of headquarters"},"countryCode":{"type":"string","description":"ISO country code"},"handle":{"type":"string","description":"Company handle/slug"},"linkedInId":{"type":"integer","description":"LinkedIn numeric company ID"},"linkedInUrl":{"type":"string","format":"uri","description":"LinkedIn company page URL"},"linkedInFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"employeeCount":{"type":"integer","description":"Approximate employee count from LinkedIn"},"description":{"type":"string","description":"Company description"},"logoUrl":{"type":"string","format":"uri","description":"Company logo URL"}}}}}}
```

## The Answer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Answer":{"description":"Discriminated union representing different answer types.\nThe 'type' field indicates which specific answer format is used.\n","oneOf":[{"type":"object","required":["type","open_text"],"properties":{"type":{"type":"string","enum":["open_text"],"description":"The answer type discriminator"},"open_text":{"$ref":"#/components/schemas/OpenTextAnswer"}}},{"type":"object","required":["type","number"],"properties":{"type":{"type":"string","enum":["number"],"description":"The answer type discriminator"},"number":{"$ref":"#/components/schemas/NumberAnswer"}}},{"type":"object","required":["type","boolean"],"properties":{"type":{"type":"string","enum":["boolean"],"description":"The answer type discriminator"},"boolean":{"$ref":"#/components/schemas/BooleanAnswer"}}},{"type":"object","required":["type","list"],"properties":{"type":{"type":"string","enum":["list"],"description":"The answer type discriminator"},"list":{"$ref":"#/components/schemas/ListAnswer"}}},{"type":"object","required":["type","percentage"],"properties":{"type":{"type":"string","enum":["percentage"],"description":"The answer type discriminator"},"percentage":{"$ref":"#/components/schemas/PercentageAnswer"}}},{"type":"object","required":["type","currency"],"properties":{"type":{"type":"string","enum":["currency"],"description":"The answer type discriminator"},"currency":{"$ref":"#/components/schemas/CurrencyAnswer"}}},{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["url"],"description":"The answer type discriminator"},"url":{"$ref":"#/components/schemas/URLAnswer"}}},{"type":"object","required":["type","contacts"],"properties":{"type":{"type":"string","enum":["contacts"],"description":"The answer type discriminator"},"contacts":{"$ref":"#/components/schemas/ContactsAnswer"}}},{"type":"object","required":["type","contactPosts"],"properties":{"type":{"type":"string","enum":["contact_posts"],"description":"The answer type discriminator"},"contactPosts":{"$ref":"#/components/schemas/ContactPostsAnswer"}}},{"type":"object","required":["type","contactEngagements"],"properties":{"type":{"type":"string","enum":["contact_engagements"],"description":"The answer type discriminator"},"contactEngagements":{"$ref":"#/components/schemas/ContactEngagementsAnswer"}}},{"type":"object","required":["type","jsonSchema"],"properties":{"type":{"type":"string","enum":["json_schema"],"description":"The answer type discriminator"},"jsonSchema":{"$ref":"#/components/schemas/JSONSchemaAnswer"}}}],"discriminator":{"propertyName":"type","mapping":{"open_text":"#/components/schemas/OpenTextAnswer","number":"#/components/schemas/NumberAnswer","boolean":"#/components/schemas/BooleanAnswer","list":"#/components/schemas/ListAnswer","percentage":"#/components/schemas/PercentageAnswer","currency":"#/components/schemas/CurrencyAnswer","url":"#/components/schemas/URLAnswer","contacts":"#/components/schemas/ContactsAnswer","contact_posts":"#/components/schemas/ContactPostsAnswer","contact_engagements":"#/components/schemas/ContactEngagementsAnswer","json_schema":"#/components/schemas/JSONSchemaAnswer"}}},"OpenTextAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"Free-form text response"}}},"NumberAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"number","description":"Numeric value"}}},"BooleanAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"boolean","description":"True or false value"}}},"ListAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of string items (maximum 500 items)","maxItems":500,"items":{"type":"string"}}}},"PercentageAnswer":{"type":"object","required":["value","unit"],"properties":{"value":{"type":"number","description":"Percentage value"},"unit":{"type":"string","description":"Unit symbol (typically \"%\")"}}},"CurrencyAnswer":{"type":"object","required":["value","currency"],"properties":{"value":{"type":"number","description":"Monetary amount"},"currency":{"type":"string","description":"ISO 4217 currency code"}}},"URLAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","format":"uri","description":"Valid URL string"}}},"ContactsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of contact objects with detailed information (maximum 100 contacts)","maxItems":100,"items":{"$ref":"#/components/schemas/Contact"}}}},"Contact":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Professional headline"},"summary":{"type":"string","description":"Professional summary"},"positions":{"type":"array","description":"Array of current and past positions","items":{"$ref":"#/components/schemas/ContactPosition"}},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Avatar/profile picture URL"},"location":{"type":"string","description":"Location of the contact"},"followerCount":{"type":"integer","description":"Number of followers on LinkedIn"},"education":{"type":"array","description":"Array of education entries","items":{"$ref":"#/components/schemas/Education"}}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactPostsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of post objects with detailed information","items":{"$ref":"#/components/schemas/Post"}}}},"Post":{"type":"object","required":["postUrl"],"properties":{"postUrl":{"type":"string","format":"uri","description":"LinkedIn post URL (identity key for tracking changes)"},"postText":{"type":"string","description":"Text content of the post"},"activityUrn":{"type":"string","description":"LinkedIn activity URN"},"publishedAt":{"type":"string","description":"Publication date"},"postType":{"type":"string","enum":["original","shared","repost"],"description":"Type of post"},"author":{"$ref":"#/components/schemas/PostAuthor"},"engagement":{"$ref":"#/components/schemas/PostEngagement"},"subject":{"type":"string","description":"AI-generated one-sentence summary of the post"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}},"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}},"ContactEngagementsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of engagement objects (maximum 100 engagements)","maxItems":100,"items":{"$ref":"#/components/schemas/ContactEngagement"}}}},"ContactEngagement":{"type":"object","required":["postUrl","engagementType"],"properties":{"postUrl":{"type":"string","format":"uri","description":"URL of the LinkedIn post where the engagement occurred"},"postAuthor":{"$ref":"#/components/schemas/PostAuthor","description":"Author of the original post"},"postText":{"type":"string","description":"Snippet of post content"},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 post publication timestamp"},"engagementType":{"type":"string","enum":["comment","reaction"],"description":"Type of engagement"},"engagementDate":{"type":"string","format":"date-time","description":"ISO 8601 engagement timestamp"},"commentText":{"type":"string","description":"Text of comment (if engagementType is comment)"},"reactionText":{"type":"string","description":"Reaction text extracted from LinkedIn header (e.g., \"John celebrates this\", \"John likes this\", \"John finds this insightful\")"}}},"JSONSchemaAnswer":{"type":"object","description":"The generated data conforming to the user-provided JSON Schema (payload at answer.jsonSchema directly)","additionalProperties":true}}}}
```

## The OpenTextAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"OpenTextAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"Free-form text response"}}}}}}
```

## The NumberAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"NumberAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"number","description":"Numeric value"}}}}}}
```

## The BooleanAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"BooleanAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"boolean","description":"True or false value"}}}}}}
```

## The ListAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ListAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of string items (maximum 500 items)","maxItems":500,"items":{"type":"string"}}}}}}}
```

## The PercentageAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"PercentageAnswer":{"type":"object","required":["value","unit"],"properties":{"value":{"type":"number","description":"Percentage value"},"unit":{"type":"string","description":"Unit symbol (typically \"%\")"}}}}}}
```

## The CurrencyAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CurrencyAnswer":{"type":"object","required":["value","currency"],"properties":{"value":{"type":"number","description":"Monetary amount"},"currency":{"type":"string","description":"ISO 4217 currency code"}}}}}}
```

## The URLAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"URLAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","format":"uri","description":"Valid URL string"}}}}}}
```

## The JSONSchemaAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"JSONSchemaAnswer":{"type":"object","description":"The generated data conforming to the user-provided JSON Schema (payload at answer.jsonSchema directly)","additionalProperties":true}}}}
```

## The ContactsAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of contact objects with detailed information (maximum 100 contacts)","maxItems":100,"items":{"$ref":"#/components/schemas/Contact"}}}},"Contact":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Professional headline"},"summary":{"type":"string","description":"Professional summary"},"positions":{"type":"array","description":"Array of current and past positions","items":{"$ref":"#/components/schemas/ContactPosition"}},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Avatar/profile picture URL"},"location":{"type":"string","description":"Location of the contact"},"followerCount":{"type":"integer","description":"Number of followers on LinkedIn"},"education":{"type":"array","description":"Array of education entries","items":{"$ref":"#/components/schemas/Education"}}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}}}}}
```

## The Contact object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Contact":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Professional headline"},"summary":{"type":"string","description":"Professional summary"},"positions":{"type":"array","description":"Array of current and past positions","items":{"$ref":"#/components/schemas/ContactPosition"}},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Avatar/profile picture URL"},"location":{"type":"string","description":"Location of the contact"},"followerCount":{"type":"integer","description":"Number of followers on LinkedIn"},"education":{"type":"array","description":"Array of education entries","items":{"$ref":"#/components/schemas/Education"}}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}}}}}
```

## The ContactPosition object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}}}}}
```

## The ContactDate object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}}}}}
```

## The Education object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}}}}}
```

## The ContactPostsAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactPostsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of post objects with detailed information","items":{"$ref":"#/components/schemas/Post"}}}},"Post":{"type":"object","required":["postUrl"],"properties":{"postUrl":{"type":"string","format":"uri","description":"LinkedIn post URL (identity key for tracking changes)"},"postText":{"type":"string","description":"Text content of the post"},"activityUrn":{"type":"string","description":"LinkedIn activity URN"},"publishedAt":{"type":"string","description":"Publication date"},"postType":{"type":"string","enum":["original","shared","repost"],"description":"Type of post"},"author":{"$ref":"#/components/schemas/PostAuthor"},"engagement":{"$ref":"#/components/schemas/PostEngagement"},"subject":{"type":"string","description":"AI-generated one-sentence summary of the post"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}},"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}}}}}
```

## The ContactEngagementsAnswer object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactEngagementsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of engagement objects (maximum 100 engagements)","maxItems":100,"items":{"$ref":"#/components/schemas/ContactEngagement"}}}},"ContactEngagement":{"type":"object","required":["postUrl","engagementType"],"properties":{"postUrl":{"type":"string","format":"uri","description":"URL of the LinkedIn post where the engagement occurred"},"postAuthor":{"$ref":"#/components/schemas/PostAuthor","description":"Author of the original post"},"postText":{"type":"string","description":"Snippet of post content"},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 post publication timestamp"},"engagementType":{"type":"string","enum":["comment","reaction"],"description":"Type of engagement"},"engagementDate":{"type":"string","format":"date-time","description":"ISO 8601 engagement timestamp"},"commentText":{"type":"string","description":"Text of comment (if engagementType is comment)"},"reactionText":{"type":"string","description":"Reaction text extracted from LinkedIn header (e.g., \"John celebrates this\", \"John likes this\", \"John finds this insightful\")"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}}}}}
```

## The ContactEngagement object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactEngagement":{"type":"object","required":["postUrl","engagementType"],"properties":{"postUrl":{"type":"string","format":"uri","description":"URL of the LinkedIn post where the engagement occurred"},"postAuthor":{"$ref":"#/components/schemas/PostAuthor","description":"Author of the original post"},"postText":{"type":"string","description":"Snippet of post content"},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 post publication timestamp"},"engagementType":{"type":"string","enum":["comment","reaction"],"description":"Type of engagement"},"engagementDate":{"type":"string","format":"date-time","description":"ISO 8601 engagement timestamp"},"commentText":{"type":"string","description":"Text of comment (if engagementType is comment)"},"reactionText":{"type":"string","description":"Reaction text extracted from LinkedIn header (e.g., \"John celebrates this\", \"John likes this\", \"John finds this insightful\")"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}}}}}
```

## The Post object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Post":{"type":"object","required":["postUrl"],"properties":{"postUrl":{"type":"string","format":"uri","description":"LinkedIn post URL (identity key for tracking changes)"},"postText":{"type":"string","description":"Text content of the post"},"activityUrn":{"type":"string","description":"LinkedIn activity URN"},"publishedAt":{"type":"string","description":"Publication date"},"postType":{"type":"string","enum":["original","shared","repost"],"description":"Type of post"},"author":{"$ref":"#/components/schemas/PostAuthor"},"engagement":{"$ref":"#/components/schemas/PostEngagement"},"subject":{"type":"string","description":"AI-generated one-sentence summary of the post"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}},"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}}}}}
```

## The PostAuthor object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}}}}}
```

## The PostEngagement object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}}}}}
```

## The EngagementGrowth object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"EngagementGrowth":{"type":"object","description":"Engagement growth metrics computed during diff. Absolute deltas are always present\nwhen the metric exists on the current post. Growth percentages are only present when\nthe previous count was > 0 (undefined for zero-baseline virality detection).\n","properties":{"reactionDelta":{"type":"integer","description":"Absolute change in reaction count since last run"},"commentDelta":{"type":"integer","description":"Absolute change in comment count since last run"},"viewDelta":{"type":"integer","description":"Absolute change in view count since last run"},"reactionGrowthPct":{"type":"number","description":"Reaction growth percentage since last run (omitted when previous was 0)"},"commentGrowthPct":{"type":"number","description":"Comment growth percentage since last run (omitted when previous was 0)"},"viewGrowthPct":{"type":"number","description":"View growth percentage since last run (omitted when previous was 0)"}}}}}}
```

## The CreateCompanyListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateCompanyListRequest":{"type":"object","required":["name","filter"],"properties":{"name":{"type":"string","description":"A human-readable name for the list (1–200 characters)","minLength":1,"maxLength":200},"filter":{"$ref":"#/components/schemas/CompanyListFilters"}}},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The UpdateCompanyListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateCompanyListRequest":{"type":"object","required":["name","filter"],"properties":{"name":{"type":"string","description":"Updated name for the list (1–200 characters)","minLength":1,"maxLength":200},"filter":{"$ref":"#/components/schemas/CompanyListFilters"}}},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The HubSpotPropertyFilter object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"HubSpotPropertyFilter":{"type":"object","description":"A single HubSpot property filter used to select companies for import","required":["propertyName","operator"],"properties":{"propertyName":{"type":"string","description":"The HubSpot company property to filter on (e.g. `industry`, `city`, `hs_lead_status`)"},"operator":{"type":"string","description":"Comparison operator. Value-free operators (`HAS_PROPERTY`, `NOT_HAS_PROPERTY`)\ndo not require a `value` field. All others do.\n","enum":["EQ","NEQ","GT","GTE","LT","LTE","HAS_PROPERTY","NOT_HAS_PROPERTY","CONTAINS_TOKEN","NOT_CONTAINS_TOKEN"]},"value":{"type":"string","description":"The value to compare against. Required for all operators except `HAS_PROPERTY` and `NOT_HAS_PROPERTY`."}}}}}}
```

## The ImportCompanyListSource object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ImportCompanyListSource":{"type":"object","description":"Describes the external source to import companies from","required":["type","filter"],"properties":{"type":{"type":"string","description":"Import source type. Currently only `hubspot` is supported.","enum":["hubspot"]},"filter":{"$ref":"#/components/schemas/HubSpotPropertyFilter"}}},"HubSpotPropertyFilter":{"type":"object","description":"A single HubSpot property filter used to select companies for import","required":["propertyName","operator"],"properties":{"propertyName":{"type":"string","description":"The HubSpot company property to filter on (e.g. `industry`, `city`, `hs_lead_status`)"},"operator":{"type":"string","description":"Comparison operator. Value-free operators (`HAS_PROPERTY`, `NOT_HAS_PROPERTY`)\ndo not require a `value` field. All others do.\n","enum":["EQ","NEQ","GT","GTE","LT","LTE","HAS_PROPERTY","NOT_HAS_PROPERTY","CONTAINS_TOKEN","NOT_CONTAINS_TOKEN"]},"value":{"type":"string","description":"The value to compare against. Required for all operators except `HAS_PROPERTY` and `NOT_HAS_PROPERTY`."}}}}}}
```

## The ImportCompanyListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ImportCompanyListRequest":{"type":"object","required":["name","source"],"properties":{"name":{"type":"string","description":"A human-readable name for the imported list (1–200 characters)","minLength":1,"maxLength":200},"source":{"$ref":"#/components/schemas/ImportCompanyListSource"}}},"ImportCompanyListSource":{"type":"object","description":"Describes the external source to import companies from","required":["type","filter"],"properties":{"type":{"type":"string","description":"Import source type. Currently only `hubspot` is supported.","enum":["hubspot"]},"filter":{"$ref":"#/components/schemas/HubSpotPropertyFilter"}}},"HubSpotPropertyFilter":{"type":"object","description":"A single HubSpot property filter used to select companies for import","required":["propertyName","operator"],"properties":{"propertyName":{"type":"string","description":"The HubSpot company property to filter on (e.g. `industry`, `city`, `hs_lead_status`)"},"operator":{"type":"string","description":"Comparison operator. Value-free operators (`HAS_PROPERTY`, `NOT_HAS_PROPERTY`)\ndo not require a `value` field. All others do.\n","enum":["EQ","NEQ","GT","GTE","LT","LTE","HAS_PROPERTY","NOT_HAS_PROPERTY","CONTAINS_TOKEN","NOT_CONTAINS_TOKEN"]},"value":{"type":"string","description":"The value to compare against. Required for all operators except `HAS_PROPERTY` and `NOT_HAS_PROPERTY`."}}}}}}
```

## The ImportCompanyListResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ImportCompanyListResponse":{"allOf":[{"$ref":"#/components/schemas/CompanyListResponse"},{"type":"object","properties":{"unresolvedDomains":{"type":"array","description":"Domains from the HubSpot result whose stub records could not be\nupserted. These domains are excluded from the list filter.\nPresent only when one or more upserts fail; omitted on full success.\n","items":{"type":"string"}}}}]},"CompanyListResponse":{"type":"object","description":"A saved company list with its filter definition","properties":{"id":{"type":"string","description":"Unique identifier for the list"},"name":{"type":"string","description":"Human-readable list name"},"prompt":{"type":"string","description":"Optional prompt used to generate the filter"},"filter":{"$ref":"#/components/schemas/CompanyListFilters"},"createdAt":{"type":"string","format":"date-time","description":"When the list was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the list was last updated"}},"required":["id","name","filter","createdAt"]},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The CompanyListResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyListResponse":{"type":"object","description":"A saved company list with its filter definition","properties":{"id":{"type":"string","description":"Unique identifier for the list"},"name":{"type":"string","description":"Human-readable list name"},"prompt":{"type":"string","description":"Optional prompt used to generate the filter"},"filter":{"$ref":"#/components/schemas/CompanyListFilters"},"createdAt":{"type":"string","format":"date-time","description":"When the list was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the list was last updated"}},"required":["id","name","filter","createdAt"]},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The CompanyListsResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyListsResponse":{"type":"object","description":"Paginated list of company lists","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CompanyListResponse"}},"total":{"type":"integer","description":"Total number of lists"},"limit":{"type":"integer","description":"Maximum results per page"},"offset":{"type":"integer","description":"Number of results skipped"},"hasMore":{"type":"boolean","description":"Whether more results are available"}},"required":["items","total","limit","offset","hasMore"]},"CompanyListResponse":{"type":"object","description":"A saved company list with its filter definition","properties":{"id":{"type":"string","description":"Unique identifier for the list"},"name":{"type":"string","description":"Human-readable list name"},"prompt":{"type":"string","description":"Optional prompt used to generate the filter"},"filter":{"$ref":"#/components/schemas/CompanyListFilters"},"createdAt":{"type":"string","format":"date-time","description":"When the list was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the list was last updated"}},"required":["id","name","filter","createdAt"]},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The CompanyListCompaniesResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyListCompaniesResponse":{"type":"object","description":"Paginated list of companies in a company list","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CompanyListCompany"}},"total":{"type":"integer","description":"Total number of companies in the list"},"limit":{"type":"integer","description":"Maximum results per page"},"offset":{"type":"integer","description":"Number of results skipped"},"hasMore":{"type":"boolean","description":"Whether more results are available"}},"required":["items","total","limit","offset","hasMore"]},"CompanyListCompany":{"type":"object","description":"A company matching the search filter","properties":{"id":{"type":"string","description":"Unique company identifier"},"domain":{"type":"string","description":"Company domain"},"name":{"type":"string","description":"Company name"},"handle":{"type":"string","description":"Company handle"},"website":{"type":"string","description":"Company website URL"},"industry":{"type":"string","description":"Industry classification"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City name"},"state":{"type":"string","description":"State/province name"},"countryCode":{"type":"string","description":"ISO country code"},"enrichedData":{"type":"object","description":"LinkedIn enrichment data","properties":{"liId":{"type":"integer","description":"LinkedIn company ID"},"liFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"liFoundEmployees":{"type":"integer","description":"Number of employees found on LinkedIn"}}}},"required":["id","domain","name"]}}}}
```

## The ExportCompanyListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ExportCompanyListRequest":{"type":"object","description":"Optional parameters for the company list CSV export.","properties":{"fields":{"type":"array","items":{"type":"string","enum":["industry","size","founded","city","state","country_code"]},"description":"Optional firmographic columns to include after the fixed `name` and\n`website` columns, in the order specified. Unknown values return 422.\n"},"signalTemplateIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"IDs of signal templates whose subscriptions should be included as\ncolumns. Two columns are added per subscription:\n`{signal_name}_answer` and `{signal_name}_confidence`. If absent\nor empty, no signal columns are added.\n"}}}}}}
```

## The CompanySearchRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanySearchRequest":{"type":"object","required":["filter"],"properties":{"filter":{"$ref":"#/components/schemas/CompanyListFilters"}}},"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The CompanyListFilters object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyListFilters":{"type":"object","description":"Criteria for filtering companies","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"Filter by company domains"},"names":{"type":"array","items":{"type":"string"},"description":"Filter by company names"},"handles":{"type":"array","items":{"type":"string"},"description":"Filter by company handles"},"websites":{"type":"array","items":{"type":"string"},"description":"Filter by company websites"},"industries":{"type":"array","items":{"type":"string"},"description":"Filter by industry names"},"sizes":{"type":"array","items":{"type":"string"},"description":"Filter by company size ranges"},"types":{"type":"array","items":{"type":"string"},"description":"Filter by company types"},"founded":{"type":"object","description":"Filter by founded year range","properties":{"before":{"type":"integer","description":"Founded before this year"},"after":{"type":"integer","description":"Founded after this year"}}},"location":{"type":"object","description":"Filter by geographic location","properties":{"cities":{"type":"array","items":{"type":"string"},"description":"Filter by city names"},"states":{"type":"array","items":{"type":"string"},"description":"Filter by state/province names"},"countryCodes":{"type":"array","items":{"type":"string"},"description":"Filter by ISO country codes"}}},"exclude":{"type":"object","description":"Exclusion filters (companies matching these are removed)","properties":{"industries":{"type":"array","items":{"type":"string"}},"sizes":{"type":"array","items":{"type":"string"}},"types":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"location":{"type":"object","properties":{"cities":{"type":"array","items":{"type":"string"}},"states":{"type":"array","items":{"type":"string"}},"countryCodes":{"type":"array","items":{"type":"string"}}}}}},"questionIds":{"type":"array","items":{"type":"string"},"description":"Filter by signal question IDs"},"technologies":{"type":"array","items":{"type":"string"},"description":"Filter by technology slugs (companies must use at least one of the specified technologies)"}}}}}}
```

## The CompanySearchResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanySearchResponse":{"type":"object","properties":{"companies":{"type":"array","items":{"$ref":"#/components/schemas/CompanyListCompany"},"description":"Up to 50 companies matching the filter"},"total":{"type":"integer","description":"Total number of companies matching the filter"}},"required":["companies","total"]},"CompanyListCompany":{"type":"object","description":"A company matching the search filter","properties":{"id":{"type":"string","description":"Unique company identifier"},"domain":{"type":"string","description":"Company domain"},"name":{"type":"string","description":"Company name"},"handle":{"type":"string","description":"Company handle"},"website":{"type":"string","description":"Company website URL"},"industry":{"type":"string","description":"Industry classification"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City name"},"state":{"type":"string","description":"State/province name"},"countryCode":{"type":"string","description":"ISO country code"},"enrichedData":{"type":"object","description":"LinkedIn enrichment data","properties":{"liId":{"type":"integer","description":"LinkedIn company ID"},"liFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"liFoundEmployees":{"type":"integer","description":"Number of employees found on LinkedIn"}}}},"required":["id","domain","name"]}}}}
```

## The CompanyListCompany object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CompanyListCompany":{"type":"object","description":"A company matching the search filter","properties":{"id":{"type":"string","description":"Unique company identifier"},"domain":{"type":"string","description":"Company domain"},"name":{"type":"string","description":"Company name"},"handle":{"type":"string","description":"Company handle"},"website":{"type":"string","description":"Company website URL"},"industry":{"type":"string","description":"Industry classification"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City name"},"state":{"type":"string","description":"State/province name"},"countryCode":{"type":"string","description":"ISO country code"},"enrichedData":{"type":"object","description":"LinkedIn enrichment data","properties":{"liId":{"type":"integer","description":"LinkedIn company ID"},"liFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"liFoundEmployees":{"type":"integer","description":"Number of employees found on LinkedIn"}}}},"required":["id","domain","name"]}}}}
```

## The ErrorResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}}}
```

## The RateLimitErrorResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"RateLimitErrorResponse":{"type":"object","description":"Flat error envelope returned only by the global per-API-key rate-limit middleware (HTTP 429). All other errors — including 429s from per-route rate limiters — use the standard `ErrorResponse` envelope.\n","required":["statusCode","error","message"],"properties":{"statusCode":{"type":"integer"},"error":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","description":"Seconds until the next request will be admitted."}}}}}}
```

## The ConnectorUnavailableError object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ConnectorUnavailableError":{"type":"object","description":"Error response when a required connector is unavailable","properties":{"error":{"type":"object","required":["code","message","connector","reason"],"properties":{"code":{"type":"string","enum":["CONNECTOR_UNAVAILABLE"],"description":"Machine-readable error code"},"message":{"type":"string","description":"Human-readable error message"},"connector":{"type":"string","enum":["salesNavigator"],"description":"The connector that is unavailable"},"reason":{"type":"string","enum":["rate_limited","disconnected"],"description":"The reason the connector is unavailable"},"retry_after_seconds":{"type":"integer","description":"Seconds to wait before retrying (present for rate_limited)"}}}},"required":["error"]}}}}
```

## The WebhookPayload object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"WebhookPayload":{"type":"object","description":"Payload sent to webhook endpoints when signal events occur","properties":{"id":{"type":"string","description":"Unique event identifier"},"type":{"type":"string","description":"Type of webhook event","enum":["signal.completed","signal.failed"]},"version":{"type":"string","description":"Webhook payload version"},"timestamp":{"type":"integer","format":"int64","description":"Unix timestamp when the event occurred"},"data":{"$ref":"#/components/schemas/SignalDetailResponse"}},"required":["id","type","version","timestamp","data"]},"SignalDetailResponse":{"allOf":[{"$ref":"#/components/schemas/SignalResponse"},{"type":"object","properties":{"completedAt":{"type":"string","format":"date-time","description":"When the signal processing completed (only present when status is completed)"},"answer":{"oneOf":[{"$ref":"#/components/schemas/Answer"},{"type":"null"}],"description":"The AI-generated answer (null when status is not completed)"},"reasoning":{"type":"string","description":"Detailed reasoning for the answer (only present when status is completed)"},"confidence":{"type":"number","format":"float","minimum":0,"maximum":1,"description":"Confidence score for the answer (0-1, only present when status is completed)"},"sources":{"type":"array","description":"Sources used to generate the answer (only present when status is completed, maximum 20 sources)","maxItems":20,"items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string"},"snippet":{"type":"string"}}}},"metadata":{"type":"object","description":"Additional metadata about the processing (only present when status is completed)","additionalProperties":true,"properties":{"companyName":{"type":"string","description":"Company name (for company signals)"},"processingTimeMs":{"type":"number","description":"Processing time in milliseconds"},"connectors":{"type":"object","description":"Connector status information","properties":{"salesNavigator":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ok","degraded"],"description":"Connector status for this request"},"reason":{"type":"string","enum":["rate_limited","disconnected"],"description":"Reason for degraded status (only present when status is degraded)"}}}}},"linkedInContext":{"$ref":"#/components/schemas/LinkedInContext"}}},"error":{"type":"string","description":"Error message (only present when status is failed)"},"errorCode":{"type":"string","description":"Machine-readable error code (only present when status is failed)","enum":["LINKEDIN_RATE_LIMIT_EXCEEDED","LINKEDIN_CONNECTOR_REQUIRED","CONNECTOR_UNAVAILABLE","VALIDATION_ERROR"]},"errorAction":{"type":"string","description":"Suggested action to resolve the error (only present when status is failed)"},"changeContext":{"$ref":"#/components/schemas/ChangeContext","description":"Information about changes between signal versions (only present when status is completed and a previous version exists)"},"verificationMode":{"type":"string","description":"Verification mode used for signal generation","enum":["strict","lenient"]},"company":{"$ref":"#/components/schemas/CompanyFirmographics","description":"Company firmographic data (only present in webhook payloads for company signals)"}}}]},"SignalResponse":{"description":"Polymorphic signal response (company or contact)","oneOf":[{"$ref":"#/components/schemas/CompanySignalResponse"},{"$ref":"#/components/schemas/ContactSignalResponse"}],"discriminator":{"propertyName":"signalType","mapping":{"COMPANY":"#/components/schemas/CompanySignalResponse","CONTACT":"#/components/schemas/ContactSignalResponse"}}},"CompanySignalResponse":{"description":"Response for company signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["COMPANY"]},"domain":{"type":"string","description":"The domain that was researched"}},"required":["domain"]}]},"BaseSignalResponse":{"type":"object","description":"Base schema containing fields common to all signal types","properties":{"id":{"type":"string","description":"Unique identifier for the signal (UUID format)","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"signalType":{"type":"string","description":"Type of signal (company or contact)","enum":["COMPANY","CONTACT"]},"status":{"type":"string","description":"Current processing status of the signal","enum":["processing","completed","failed"]},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","description":"Answer type for this signal","enum":["boolean","number","percentage","currency","open_text","url","list","json_schema","contacts","contact_posts"]},"createdAt":{"type":"string","format":"date-time","description":"When the signal was created"}},"required":["id","signalType","status","question","createdAt"]},"ContactSignalResponse":{"description":"Response for contact signals","allOf":[{"$ref":"#/components/schemas/BaseSignalResponse"},{"type":"object","properties":{"signalType":{"type":"string","enum":["CONTACT"]},"contactProfileUrl":{"type":"string","description":"LinkedIn profile URL"}},"required":["contactProfileUrl"]}]},"Answer":{"description":"Discriminated union representing different answer types.\nThe 'type' field indicates which specific answer format is used.\n","oneOf":[{"type":"object","required":["type","open_text"],"properties":{"type":{"type":"string","enum":["open_text"],"description":"The answer type discriminator"},"open_text":{"$ref":"#/components/schemas/OpenTextAnswer"}}},{"type":"object","required":["type","number"],"properties":{"type":{"type":"string","enum":["number"],"description":"The answer type discriminator"},"number":{"$ref":"#/components/schemas/NumberAnswer"}}},{"type":"object","required":["type","boolean"],"properties":{"type":{"type":"string","enum":["boolean"],"description":"The answer type discriminator"},"boolean":{"$ref":"#/components/schemas/BooleanAnswer"}}},{"type":"object","required":["type","list"],"properties":{"type":{"type":"string","enum":["list"],"description":"The answer type discriminator"},"list":{"$ref":"#/components/schemas/ListAnswer"}}},{"type":"object","required":["type","percentage"],"properties":{"type":{"type":"string","enum":["percentage"],"description":"The answer type discriminator"},"percentage":{"$ref":"#/components/schemas/PercentageAnswer"}}},{"type":"object","required":["type","currency"],"properties":{"type":{"type":"string","enum":["currency"],"description":"The answer type discriminator"},"currency":{"$ref":"#/components/schemas/CurrencyAnswer"}}},{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["url"],"description":"The answer type discriminator"},"url":{"$ref":"#/components/schemas/URLAnswer"}}},{"type":"object","required":["type","contacts"],"properties":{"type":{"type":"string","enum":["contacts"],"description":"The answer type discriminator"},"contacts":{"$ref":"#/components/schemas/ContactsAnswer"}}},{"type":"object","required":["type","contactPosts"],"properties":{"type":{"type":"string","enum":["contact_posts"],"description":"The answer type discriminator"},"contactPosts":{"$ref":"#/components/schemas/ContactPostsAnswer"}}},{"type":"object","required":["type","contactEngagements"],"properties":{"type":{"type":"string","enum":["contact_engagements"],"description":"The answer type discriminator"},"contactEngagements":{"$ref":"#/components/schemas/ContactEngagementsAnswer"}}},{"type":"object","required":["type","jsonSchema"],"properties":{"type":{"type":"string","enum":["json_schema"],"description":"The answer type discriminator"},"jsonSchema":{"$ref":"#/components/schemas/JSONSchemaAnswer"}}}],"discriminator":{"propertyName":"type","mapping":{"open_text":"#/components/schemas/OpenTextAnswer","number":"#/components/schemas/NumberAnswer","boolean":"#/components/schemas/BooleanAnswer","list":"#/components/schemas/ListAnswer","percentage":"#/components/schemas/PercentageAnswer","currency":"#/components/schemas/CurrencyAnswer","url":"#/components/schemas/URLAnswer","contacts":"#/components/schemas/ContactsAnswer","contact_posts":"#/components/schemas/ContactPostsAnswer","contact_engagements":"#/components/schemas/ContactEngagementsAnswer","json_schema":"#/components/schemas/JSONSchemaAnswer"}}},"OpenTextAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","description":"Free-form text response"}}},"NumberAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"number","description":"Numeric value"}}},"BooleanAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"boolean","description":"True or false value"}}},"ListAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of string items (maximum 500 items)","maxItems":500,"items":{"type":"string"}}}},"PercentageAnswer":{"type":"object","required":["value","unit"],"properties":{"value":{"type":"number","description":"Percentage value"},"unit":{"type":"string","description":"Unit symbol (typically \"%\")"}}},"CurrencyAnswer":{"type":"object","required":["value","currency"],"properties":{"value":{"type":"number","description":"Monetary amount"},"currency":{"type":"string","description":"ISO 4217 currency code"}}},"URLAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"string","format":"uri","description":"Valid URL string"}}},"ContactsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of contact objects with detailed information (maximum 100 contacts)","maxItems":100,"items":{"$ref":"#/components/schemas/Contact"}}}},"Contact":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Professional headline"},"summary":{"type":"string","description":"Professional summary"},"positions":{"type":"array","description":"Array of current and past positions","items":{"$ref":"#/components/schemas/ContactPosition"}},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Avatar/profile picture URL"},"location":{"type":"string","description":"Location of the contact"},"followerCount":{"type":"integer","description":"Number of followers on LinkedIn"},"education":{"type":"array","description":"Array of education entries","items":{"$ref":"#/components/schemas/Education"}}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Education":{"type":"object","required":["schoolName"],"properties":{"schoolName":{"type":"string","description":"Name of the educational institution"},"schoolUrl":{"type":"string","format":"uri","description":"LinkedIn URL of the school"},"degree":{"type":"string","description":"Degree obtained (e.g., \"Bachelor of Science\")"},"fieldOfStudy":{"type":"string","description":"Field of study (e.g., \"Computer Science\")"},"startDate":{"$ref":"#/components/schemas/ContactDate"},"endDate":{"description":"End date of education (null if currently enrolled)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactPostsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of post objects with detailed information","items":{"$ref":"#/components/schemas/Post"}}}},"Post":{"type":"object","required":["postUrl"],"properties":{"postUrl":{"type":"string","format":"uri","description":"LinkedIn post URL (identity key for tracking changes)"},"postText":{"type":"string","description":"Text content of the post"},"activityUrn":{"type":"string","description":"LinkedIn activity URN"},"publishedAt":{"type":"string","description":"Publication date"},"postType":{"type":"string","enum":["original","shared","repost"],"description":"Type of post"},"author":{"$ref":"#/components/schemas/PostAuthor"},"engagement":{"$ref":"#/components/schemas/PostEngagement"},"subject":{"type":"string","description":"AI-generated one-sentence summary of the post"}}},"PostAuthor":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Author's name"},"headline":{"type":"string","description":"Author's professional headline"},"profileUrl":{"type":"string","format":"uri","description":"Author's LinkedIn profile URL"}}},"PostEngagement":{"type":"object","properties":{"reactionCount":{"type":"integer","description":"Number of reactions"},"commentCount":{"type":"integer","description":"Number of comments"},"viewCount":{"type":"integer","description":"Number of views"},"topReactionTypes":{"type":"array","items":{"type":"string"},"description":"Most common reaction types"}}},"ContactEngagementsAnswer":{"type":"object","required":["value"],"properties":{"value":{"type":"array","description":"Array of engagement objects (maximum 100 engagements)","maxItems":100,"items":{"$ref":"#/components/schemas/ContactEngagement"}}}},"ContactEngagement":{"type":"object","required":["postUrl","engagementType"],"properties":{"postUrl":{"type":"string","format":"uri","description":"URL of the LinkedIn post where the engagement occurred"},"postAuthor":{"$ref":"#/components/schemas/PostAuthor","description":"Author of the original post"},"postText":{"type":"string","description":"Snippet of post content"},"publishedAt":{"type":"string","format":"date-time","description":"ISO 8601 post publication timestamp"},"engagementType":{"type":"string","enum":["comment","reaction"],"description":"Type of engagement"},"engagementDate":{"type":"string","format":"date-time","description":"ISO 8601 engagement timestamp"},"commentText":{"type":"string","description":"Text of comment (if engagementType is comment)"},"reactionText":{"type":"string","description":"Reaction text extracted from LinkedIn header (e.g., \"John celebrates this\", \"John likes this\", \"John finds this insightful\")"}}},"JSONSchemaAnswer":{"type":"object","description":"The generated data conforming to the user-provided JSON Schema (payload at answer.jsonSchema directly)","additionalProperties":true},"LinkedInContext":{"type":"object","description":"LinkedIn capability usage context for a signal (only present when LinkedIn tools were involved)","required":["linkedInToolsUsed","mode","capabilities"],"properties":{"linkedInToolsUsed":{"type":"boolean","description":"Whether any LinkedIn tools were used"},"mode":{"type":"string","enum":["required","preferred","off"],"description":"LinkedIn connector mode used"},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/LinkedInCapabilityStatus"},"description":"Per-capability status"},"degraded":{"type":"boolean","description":"Whether the signal was degraded due to LinkedIn limitations"}}},"LinkedInCapabilityStatus":{"type":"object","description":"Status of a single LinkedIn capability during signal generation","required":["capability","used"],"properties":{"capability":{"type":"string","enum":["contact_search","profile_enrichment","company_data","company_search","activity_tracking","post_search"],"description":"LinkedIn capability name"},"used":{"type":"boolean","description":"Whether this capability was used during signal generation"},"rateLimited":{"type":"boolean","description":"Whether this capability was rate-limited"}}},"ChangeContext":{"type":"object","description":"Information about changes between signal versions. The changeType field uses graduated change types: INITIAL for first versions, NO_CHANGE for identical or semantically equivalent results, and MINOR_CHANGE/MAJOR_CHANGE for graduated severity (replacing the legacy binary CHANGED type). Subscribers can filter broadly on changedFields (any event on a field) or precisely on addedFields/updatedFields/removedFields without inspecting the delta structure.\n","required":["changeType","changedFields","addedFields","updatedFields","removedFields"],"properties":{"changeType":{"$ref":"#/components/schemas/ChangeType"},"changeDelta":{"oneOf":[{"$ref":"#/components/schemas/ChangeDelta"},{"type":"null"}],"description":"Structured delta of the change (structure varies by answer type)"},"previousSignalId":{"type":["string","null"],"description":"ID of the previous signal version","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"changedFields":{"type":"array","items":{"type":"string"},"description":"Union of addedFields + updatedFields + removedFields. Use this to subscribe to any event on a field regardless of change type (e.g. changedFields.includes(\"headline\")). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"addedFields":{"type":"array","items":{"type":"string"},"description":"Fields where new values appeared (new contacts/posts, new certifications, etc.). Entity-level additions use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"updatedFields":{"type":"array","items":{"type":"string"},"description":"Fields where existing values were modified (headline changed, engagement updated, etc.). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"removedFields":{"type":"array","items":{"type":"string"},"description":"Fields where values were removed (contacts left, skills removed, etc.). Entity-level removals use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"}}},"ChangeType":{"type":"string","description":"Type of change detected between signal versions. INITIAL = first signal version, NO_CHANGE = identical or semantically equivalent to previous, MINOR_CHANGE = low-impact semantic change, CHANGED = significant change (legacy, pre-graduated), MAJOR_CHANGE = high-impact semantic change.\n","enum":["INITIAL","NO_CHANGE","CHANGED","MINOR_CHANGE","MAJOR_CHANGE"]},"ChangeDelta":{"type":"object","description":"Structured delta of the change between signal versions.\nThe structure varies based on the answer type:\n- LIST: {type: \"LIST\", added: string[], removed: string[]}\n- NUMBER: {type: \"NUMBER\", previous: number, current: number, change: number}\n- CURRENCY: {type: \"CURRENCY\", previous: number | object, current: number | object, currency?: string, change: number | string}\n- PERCENTAGE: {type: \"PERCENTAGE\", previous: number, current: number, unit: string, change: number}\n- BOOLEAN: {type: \"BOOLEAN\", previous: boolean, current: boolean}\n- GENERIC: {type: \"GENERIC\", previous: Answer | null, current: Answer | null}\n- SEMANTIC: {type: \"SEMANTIC\", previous: Answer | null, current: Answer | null, similarityScore: number}\n- SEMANTIC_LIST: {type: \"SEMANTIC_LIST\", added: string[], removed: string[], matched: [{previous: string, current: string, similarityScore: number}], similarityScore: number}\n- CONTACTS: {type: \"CONTACTS\", added: Contact[], removed: Contact[], updated: [{previous: Contact, current: Contact, fieldChanges: [...]}]}\n- CONTACT_POSTS: {type: \"CONTACT_POSTS\", added: Post[], removed: Post[], updated: [{previous: Post, current: Post, fieldChanges: [...], engagementGrowth?: EngagementGrowth}]}\n","additionalProperties":true},"CompanyFirmographics":{"type":"object","description":"Company firmographic and LinkedIn enrichment data included in webhook payloads","properties":{"id":{"type":"string","description":"Company ID"},"name":{"type":"string","description":"Company name"},"domain":{"type":"string","description":"Company domain"},"industry":{"type":"string","description":"Industry classification"},"website":{"type":"string","description":"Company website URL"},"size":{"type":"string","description":"Company size range"},"type":{"type":"string","description":"Company type (e.g. private, public)"},"founded":{"type":"integer","description":"Year the company was founded"},"city":{"type":"string","description":"City of headquarters"},"state":{"type":"string","description":"State or region of headquarters"},"countryCode":{"type":"string","description":"ISO country code"},"handle":{"type":"string","description":"Company handle/slug"},"linkedInId":{"type":"integer","description":"LinkedIn numeric company ID"},"linkedInUrl":{"type":"string","format":"uri","description":"LinkedIn company page URL"},"linkedInFollowers":{"type":"integer","description":"Number of LinkedIn followers"},"employeeCount":{"type":"integer","description":"Approximate employee count from LinkedIn"},"description":{"type":"string","description":"Company description"},"logoUrl":{"type":"string","format":"uri","description":"Company logo URL"}}}}}}
```

## The CreateContactResearchRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateContactResearchRequest":{"type":"object","required":["firstName","lastName","companyName","companyDomain"],"properties":{"firstName":{"type":"string","description":"First name of the contact","minLength":1,"maxLength":100},"lastName":{"type":"string","description":"Last name of the contact","minLength":1,"maxLength":100},"companyName":{"type":"string","description":"Name of the contact's company","minLength":1,"maxLength":200},"companyDomain":{"type":"string","description":"Company domain (e.g., \"acme.com\")","pattern":"^[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])?)*$","minLength":1,"maxLength":253},"contactProfileUrl":{"type":"string","format":"uri","description":"Contact profile URL of the contact (e.g., LinkedIn or other professional profile, optional)","maxLength":500},"linkedInSalesNavigatorUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL of the contact (optional)","maxLength":500},"jobTitle":{"type":"string","description":"Job title of the contact (optional)","minLength":1,"maxLength":200},"webhookUrl":{"type":"string","format":"uri","description":"Optional webhook URL to receive notifications when processing completes","maxLength":2048}},"additionalProperties":false}}}}
```

## The ContactResearchResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactResearchResponse":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact research request"},"status":{"type":"string","description":"Current processing status of the contact research","enum":["processing","completed","failed"]},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the research request was created"}},"required":["id","status","createdAt"]}}}}
```

## The ContactResearchDetailResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactResearchDetailResponse":{"allOf":[{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the contact research request"},"status":{"type":"string","description":"Current processing status of the contact research","enum":["processing","completed","failed"]},"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"companyName":{"type":"string","description":"Company name"},"companyDomain":{"type":"string","description":"Company domain"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the research request was created"}},"required":["id","status","firstName","lastName","companyName","companyDomain","createdAt"]},{"type":"object","properties":{"contactProfileUrl":{"type":"string","description":"Contact profile URL if provided (e.g., LinkedIn or other professional profile)"},"jobTitle":{"type":"string","description":"Job title - prioritizes the title found during research (profile.currentRole), falls back to the title provided in the request if research didn't find one"},"profile":{"type":"object","description":"AI-generated profile analysis (only present when status is \"completed\")","properties":{"summary":{"type":"string","description":"Professional summary"},"currentRole":{"type":"string","description":"Current job title"},"currentCompany":{"type":"string","description":"Current company"},"location":{"type":"string","description":"Professional location"},"experience":{"type":"array","description":"Work experience history","items":{"type":"object","properties":{"title":{"type":"string"},"company":{"type":"string"},"duration":{"type":"string"}}}}}},"communicationStyle":{"type":"object","description":"Preferred communication style (only present when status is \"completed\")","properties":{"preference":{"type":"string"}}},"interests":{"type":"array","description":"Professional interests and topics (only present when status is \"completed\")","items":{"type":"string"}},"challenges":{"type":"array","description":"Potential challenges or pain points (only present when status is \"completed\")","items":{"type":"string"}},"linkedInActivity":{"type":"object","description":"Recent LinkedIn activity analysis (only present when status is \"completed\")","properties":{"postingFrequency":{"type":"string"},"engagementLevel":{"type":"string"},"lastActivityDate":{"type":"string","format":"date-time"}}},"error":{"type":"string","description":"Error message if status is \"failed\""},"completedAt":{"type":"string","format":"date-time","description":"Timestamp when the research completed (success or failure)"}}}]}}}}
```

## The ContactSearchRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactSearchRequest":{"type":"object","additionalProperties":false,"anyOf":[{"required":["companyLinkedInUrls"]},{"required":["firstName"]},{"required":["lastName"]},{"required":["jobTitles"]},{"required":["keywords"]},{"required":["countries"]},{"required":["departments"]},{"required":["seniorityLevels"]}],"properties":{"companyLinkedInUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"LinkedIn company URLs to scope the search (note: plural — pass an array even for a single company). Supports multiple companies; results are merged and deduplicated. Omit to search across all companies.\n"},"firstName":{"type":"string","maxLength":100,"description":"First name of the contact to search for"},"lastName":{"type":"string","maxLength":100,"description":"Last name of the contact to search for"},"jobTitles":{"type":"array","items":{"type":"string","maxLength":200},"description":"Job titles to search for (plural — pass an array)"},"keywords":{"type":"string","maxLength":500,"description":"Keywords to search for in contact profiles (e.g., skills, technologies)"},"countries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2,"pattern":"^[A-Za-z]{2}$"},"description":"Countries to filter contacts by location. Must be ISO 3166-1 alpha-2 codes (e.g., \"US\", \"GB\", \"DE\") — full country names are not accepted."},"departments":{"type":"array","items":{"type":"string","maxLength":40,"enum":["Accounting","Administrative","Arts and Design","Business Development","Community and Social Services","Consulting","Customer Success and Support","Education","Engineering","Entrepreneurship","Finance","Healthcare Services","Human Resources","Information Technology","Legal","Marketing","Media and Communication","Military and Protective Services","Operations","Product Management","Program and Project Management","Purchasing","Quality Assurance","Real Estate","Research","Sales"]},"description":"Department (function) filter using LinkedIn Sales Navigator taxonomy. Multiple values are OR'd together. Combined with other filters via AND. All values are treated as INCLUDED — exclusion is not currently supported.\n"},"seniorityLevels":{"type":"array","items":{"type":"string","maxLength":25,"enum":["Owner / Partner","CXO","Vice President","Director","Experienced Manager","Entry Level Manager","Strategic","Senior","Entry Level","In Training"]},"description":"Seniority level filter using LinkedIn Sales Navigator taxonomy. Multiple values are OR'd together. Combined with other filters via AND. All values are treated as INCLUDED — exclusion is not currently supported.\n"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"Maximum number of contacts to return per page"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Zero-based offset for pagination"}}}}}}
```

## The Tenure object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Tenure":{"type":"object","properties":{"years":{"type":"integer","description":"Number of years"},"months":{"type":"integer","description":"Number of months"}}}}}}
```

## The ContactSearchResult object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactSearchResult":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Headline/tagline from their profile"},"summary":{"type":"string","description":"Summary/about section from their profile"},"positions":{"type":"array","items":{"$ref":"#/components/schemas/ContactPosition"},"description":"Current positions held by the contact"},"role":{"type":"string","description":"Current job title/role"},"companyName":{"type":"string","description":"Current company name"},"tenureAtCompany":{"$ref":"#/components/schemas/Tenure"},"tenureAtPosition":{"$ref":"#/components/schemas/Tenure"},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Profile avatar URL"},"location":{"type":"string","description":"Geographic location"}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Tenure":{"type":"object","properties":{"years":{"type":"integer","description":"Number of years"},"months":{"type":"integer","description":"Number of months"}}}}}}
```

## The ContactSearchResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactSearchResponse":{"type":"object","required":["items","total","limit","offset","hasMore","salesNavConnected"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContactSearchResult"},"description":"Contacts matching the search on this page"},"total":{"type":"integer","description":"Total number of contacts matching the search (from LinkedIn)"},"limit":{"type":"integer","description":"Page size used for this request"},"offset":{"type":"integer","description":"Zero-based offset used for this request"},"hasMore":{"type":"boolean","description":"Whether more contacts are available beyond this page"},"salesNavConnected":{"type":"boolean","description":"Whether LinkedIn Sales Navigator is connected for the user"}}},"ContactSearchResult":{"type":"object","properties":{"firstName":{"type":"string","description":"First name of the contact"},"lastName":{"type":"string","description":"Last name of the contact"},"fullName":{"type":"string","description":"Full name of the contact"},"headline":{"type":"string","description":"Headline/tagline from their profile"},"summary":{"type":"string","description":"Summary/about section from their profile"},"positions":{"type":"array","items":{"$ref":"#/components/schemas/ContactPosition"},"description":"Current positions held by the contact"},"role":{"type":"string","description":"Current job title/role"},"companyName":{"type":"string","description":"Current company name"},"tenureAtCompany":{"$ref":"#/components/schemas/Tenure"},"tenureAtPosition":{"$ref":"#/components/schemas/Tenure"},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels"},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"LinkedIn Sales Navigator profile URL"},"linkedInProfileUrl":{"type":"string","format":"uri","description":"LinkedIn profile URL"},"avatar":{"type":"string","format":"uri","description":"Profile avatar URL"},"location":{"type":"string","description":"Geographic location"}}},"ContactPosition":{"type":"object","required":["companyName","title"],"properties":{"companyName":{"type":"string","description":"Name of the company"},"companyUrl":{"type":"string","format":"uri","description":"Company LinkedIn URL"},"title":{"type":"string","description":"Job title/role"},"tenureInMonths":{"type":"integer","description":"Total tenure in months (computed from tenure)"},"location":{"type":"string","description":"Location of the position"},"description":{"type":"string","description":"Description of the role"},"startedOn":{"$ref":"#/components/schemas/ContactDate"},"endedOn":{"description":"End date of position (null if currently employed)","oneOf":[{"$ref":"#/components/schemas/ContactDate"},{"type":"null"}]}}},"ContactDate":{"type":"object","required":["year"],"properties":{"year":{"type":"integer","description":"Year"},"month":{"type":"integer","description":"Month (1-12)"}}},"Tenure":{"type":"object","properties":{"years":{"type":"integer","description":"Number of years"},"months":{"type":"integer","description":"Number of months"}}}}}}
```

## The CreateSignalTemplateRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateSignalTemplateRequest":{"type":"object","required":["name","question"],"properties":{"name":{"type":"string","description":"User-friendly name for the template","minLength":1,"maxLength":200},"description":{"type":"string","description":"Optional description of what this template does","maxLength":1000},"question":{"type":"string","description":"The research question to ask about companies","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contacts_generation","contact_posts","contact_engagements","json_schema"],"default":"open_text"},"outputSchema":{"type":"object","description":"JSON Schema defining the expected output structure. Required when answerType is \"json_schema\".\nSee CreateSignalRequest.outputSchema for full documentation.\n","additionalProperties":true},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType.\nStructure varies by answerType:\n- For percentage/number/currency: { ranges: [{ rangeStart, rangeEnd, answerQualification }] }\n- For boolean: { yes: \"qualification\", no: \"qualification\" }\n- For list: { choices: { key: { answerQualification, label } } }\n\nValid answerQualification values: disqualified, poor, neutral, good, excellent\n","additionalProperties":true}}}}}}
```

## The UpdateSignalTemplateRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateSignalTemplateRequest":{"type":"object","description":"Request body for updating a signal template using PATCH semantics.\nAll fields are optional - only provide the fields you want to update.\nOmitted fields will retain their values from the previous template version.\n","properties":{"name":{"type":"string","description":"User-friendly name for the template","minLength":1,"maxLength":200},"description":{"type":"string","description":"Optional description of what this template does","maxLength":1000},"question":{"type":"string","description":"The research question to ask about companies","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"outputSchema":{"type":"object","description":"JSON Schema defining the expected output structure. Required when answerType is \"json_schema\".\n","additionalProperties":true},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType","additionalProperties":true}}}}}}
```

## The SignalTemplateResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SignalTemplateResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Stable template identifier — alias for `templateId`. Use this (or `templateId`) when authoring scoring rules. Deprecated; use `templateId` instead.","deprecated":true},"templateId":{"type":"string","format":"uuid","description":"Stable parent template ID. Pass this as `signalTemplateId` when authoring scoring rules."},"version":{"type":"integer","description":"Version number of this template (starts at 1, increments with each update)"},"organizationId":{"type":"string","description":"Organization ID that owns this template"},"name":{"type":"string","description":"User-friendly name for the template"},"description":{"type":"string","description":"Optional description of what this template does"},"question":{"type":"string","description":"The research question to ask about companies"},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"outputSchema":{"type":"object","description":"JSON Schema for custom output (present when answerType is json_schema)","additionalProperties":true},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType","additionalProperties":true},"createdByUserId":{"type":"string","description":"User ID who created this template version"},"createdAt":{"type":"string","format":"date-time","description":"When this template version was created"},"deletedAt":{"type":["string","null"],"format":"date-time","description":"When this template version was deleted (null if active)"},"source":{"type":"string","description":"Source of the template creation","enum":["api","research","list-building","hubspot"]}},"required":["id","version","organizationId","name","question","answerType","createdByUserId","createdAt","source"]}}}}
```

## The ListSignalTemplatesResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ListSignalTemplatesResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SignalTemplateResponse"}},"total":{"type":"integer","description":"Total number of templates available"},"limit":{"type":"integer","description":"Maximum number of templates returned"},"offset":{"type":"integer","description":"Number of templates skipped"},"hasMore":{"type":"boolean","description":"Whether there are more templates available"}},"required":["items","total","limit","offset","hasMore"]},"SignalTemplateResponse":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Stable template identifier — alias for `templateId`. Use this (or `templateId`) when authoring scoring rules. Deprecated; use `templateId` instead.","deprecated":true},"templateId":{"type":"string","format":"uuid","description":"Stable parent template ID. Pass this as `signalTemplateId` when authoring scoring rules."},"version":{"type":"integer","description":"Version number of this template (starts at 1, increments with each update)"},"organizationId":{"type":"string","description":"Organization ID that owns this template"},"name":{"type":"string","description":"User-friendly name for the template"},"description":{"type":"string","description":"Optional description of what this template does"},"question":{"type":"string","description":"The research question to ask about companies"},"answerType":{"type":"string","description":"The expected format of the answer","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"outputSchema":{"type":"object","description":"JSON Schema for custom output (present when answerType is json_schema)","additionalProperties":true},"weight":{"type":"string","description":"The importance/weight of the signal","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria mapping answer values based on answerType","additionalProperties":true},"createdByUserId":{"type":"string","description":"User ID who created this template version"},"createdAt":{"type":"string","format":"date-time","description":"When this template version was created"},"deletedAt":{"type":["string","null"],"format":"date-time","description":"When this template version was deleted (null if active)"},"source":{"type":"string","description":"Source of the template creation","enum":["api","research","list-building","hubspot"]}},"required":["id","version","organizationId","name","question","answerType","createdByUserId","createdAt","source"]}}}}
```

## The CreateSignalSubscriptionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateSignalSubscriptionRequest":{"type":"object","description":"Exactly one of `frequency` or `cronExpression` must be provided.\nUse `frequency` for preset schedules (daily/weekly/monthly) or\n`cronExpression` for custom cron-based schedules.\n","properties":{"signalTemplateId":{"type":"string","format":"uuid","description":"ID of an existing signal template. If omitted, `name` and `question`\nare required to create a template inline.\n"},"name":{"type":"string","description":"Template name (required when creating inline, ignored when signalTemplateId is provided)","minLength":1,"maxLength":200},"description":{"type":"string","description":"Template description (optional, for inline creation)","maxLength":1000},"question":{"type":"string","description":"Research question (required when creating inline)","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"Expected answer format (for inline creation, defaults to open_text)","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"],"default":"open_text"},"outputSchema":{"type":"object","description":"JSON Schema for custom output (when answerType is json_schema)","additionalProperties":true},"weight":{"type":"string","description":"Importance of the signal (for inline creation)","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","description":"Qualification criteria for scoring answers (for inline creation)","additionalProperties":true},"frequency":{"type":"string","description":"Preset schedule frequency. Mutually exclusive with `cronExpression` —\nexactly one must be provided.\n","enum":["daily","weekly","monthly"]},"cronExpression":{"type":"string","description":"Custom cron expression (5-field). Mutually exclusive with `frequency` —\nexactly one must be provided.\n"},"timezone":{"type":"string","description":"IANA timezone for scheduling (defaults to UTC)"},"listId":{"type":"string","format":"uuid","description":"Contact list ID to scope signal execution"}},"required":["listId"]}}}}
```

## The UpdateSignalSubscriptionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateSignalSubscriptionRequest":{"type":"object","description":"Replace a subscription's full configuration.\nExactly one of `frequency` or `cronExpression` must be provided.\n","required":["timezone","name","question","answerType"],"properties":{"frequency":{"type":"string","description":"Preset schedule frequency. Mutually exclusive with `cronExpression`.\n","enum":["daily","weekly","monthly"]},"cronExpression":{"type":"string","description":"Custom cron expression (5-field). Mutually exclusive with `frequency`.\n"},"timezone":{"type":"string","description":"IANA timezone for scheduling"},"name":{"type":"string","description":"The subscription display name","minLength":1,"maxLength":200},"question":{"type":"string","description":"The research question","minLength":1,"maxLength":500},"answerType":{"type":"string","description":"Expected answer format","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"description":{"type":"string","description":"Signal description","maxLength":1000},"outputSchema":{"type":["object","null"],"additionalProperties":true,"description":"JSON schema for json_schema answer type. Send null to clear."},"weight":{"type":"string","description":"Signal importance weight","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","additionalProperties":true,"description":"Qualification criteria"}}}}}}
```

## The SignalSubscriptionResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SignalSubscriptionResponse":{"type":"object","description":"A signal subscription merged with its template definition.","properties":{"id":{"type":"string","format":"uuid","description":"The subscription ID (unique per subscription)."},"signalTemplateId":{"type":"string","format":"uuid","description":"The signal template ID this subscription is based on. Use this to correlate subscriptions that share the same template."},"version":{"type":"integer","description":"Template version number"},"name":{"type":"string","description":"Subscription name if set, otherwise the template name"},"description":{"type":"string"},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"outputSchema":{"type":"object","additionalProperties":true},"weight":{"type":"string","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","additionalProperties":true},"frequency":{"type":"string","description":"Preset frequency if set","enum":["daily","weekly","monthly"]},"cronExpression":{"type":"string","description":"The resolved cron expression"},"timezone":{"type":"string","description":"IANA timezone for scheduling"},"status":{"type":"string","enum":["active","stopped"]},"listId":{"type":"string","format":"uuid","description":"Contact list ID"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"nextRunAt":{"type":["string","null"],"format":"date-time"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","signalTemplateId","version","name","question","answerType","cronExpression","timezone","status","listId","source","createdAt"]}}}}
```

## The ListSignalSubscriptionsResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ListSignalSubscriptionsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SignalSubscriptionResponse"}},"total":{"type":"integer","description":"Total number of subscriptions matching the query"},"limit":{"type":"integer","description":"Maximum number of subscriptions returned"},"offset":{"type":"integer","description":"Number of subscriptions skipped"},"hasMore":{"type":"boolean","description":"Whether there are more subscriptions available"}},"required":["items","total","limit","offset","hasMore"]},"SignalSubscriptionResponse":{"type":"object","description":"A signal subscription merged with its template definition.","properties":{"id":{"type":"string","format":"uuid","description":"The subscription ID (unique per subscription)."},"signalTemplateId":{"type":"string","format":"uuid","description":"The signal template ID this subscription is based on. Use this to correlate subscriptions that share the same template."},"version":{"type":"integer","description":"Template version number"},"name":{"type":"string","description":"Subscription name if set, otherwise the template name"},"description":{"type":"string"},"question":{"type":"string","description":"The research question"},"answerType":{"type":"string","enum":["open_text","number","boolean","list","percentage","currency","url","contacts","contact_posts","contact_engagements","json_schema"]},"outputSchema":{"type":"object","additionalProperties":true},"weight":{"type":"string","enum":["important","nice_to_have","not_important"]},"qualificationCriteria":{"type":"object","additionalProperties":true},"frequency":{"type":"string","description":"Preset frequency if set","enum":["daily","weekly","monthly"]},"cronExpression":{"type":"string","description":"The resolved cron expression"},"timezone":{"type":"string","description":"IANA timezone for scheduling"},"status":{"type":"string","enum":["active","stopped"]},"listId":{"type":"string","format":"uuid","description":"Contact list ID"},"lastRunAt":{"type":["string","null"],"format":"date-time"},"nextRunAt":{"type":["string","null"],"format":"date-time"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","signalTemplateId","version","name","question","answerType","cronExpression","timezone","status","listId","source","createdAt"]}}}}
```

## The GenerateSummaryRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"GenerateSummaryRequest":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"The company domain to generate a summary for (e.g., \"acme.com\")","pattern":"^[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])?)*$","minLength":1,"maxLength":253}},"additionalProperties":false}}}}
```

## The SummaryResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SummaryResponse":{"type":"object","properties":{"summary":{"type":["array","null"],"description":"The generated summary as an array of data points, or null if no completed signals exist","items":{"$ref":"#/components/schemas/DataPoint"}}},"required":["summary"]},"DataPoint":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description of the data point"},"referenceQuestions":{"type":"array","description":"Array of signal questions that contributed to this data point","items":{"type":"string"}},"qualification":{"type":"string","description":"Qualification value indicating the quality/fit of this data point","enum":["disqualified","poor","neutral","good","excellent"]},"sources":{"type":"array","description":"Array of sources used to generate this data point","items":{"$ref":"#/components/schemas/Source"}}},"required":["description","referenceQuestions","qualification","sources"]},"Source":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"URL of the source"},"title":{"type":"string","description":"Title of the source"},"snippet":{"type":"string","description":"Optional snippet from the source"}},"required":["url","title"]}}}}
```

## The SummariesResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SummariesResponse":{"type":"object","properties":{"results":{"type":"array","description":"Array of summary records for the domain, ordered by creation date (latest first)","items":{"$ref":"#/components/schemas/SummaryRecord"}},"total":{"type":"integer","description":"Total number of summaries for this domain"},"limit":{"type":"integer","description":"Maximum results per page"},"offset":{"type":"integer","description":"Number of results skipped"},"count":{"type":"integer","description":"Number of results in this response"}},"required":["results","total","limit","offset","count"]},"SummaryRecord":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the summary"},"summary":{"type":["array","null"],"description":"The summary data points as an array, or null if summary generation failed","items":{"$ref":"#/components/schemas/DataPoint"}},"status":{"type":"string","description":"Status of the summary generation","enum":["in_progress","completed","failed"]},"signalsCount":{"type":"integer","description":"Number of signals used to generate this summary"},"createdAt":{"type":"string","format":"date-time","description":"When the summary was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the summary was last updated"}},"required":["id","summary","status","signalsCount","createdAt","updatedAt"]},"DataPoint":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description of the data point"},"referenceQuestions":{"type":"array","description":"Array of signal questions that contributed to this data point","items":{"type":"string"}},"qualification":{"type":"string","description":"Qualification value indicating the quality/fit of this data point","enum":["disqualified","poor","neutral","good","excellent"]},"sources":{"type":"array","description":"Array of sources used to generate this data point","items":{"$ref":"#/components/schemas/Source"}}},"required":["description","referenceQuestions","qualification","sources"]},"Source":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"URL of the source"},"title":{"type":"string","description":"Title of the source"},"snippet":{"type":"string","description":"Optional snippet from the source"}},"required":["url","title"]}}}}
```

## The SummaryRecord object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SummaryRecord":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier for the summary"},"summary":{"type":["array","null"],"description":"The summary data points as an array, or null if summary generation failed","items":{"$ref":"#/components/schemas/DataPoint"}},"status":{"type":"string","description":"Status of the summary generation","enum":["in_progress","completed","failed"]},"signalsCount":{"type":"integer","description":"Number of signals used to generate this summary"},"createdAt":{"type":"string","format":"date-time","description":"When the summary was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the summary was last updated"}},"required":["id","summary","status","signalsCount","createdAt","updatedAt"]},"DataPoint":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description of the data point"},"referenceQuestions":{"type":"array","description":"Array of signal questions that contributed to this data point","items":{"type":"string"}},"qualification":{"type":"string","description":"Qualification value indicating the quality/fit of this data point","enum":["disqualified","poor","neutral","good","excellent"]},"sources":{"type":"array","description":"Array of sources used to generate this data point","items":{"$ref":"#/components/schemas/Source"}}},"required":["description","referenceQuestions","qualification","sources"]},"Source":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"URL of the source"},"title":{"type":"string","description":"Title of the source"},"snippet":{"type":"string","description":"Optional snippet from the source"}},"required":["url","title"]}}}}
```

## The DataPoint object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"DataPoint":{"type":"object","properties":{"description":{"type":"string","description":"Human-readable description of the data point"},"referenceQuestions":{"type":"array","description":"Array of signal questions that contributed to this data point","items":{"type":"string"}},"qualification":{"type":"string","description":"Qualification value indicating the quality/fit of this data point","enum":["disqualified","poor","neutral","good","excellent"]},"sources":{"type":"array","description":"Array of sources used to generate this data point","items":{"$ref":"#/components/schemas/Source"}}},"required":["description","referenceQuestions","qualification","sources"]},"Source":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"URL of the source"},"title":{"type":"string","description":"Title of the source"},"snippet":{"type":"string","description":"Optional snippet from the source"}},"required":["url","title"]}}}}
```

## The Source object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Source":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"URL of the source"},"title":{"type":"string","description":"Title of the source"},"snippet":{"type":"string","description":"Optional snippet from the source"}},"required":["url","title"]}}}}
```

## The ChangeType object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ChangeType":{"type":"string","description":"Type of change detected between signal versions. INITIAL = first signal version, NO_CHANGE = identical or semantically equivalent to previous, MINOR_CHANGE = low-impact semantic change, CHANGED = significant change (legacy, pre-graduated), MAJOR_CHANGE = high-impact semantic change.\n","enum":["INITIAL","NO_CHANGE","CHANGED","MINOR_CHANGE","MAJOR_CHANGE"]}}}}
```

## The ChangeDelta object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ChangeDelta":{"type":"object","description":"Structured delta of the change between signal versions.\nThe structure varies based on the answer type:\n- LIST: {type: \"LIST\", added: string[], removed: string[]}\n- NUMBER: {type: \"NUMBER\", previous: number, current: number, change: number}\n- CURRENCY: {type: \"CURRENCY\", previous: number | object, current: number | object, currency?: string, change: number | string}\n- PERCENTAGE: {type: \"PERCENTAGE\", previous: number, current: number, unit: string, change: number}\n- BOOLEAN: {type: \"BOOLEAN\", previous: boolean, current: boolean}\n- GENERIC: {type: \"GENERIC\", previous: Answer | null, current: Answer | null}\n- SEMANTIC: {type: \"SEMANTIC\", previous: Answer | null, current: Answer | null, similarityScore: number}\n- SEMANTIC_LIST: {type: \"SEMANTIC_LIST\", added: string[], removed: string[], matched: [{previous: string, current: string, similarityScore: number}], similarityScore: number}\n- CONTACTS: {type: \"CONTACTS\", added: Contact[], removed: Contact[], updated: [{previous: Contact, current: Contact, fieldChanges: [...]}]}\n- CONTACT_POSTS: {type: \"CONTACT_POSTS\", added: Post[], removed: Post[], updated: [{previous: Post, current: Post, fieldChanges: [...], engagementGrowth?: EngagementGrowth}]}\n","additionalProperties":true}}}}
```

## The LinkedInCapabilityStatus object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"LinkedInCapabilityStatus":{"type":"object","description":"Status of a single LinkedIn capability during signal generation","required":["capability","used"],"properties":{"capability":{"type":"string","enum":["contact_search","profile_enrichment","company_data","company_search","activity_tracking","post_search"],"description":"LinkedIn capability name"},"used":{"type":"boolean","description":"Whether this capability was used during signal generation"},"rateLimited":{"type":"boolean","description":"Whether this capability was rate-limited"}}}}}}
```

## The LinkedInContext object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"LinkedInContext":{"type":"object","description":"LinkedIn capability usage context for a signal (only present when LinkedIn tools were involved)","required":["linkedInToolsUsed","mode","capabilities"],"properties":{"linkedInToolsUsed":{"type":"boolean","description":"Whether any LinkedIn tools were used"},"mode":{"type":"string","enum":["required","preferred","off"],"description":"LinkedIn connector mode used"},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/LinkedInCapabilityStatus"},"description":"Per-capability status"},"degraded":{"type":"boolean","description":"Whether the signal was degraded due to LinkedIn limitations"}}},"LinkedInCapabilityStatus":{"type":"object","description":"Status of a single LinkedIn capability during signal generation","required":["capability","used"],"properties":{"capability":{"type":"string","enum":["contact_search","profile_enrichment","company_data","company_search","activity_tracking","post_search"],"description":"LinkedIn capability name"},"used":{"type":"boolean","description":"Whether this capability was used during signal generation"},"rateLimited":{"type":"boolean","description":"Whether this capability was rate-limited"}}}}}}
```

## The ChangeContext object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ChangeContext":{"type":"object","description":"Information about changes between signal versions. The changeType field uses graduated change types: INITIAL for first versions, NO_CHANGE for identical or semantically equivalent results, and MINOR_CHANGE/MAJOR_CHANGE for graduated severity (replacing the legacy binary CHANGED type). Subscribers can filter broadly on changedFields (any event on a field) or precisely on addedFields/updatedFields/removedFields without inspecting the delta structure.\n","required":["changeType","changedFields","addedFields","updatedFields","removedFields"],"properties":{"changeType":{"$ref":"#/components/schemas/ChangeType"},"changeDelta":{"oneOf":[{"$ref":"#/components/schemas/ChangeDelta"},{"type":"null"}],"description":"Structured delta of the change (structure varies by answer type)"},"previousSignalId":{"type":["string","null"],"description":"ID of the previous signal version","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"},"changedFields":{"type":"array","items":{"type":"string"},"description":"Union of addedFields + updatedFields + removedFields. Use this to subscribe to any event on a field regardless of change type (e.g. changedFields.includes(\"headline\")). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"addedFields":{"type":"array","items":{"type":"string"},"description":"Fields where new values appeared (new contacts/posts, new certifications, etc.). Entity-level additions use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"updatedFields":{"type":"array","items":{"type":"string"},"description":"Fields where existing values were modified (headline changed, engagement updated, etc.). Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"},"removedFields":{"type":"array","items":{"type":"string"},"description":"Fields where values were removed (contacts left, skills removed, etc.). Entity-level removals use \"contacts\" or \"posts\" as the field name. Empty for scalar answer types (number, boolean, etc.) and NO_CHANGE.\n"}}},"ChangeType":{"type":"string","description":"Type of change detected between signal versions. INITIAL = first signal version, NO_CHANGE = identical or semantically equivalent to previous, MINOR_CHANGE = low-impact semantic change, CHANGED = significant change (legacy, pre-graduated), MAJOR_CHANGE = high-impact semantic change.\n","enum":["INITIAL","NO_CHANGE","CHANGED","MINOR_CHANGE","MAJOR_CHANGE"]},"ChangeDelta":{"type":"object","description":"Structured delta of the change between signal versions.\nThe structure varies based on the answer type:\n- LIST: {type: \"LIST\", added: string[], removed: string[]}\n- NUMBER: {type: \"NUMBER\", previous: number, current: number, change: number}\n- CURRENCY: {type: \"CURRENCY\", previous: number | object, current: number | object, currency?: string, change: number | string}\n- PERCENTAGE: {type: \"PERCENTAGE\", previous: number, current: number, unit: string, change: number}\n- BOOLEAN: {type: \"BOOLEAN\", previous: boolean, current: boolean}\n- GENERIC: {type: \"GENERIC\", previous: Answer | null, current: Answer | null}\n- SEMANTIC: {type: \"SEMANTIC\", previous: Answer | null, current: Answer | null, similarityScore: number}\n- SEMANTIC_LIST: {type: \"SEMANTIC_LIST\", added: string[], removed: string[], matched: [{previous: string, current: string, similarityScore: number}], similarityScore: number}\n- CONTACTS: {type: \"CONTACTS\", added: Contact[], removed: Contact[], updated: [{previous: Contact, current: Contact, fieldChanges: [...]}]}\n- CONTACT_POSTS: {type: \"CONTACT_POSTS\", added: Post[], removed: Post[], updated: [{previous: Post, current: Post, fieldChanges: [...], engagementGrowth?: EngagementGrowth}]}\n","additionalProperties":true}}}}
```

## The WebhookActionConfig object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}}}}}
```

## The CreateSubscriptionActionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateSubscriptionActionRequest":{"type":"object","description":"Create a new action on a subscription. The `type` field determines which\nconfiguration object is required.\n","required":["type"],"properties":{"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}}}}}
```

## The UpdateSubscriptionActionRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateSubscriptionActionRequest":{"type":"object","description":"Update the configuration of an existing action. The action type is\nimmutable; only the type-specific configuration can be changed.\n","properties":{"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}}}}}
```

## The SubscriptionActionResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}}}}}
```

## The ListSubscriptionActionsResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ListSubscriptionActionsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionActionResponse"}},"total":{"type":"integer","description":"Total number of actions for the subscription"},"limit":{"type":"integer","description":"Maximum number of actions returned"},"offset":{"type":"integer","description":"Number of actions skipped"},"hasMore":{"type":"boolean","description":"Whether there are more actions available"}},"required":["items","total","limit","offset","hasMore"]},"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}}}}}
```

## The CreditsBalance object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreditsBalance":{"type":"object","description":"Remaining credits balance for the organization in the current billing period","required":["remainingCredits"],"properties":{"remainingCredits":{"type":"integer","minimum":0,"description":"Number of credits remaining in the current billing period. Each signal creation consumes one credit. Returns 0 when the organization has no credits left; credits reset at the start of each new billing period.\n"}}}}}}
```

## The OrganisationDescription object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"OrganisationDescription":{"type":"object","description":"Descriptive text fields for the organisation","properties":{"general":{"type":"string","description":"General overview of the organisation"},"products":{"type":"string","description":"Description of the organisation's products or services"},"useCases":{"type":"string","description":"Key use cases the organisation addresses"},"valueProp":{"type":"string","description":"The organisation's core value proposition"}}}}}}
```

## The Organisation object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"Organisation":{"type":"object","description":"Organisation profile","required":["name","website","description"],"properties":{"name":{"type":"string","description":"Display name of the organisation"},"website":{"type":"string","description":"Organisation website domain"},"description":{"$ref":"#/components/schemas/OrganisationDescription"}}},"OrganisationDescription":{"type":"object","description":"Descriptive text fields for the organisation","properties":{"general":{"type":"string","description":"General overview of the organisation"},"products":{"type":"string","description":"Description of the organisation's products or services"},"useCases":{"type":"string","description":"Key use cases the organisation addresses"},"valueProp":{"type":"string","description":"The organisation's core value proposition"}}}}}}
```

## The UpdateOrganisationRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateOrganisationRequest":{"type":"object","description":"Fields to update on the organisation profile. All fields are optional.","properties":{"name":{"type":"string","description":"New display name for the organisation"},"website":{"type":"string","description":"New website domain for the organisation"},"description":{"$ref":"#/components/schemas/OrganisationDescription"}}},"OrganisationDescription":{"type":"object","description":"Descriptive text fields for the organisation","properties":{"general":{"type":"string","description":"General overview of the organisation"},"products":{"type":"string","description":"Description of the organisation's products or services"},"useCases":{"type":"string","description":"Key use cases the organisation addresses"},"valueProp":{"type":"string","description":"The organisation's core value proposition"}}}}}}
```

## The ContactListFilters object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactListFilters":{"type":"object","description":"Search filters stored on a contact list","properties":{"companyLinkedInUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"LinkedIn company URLs to scope the search. Supports multiple companies. Omit to search across all companies."},"jobTitles":{"type":"array","items":{"type":"string"},"description":"Job titles to filter contacts by"},"keywords":{"type":"string","description":"Keywords to search for in contact profiles"},"countries":{"type":"array","items":{"type":"string"},"description":"Countries to filter by (ISO 3166-1 alpha-2 codes)"}}}}}}
```

## The ContactList object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactList":{"type":"object","description":"A contact list with metadata and stored search filters","required":["id","name","filters","contactCount","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Unique identifier for the contact list"},"name":{"type":"string","description":"Display name for the contact list"},"filters":{"$ref":"#/components/schemas/ContactListFilters"},"contactCount":{"type":"integer","minimum":0,"description":"Number of contacts stored in this list"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ContactListFilters":{"type":"object","description":"Search filters stored on a contact list","properties":{"companyLinkedInUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"LinkedIn company URLs to scope the search. Supports multiple companies. Omit to search across all companies."},"jobTitles":{"type":"array","items":{"type":"string"},"description":"Job titles to filter contacts by"},"keywords":{"type":"string","description":"Keywords to search for in contact profiles"},"countries":{"type":"array","items":{"type":"string"},"description":"Countries to filter by (ISO 3166-1 alpha-2 codes)"}}}}}}
```

## The ContactListsResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactListsResponse":{"type":"object","description":"Paginated list of contact lists","required":["items","total","limit","offset","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContactList"}},"total":{"type":"integer","description":"Total number of contact lists for this organization"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}},"ContactList":{"type":"object","description":"A contact list with metadata and stored search filters","required":["id","name","filters","contactCount","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Unique identifier for the contact list"},"name":{"type":"string","description":"Display name for the contact list"},"filters":{"$ref":"#/components/schemas/ContactListFilters"},"contactCount":{"type":"integer","minimum":0,"description":"Number of contacts stored in this list"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ContactListFilters":{"type":"object","description":"Search filters stored on a contact list","properties":{"companyLinkedInUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"LinkedIn company URLs to scope the search. Supports multiple companies. Omit to search across all companies."},"jobTitles":{"type":"array","items":{"type":"string"},"description":"Job titles to filter contacts by"},"keywords":{"type":"string","description":"Keywords to search for in contact profiles"},"countries":{"type":"array","items":{"type":"string"},"description":"Countries to filter by (ISO 3166-1 alpha-2 codes)"}}}}}}
```

## The ContactListItem object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactListItem":{"type":"object","description":"Point-in-time snapshot of a contact's data as returned by Sales Navigator at list creation","required":["id","listId","baseContactId","createdAt"],"properties":{"id":{"type":"string","description":"Unique identifier for this list item"},"listId":{"type":"string","description":"ID of the parent contact list"},"baseContactId":{"type":"string","description":"ID of the underlying base_contacts identity record"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"headline":{"type":"string","description":"LinkedIn headline"},"role":{"type":"string","description":"Current job title (from the contact's most recent position)"},"companyName":{"type":"string","description":"Current company name (from the contact's most recent position)"},"location":{"type":"string"},"avatar":{"type":"string","format":"uri","description":"URL to the contact's profile photo"},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels assigned by Sales Navigator (e.g. MANAGER, DIRECTOR, VP)"},"positions":{"type":"array","description":"Full position history returned by Sales Navigator","items":{"type":"object","properties":{"title":{"type":"string"},"companyName":{"type":"string"},"companyUrl":{"type":"string","format":"uri"},"tenureInMonths":{"type":"integer"},"location":{"type":"string"}}}},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"Direct link to the contact's Sales Navigator profile"},"createdAt":{"type":"string","format":"date-time"}}}}}}
```

## The ContactListContactsResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ContactListContactsResponse":{"type":"object","description":"Paginated list of contacts within a contact list","required":["items","total","limit","offset","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ContactListItem"}},"total":{"type":"integer","description":"Total number of contacts in this list"},"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"}}},"ContactListItem":{"type":"object","description":"Point-in-time snapshot of a contact's data as returned by Sales Navigator at list creation","required":["id","listId","baseContactId","createdAt"],"properties":{"id":{"type":"string","description":"Unique identifier for this list item"},"listId":{"type":"string","description":"ID of the parent contact list"},"baseContactId":{"type":"string","description":"ID of the underlying base_contacts identity record"},"firstName":{"type":"string"},"lastName":{"type":"string"},"fullName":{"type":"string"},"headline":{"type":"string","description":"LinkedIn headline"},"role":{"type":"string","description":"Current job title (from the contact's most recent position)"},"companyName":{"type":"string","description":"Current company name (from the contact's most recent position)"},"location":{"type":"string"},"avatar":{"type":"string","format":"uri","description":"URL to the contact's profile photo"},"seniority":{"type":"array","items":{"type":"string"},"description":"Seniority levels assigned by Sales Navigator (e.g. MANAGER, DIRECTOR, VP)"},"positions":{"type":"array","description":"Full position history returned by Sales Navigator","items":{"type":"object","properties":{"title":{"type":"string"},"companyName":{"type":"string"},"companyUrl":{"type":"string","format":"uri"},"tenureInMonths":{"type":"integer"},"location":{"type":"string"}}}},"linkedInSalesNavigatorProfileUrl":{"type":"string","format":"uri","description":"Direct link to the contact's Sales Navigator profile"},"createdAt":{"type":"string","format":"date-time"}}}}}}
```

## The CreateContactListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateContactListRequest":{"type":"object","description":"Request body for creating a contact list","required":["name","filters"],"properties":{"name":{"type":"string","maxLength":200,"description":"Display name for the contact list"},"filters":{"$ref":"#/components/schemas/ContactListFilters"}}},"ContactListFilters":{"type":"object","description":"Search filters stored on a contact list","properties":{"companyLinkedInUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"LinkedIn company URLs to scope the search. Supports multiple companies. Omit to search across all companies."},"jobTitles":{"type":"array","items":{"type":"string"},"description":"Job titles to filter contacts by"},"keywords":{"type":"string","description":"Keywords to search for in contact profiles"},"countries":{"type":"array","items":{"type":"string"},"description":"Countries to filter by (ISO 3166-1 alpha-2 codes)"}}}}}}
```

## The UpdateContactListRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateContactListRequest":{"type":"object","description":"Request body for renaming a contact list","required":["name"],"properties":{"name":{"type":"string","maxLength":200,"description":"New display name for the contact list"}}}}}}
```

## The ScoringProfile object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ScoringProfile":{"type":"object","description":"Named, org-scoped scoring configuration that groups rules for a specific object type.","required":["id","organizationId","type","name","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"string"},"type":{"type":"string","enum":["company","contact"],"description":"Object type this profile scores. Immutable after creation."},"name":{"type":"string"},"description":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The CreateScoringProfileRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateScoringProfileRequest":{"type":"object","required":["profileType","name"],"properties":{"profileType":{"type":"string","enum":["company","contact"],"description":"Object type this profile will score"},"name":{"type":"string"},"description":{"type":["string","null"]}}}}}}
```

## The UpdateScoringProfileRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpdateScoringProfileRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":["string","null"]}}}}}}
```

## The ScoringPointValues object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ScoringPointValues":{"type":"object","description":"Point-value mapping for one rule. The shape varies by the answer type of the\nreferenced signal template — exactly one of `true`/`false`, `ranges`, or `choices`\nis populated.\n","properties":{"true":{"type":"number","description":"Points awarded when a boolean signal answers `true`. Used by `boolean` answer types."},"false":{"type":"number","description":"Points awarded when a boolean signal answers `false`. Used by `boolean` answer types."},"ranges":{"type":"array","description":"Used by `number`, `percentage`, and `currency` answer types. Upper bound is exclusive.","items":{"type":"object","required":["min","max","points"],"properties":{"min":{"type":"number"},"max":{"type":"number"},"points":{"type":"number"}}}},"choices":{"type":"object","description":"Used by `list` answer types. Map of allowed list value → points awarded if present in the answer.","additionalProperties":{"type":"number"}},"mode":{"type":"string","enum":["additive","best-match","contains-all","contains-none","exact-match"],"description":"Optional. Controls how a `list` rule combines matched choices. Defaults\nto `additive` (sum matched, clamp to highest single choice) — the v1\nbehaviour. Other modes:\n\n* `best-match` — award only the highest-scoring matched choice.\n* `contains-all` — award `max(choices)` only if every configured choice appears.\n* `contains-none` — award `max(choices)` only if none of the configured choices appear.\n* `exact-match` — award `sum(choices)` only when the answer set equals the configured set exactly.\n"}}}}}}
```

## The ScoringRule object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ScoringRule":{"type":"object","description":"Maps one signal template to point values for a given dimension within a profile.","required":["id","profileId","signalTemplateId","dimension","pointValues","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"signalTemplateId":{"type":"string","description":"Stable parent template ID (not the version ID). Resolved at compute time across versions."},"dimension":{"type":"string","enum":["fit","urgency"]},"selector":{"type":["string","null"],"description":"Reserved for future selector-based scoring (jsonpath, list filters).\nAlways `null` in v1; multi-selector rules become possible in a later\nrelease without a follow-up migration.\n"},"pointValues":{"$ref":"#/components/schemas/ScoringPointValues"},"createdAt":{"type":"string","format":"date-time"}}},"ScoringPointValues":{"type":"object","description":"Point-value mapping for one rule. The shape varies by the answer type of the\nreferenced signal template — exactly one of `true`/`false`, `ranges`, or `choices`\nis populated.\n","properties":{"true":{"type":"number","description":"Points awarded when a boolean signal answers `true`. Used by `boolean` answer types."},"false":{"type":"number","description":"Points awarded when a boolean signal answers `false`. Used by `boolean` answer types."},"ranges":{"type":"array","description":"Used by `number`, `percentage`, and `currency` answer types. Upper bound is exclusive.","items":{"type":"object","required":["min","max","points"],"properties":{"min":{"type":"number"},"max":{"type":"number"},"points":{"type":"number"}}}},"choices":{"type":"object","description":"Used by `list` answer types. Map of allowed list value → points awarded if present in the answer.","additionalProperties":{"type":"number"}},"mode":{"type":"string","enum":["additive","best-match","contains-all","contains-none","exact-match"],"description":"Optional. Controls how a `list` rule combines matched choices. Defaults\nto `additive` (sum matched, clamp to highest single choice) — the v1\nbehaviour. Other modes:\n\n* `best-match` — award only the highest-scoring matched choice.\n* `contains-all` — award `max(choices)` only if every configured choice appears.\n* `contains-none` — award `max(choices)` only if none of the configured choices appear.\n* `exact-match` — award `sum(choices)` only when the answer set equals the configured set exactly.\n"}}}}}}
```

## The UpsertScoringRuleRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"UpsertScoringRuleRequest":{"type":"object","required":["signalTemplateId","dimension","answerType","pointValues"],"properties":{"signalTemplateId":{"type":"string"},"dimension":{"type":"string","enum":["fit","urgency"]},"answerType":{"type":"string","enum":["boolean","number","percentage","currency","list"],"description":"Drives shape validation for `pointValues`. Must match the referenced\nsignal template's answer type — mismatch surfaces as an\n`INVALID_POINT_VALUES` 422 at write time rather than a silent\ncompute failure later.\n"},"pointValues":{"$ref":"#/components/schemas/ScoringPointValues"}}},"ScoringPointValues":{"type":"object","description":"Point-value mapping for one rule. The shape varies by the answer type of the\nreferenced signal template — exactly one of `true`/`false`, `ranges`, or `choices`\nis populated.\n","properties":{"true":{"type":"number","description":"Points awarded when a boolean signal answers `true`. Used by `boolean` answer types."},"false":{"type":"number","description":"Points awarded when a boolean signal answers `false`. Used by `boolean` answer types."},"ranges":{"type":"array","description":"Used by `number`, `percentage`, and `currency` answer types. Upper bound is exclusive.","items":{"type":"object","required":["min","max","points"],"properties":{"min":{"type":"number"},"max":{"type":"number"},"points":{"type":"number"}}}},"choices":{"type":"object","description":"Used by `list` answer types. Map of allowed list value → points awarded if present in the answer.","additionalProperties":{"type":"number"}},"mode":{"type":"string","enum":["additive","best-match","contains-all","contains-none","exact-match"],"description":"Optional. Controls how a `list` rule combines matched choices. Defaults\nto `additive` (sum matched, clamp to highest single choice) — the v1\nbehaviour. Other modes:\n\n* `best-match` — award only the highest-scoring matched choice.\n* `contains-all` — award `max(choices)` only if every configured choice appears.\n* `contains-none` — award `max(choices)` only if none of the configured choices appear.\n* `exact-match` — award `sum(choices)` only when the answer set equals the configured set exactly.\n"}}}}}}
```

## The ProfileAssignment object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ProfileAssignment":{"type":"object","description":"Links a scoring profile to one company or contact.","required":["id","profileId","organizationId","objectType","objectId","assignedAt"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"organizationId":{"type":"string"},"objectType":{"type":"string","enum":["company","contact"]},"objectId":{"type":"string","description":"For companies, the domain (e.g. `acme.com`); for contacts, the LinkedIn profile URL."},"assignedAt":{"type":"string","format":"date-time"}}}}}}
```

## The CreateProfileAssignmentRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"CreateProfileAssignmentRequest":{"type":"object","required":["profileId","objectType","objectId"],"properties":{"profileId":{"type":"string","format":"uuid"},"objectType":{"type":"string","enum":["company","contact"]},"objectId":{"type":"string","minLength":1,"maxLength":500,"description":"For `company`, the domain; for `contact`, the LinkedIn profile URL."}}}}}}
```

## The BulkCreateProfileAssignmentsRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"BulkCreateProfileAssignmentsRequest":{"type":"object","required":["profileId","objectType","objectIds"],"properties":{"profileId":{"type":"string","format":"uuid"},"objectType":{"type":"string","enum":["company","contact"]},"objectIds":{"type":"array","minItems":1,"maxItems":500,"items":{"type":"string","minLength":1,"maxLength":500},"description":"Capped at 500 per request. Paginate larger lists by issuing\nmultiple requests.\n"}}}}}}
```

## The ScoreContribution object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ScoreContribution":{"type":"object","description":"How a single rule contributed to a dimension score.","required":["ruleId","signalTemplateId","matchedValue","pointsEarned","maxPoints"],"properties":{"ruleId":{"type":"string","format":"uuid"},"signalTemplateId":{"type":"string"},"matchedValue":{"type":"string","description":"Human-readable summary of which choice/range/boolean fired for this rule.\nFormat depends on the rule's answer type and (for list rules) `mode`:\n\n* boolean — `\"true\"` / `\"false\"`\n* number/percentage/currency — `\"250 (100–500)\"` (value plus matched range)\n* list `additive` — comma-joined matched choices, e.g. `\"Salesforce, HubSpot\"`, or `\"no match\"`\n* list `best-match` — the single highest-scoring matched choice, e.g. `\"VP\"`, or `\"no match\"`\n* list `contains-all` — `\"A, B, C\"` when satisfied, `\"missing: B, C\"` (alphabetically sorted) when not\n* list `contains-none` — `\"none present\"` when satisfied, `\"found: X, Y\"` when not\n* list `exact-match` — comma-joined matched choices when the answer set equals the configured set, otherwise `\"set mismatch\"`\n"},"pointsEarned":{"type":"number","description":"Points this rule contributed. Always in `[0, maxPoints]`."},"maxPoints":{"type":"number","description":"Maximum points this rule could have contributed."}}}}}}
```

## The ScoreResult object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ScoreResult":{"type":"object","description":"Latest computed score for one `(profile, object, dimension)` triple. Includes the\nper-rule contribution breakdown so the score is always explainable, plus a delta\nview of the previous score.\n","required":["id","profileId","organizationId","objectType","objectId","dimension","score","contributions","signalCoverage","totalRules","computedAt","version"],"properties":{"id":{"type":"string","format":"uuid"},"profileId":{"type":"string","format":"uuid"},"organizationId":{"type":"string"},"objectType":{"type":"string","enum":["company","contact"]},"objectId":{"type":"string"},"dimension":{"type":"string","enum":["fit","urgency"]},"score":{"type":"number","minimum":0,"maximum":100,"description":"Score in `[0, 100]` computed as `(earned / maxPossible) * 100`. **All rules\ncount toward the denominator** regardless of whether a signal answer exists,\nso low-coverage scores stay conservatively low.\n"},"previousScore":{"type":["number","null"],"description":"Score from the previous compute, or `null` on first compute."},"contributions":{"type":"array","items":{"$ref":"#/components/schemas/ScoreContribution"}},"previousContributions":{"type":["array","null"],"items":{"$ref":"#/components/schemas/ScoreContribution"}},"signalCoverage":{"type":"integer","description":"Number of rules with a signal answer available at compute time."},"totalRules":{"type":"integer","description":"Total rules in the profile/dimension."},"computedAt":{"type":"string","format":"date-time"},"version":{"type":"integer","description":"Increments on every recompute."}}},"ScoreContribution":{"type":"object","description":"How a single rule contributed to a dimension score.","required":["ruleId","signalTemplateId","matchedValue","pointsEarned","maxPoints"],"properties":{"ruleId":{"type":"string","format":"uuid"},"signalTemplateId":{"type":"string"},"matchedValue":{"type":"string","description":"Human-readable summary of which choice/range/boolean fired for this rule.\nFormat depends on the rule's answer type and (for list rules) `mode`:\n\n* boolean — `\"true\"` / `\"false\"`\n* number/percentage/currency — `\"250 (100–500)\"` (value plus matched range)\n* list `additive` — comma-joined matched choices, e.g. `\"Salesforce, HubSpot\"`, or `\"no match\"`\n* list `best-match` — the single highest-scoring matched choice, e.g. `\"VP\"`, or `\"no match\"`\n* list `contains-all` — `\"A, B, C\"` when satisfied, `\"missing: B, C\"` (alphabetically sorted) when not\n* list `contains-none` — `\"none present\"` when satisfied, `\"found: X, Y\"` when not\n* list `exact-match` — comma-joined matched choices when the answer set equals the configured set, otherwise `\"set mismatch\"`\n"},"pointsEarned":{"type":"number","description":"Points this rule contributed. Always in `[0, maxPoints]`."},"maxPoints":{"type":"number","description":"Maximum points this rule could have contributed."}}}}}}
```

## The ComputeScoresRequest object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ComputeScoresRequest":{"type":"object","required":["objectType","objectIds"],"properties":{"objectType":{"type":"string","enum":["company","contact"]},"objectIds":{"type":"array","minItems":1,"maxItems":500,"items":{"type":"string","minLength":1,"maxLength":500},"description":"For `company`, domains; for `contact`, LinkedIn profile URLs.\nCapped at 500 per request — paginate larger lists.\n"}}}}}}
```

## The ComputeScoresAcceptedResponse object

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"components":{"schemas":{"ComputeScoresAcceptedResponse":{"type":"object","description":"Returned by `POST /v1/scoring/compute` with status 202 once recompute\nrecompute jobs have been queued. `failed > 0` means some dispatches\nfailed (logged server-side); the request as a whole is still \"accepted\"\nsince at least one job was queued. If every dispatch fails the endpoint\nreturns 502 instead.\n","required":["queued","failed"],"properties":{"queued":{"type":"integer","minimum":0,"description":"Number of objects whose recompute job was successfully queued."},"failed":{"type":"integer","minimum":0,"description":"Number of objects whose recompute dispatch failed."}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developers.saber.app/models.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
