Lusha Signals API

Real-world activity data for contacts and companies — promotions and job changes on the contact side; headcount movement, hiring surges, web traffic, IT spend, news classes and LinkedIn activity intent on the company side — as raw dated events or as a single 0-1 momentum score per entity.

OpenAPI Specification

lusha-signals-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Lusha API Documentation Signals API
  version: ''
  x-logo:
    url: https://www.lusha.com/logo.png
  license:
    name: Proprietary
    url: https://lusha.com/legal/terms
  description: "<blockquote class=\"callout\">\n\n **This is the Lusha API V3 documentation.** \n \n V3 introduces a new search-then-enrich pattern, bulk operations, AI-powered lookalikes, and richer filter capabilities. All endpoints are under `https://api.lusha.com/v3/`.\n\n  For more information on V3, refer to the [Migration Guide](/tutorials/v3-migration-guide).\n\n</blockquote>\n\n  --- \n\nLusha provides a RESTful API for querying a comprehensive dataset of business profiles and company information. Built for teams running prospecting, enrichment, automation, and analytics workflows that need accurate, continuously updated business data. The API supports both real-time and bulk use cases.\n\nUse the Lusha API to **search for new prospects**, **enrich existing records**, **react to real-world changes**, and **expand coverage** with AI-powered lookalike recommendations.\n\n> All API requests must be made over **HTTPS**. All responses are returned in **JSON** format.\n\n--- \n## Available Endpoints\n\n| Category | Description |\n|---|---|\n| [**Search**](#tag/Search) | Find contacts or companies using known identifiers |\n| [**Enrich**](#tag/Enrich) | Retrieve full profile data for contacts or companies by ID |\n| [**Search & Enrich**](#tag/Search-and-Enrich) | Find and retrieve full contact or company data in a single call |\n| [**Prospecting**](#tag/Prospecting) | Filter-based search across contacts and companies |\n| [**Lookalikes**](#tag/Lookalikes) | AI-powered recommendations for similar contacts and companies |\n| [**Buying Group**](#tag/Buying-Group) | Identify decision makers, champions, and end users within target accounts |\n| [**Contacts Tables**](#tag/Contacts-Tables) | Persist, organize, and enrich contacts in reusable tables |\n| [**Companies Tables**](#tag/Companies-Tables) | Persist, organize, and enrich companies in reusable tables |\n| [**Signals**](#tag/Signals) | Real-world activity data for contacts and companies |\n| [**Website Visitors**](#tag/Website-Visits) | Companies ranked by website-visit signals for your tracked domains |\n| [**Filters**](#tag/Filters) | Discover valid filter values for prospecting |\n| [**Webhooks**](#tag/Webhooks) | Real-time signal notifications via HTTP callbacks |\n| [**Account**](#tag/Account) | Usage, credits, rate limits, and pricing |\n\n<blockquote class=\"callout\">\n\n **Waterfall Reveal for Contact Enrichment.**\n\n  Enrich Contacts now supports `waterfallEnabled`. Fall through to your enabled third-party providers when Lusha's own data has no match, for extra reach on hard-to-match contacts. On by default once your account has it turned on - pass `waterfallEnabled: false` to opt a specific call out. [See Enrich Contacts](#operation/enrichContacts).\n\n</blockquote>\n\n---\n\n## Data Source and Privacy\n\n**Lusha is a search platform.** The data provided is not created or directly managed by Lusha. It is sourced from publicly available information and trusted business partners.\n\nFor more details on how we collect and handle data, see our [Privacy Policy](https://lusha.com/legal/privacy-notice/).\n\n---\n\n## Authentication\n\nAll API requests require an **API key** linked to your Lusha account and plan. Pass your key in the `api_key` request header on every call.\n\n> Generate and manage your API key in the [Lusha dashboard](https://dashboard.lusha.com/enrich/api).\n\nStore your API key securely and use it only in **server-side environments**.\n\n---\n\n## Rate Limiting\n\nLusha enforces rate limits on a per-plan basis to ensure fair usage and platform stability. Limits are applied across multiple time windows (per minute, per hour, and per day), and vary depending on your account plan.\n\nRate limits for the **Credit Usage API** differ from standard endpoint limits.\n\n> **Note:** To check your current plan's limits, visit the [Lusha Help Center](https://info.lusha.com/en/articles/163856-all-there-is-to-know-about-lusha-s-api) or contact your account manager.\n\n**Rate Limit Response Headers**\n\n| Header | Description |\n|--------|-------------|\n| `x-rate-limit-daily` | Total requests allowed per day |\n| `x-daily-requests-left` | Requests remaining in your daily quota |\n| `x-daily-usage` | Requests made in the current daily period |\n| `x-rate-limit-hourly` | Total requests allowed per hour |\n| `x-hourly-requests-left` | Requests remaining in your hourly quota |\n| `x-hourly-usage` | Requests made in the current hourly period |\n| `x-rate-limit-minute` | Total requests allowed per minute |\n| `x-minute-requests-left` | Requests remaining in the current minute window |\n| `x-minute-usage` | Requests made in the current minute window |\n\n---\n## Error Codes\n\nLusha uses standard HTTP status codes to indicate the result of each request.\n\n| Code | Name | Description |\n|------|------|-------------|\n| `200` | OK | Request was successful |\n| `400` | Bad Request | Request is malformed or missing required fields |\n| `401` | Unauthorized | API key is missing or invalid |\n| `402` | Payment Required | Insufficient credits or payment needed |\n| `403` | Forbidden | Account is inactive. Contact support@lusha.com |\n| `404` | Not Found | Endpoint or resource does not exist |\n| `429` | Too Many Requests | Rate limit or daily quota exceeded |\n| `451` | Unavailable For Legal Reasons | Request blocked due to GDPR regulations |\n| `499` | Client Closed Request | Request timed out before completing |\n| `5XX` | Server Error | Issue on Lusha's end. Retry with exponential backoff |\n\n**Error Response Format**\n\n```json\n{\n  \"statusCode\": 400,\n  \"message\": \"Invalid request parameters\"\n}\n```\n\n**Tables-specific error codes**\n\n| Code | Status | Meaning |\n|---|---|---|\n| `TABLE_NOT_FOUND` | 404 | The `table_id` does not exist or is not accessible to this account |\n| `COLUMN_NOT_FOUND` | 404 | The `column_id` does not exist on the given table |\n| `TABLE_NAME_CONFLICT` | 409 | A table with this name already exists |\n\nTables error bodies use the shape `{ \"message\": \"...\", \"code\": <status>, ... }` rather than the `statusCode`/`errors` shape used elsewhere in this doc.\n\n**Limits:** up to 500 entity IDs per add/remove call · max 50,000 entities per table · max 500 tables per account · `page` 0–100 · `size` default 100.\n\n**Tips for Handling Errors**\n\n- Verify your API key is correct and active\n- Read the `message` field for specific troubleshooting details\n- For `429` errors, wait before retrying\n- For `5XX` errors, use exponential backoff before retrying\n"
  contact:
    name: Lusha Support
    url: https://api.lusha.com
    email: support@lusha.com
  termsOfService: https://lusha.com/legal/terms
  x-privacy-policy:
    name: Privacy Policy
    url: https://lusha.com/legal/privacy-notice/
servers:
- url: https://api.lusha.com
  description: Production server
security:
- ApiKeyAuth: []
tags:
- name: Signals
  description: 'Real-world activity data for contacts and companies.


    Signals are available as standalone endpoints or as an optional `signals` filter on Search and Prospecting endpoints.



    **Contact signal types:** `promotion`, `companyChange`, `allSignals`


    ----


    **Company signal types:** `headcountIncrease1m/3m/6m/12m`, `headcountDecrease1m/3m/6m/12m`, `surgeInHiring`, `surgeInHiringByDepartment`, `surgeInHiringByLocation`, `websiteTrafficIncrease`, `websiteTrafficDecrease`, `itSpendIncrease`, `itSpendDecrease`, `riskNews`, `commercialActivityNews`, `corporateStrategyNews`, `financialEventsNews`, `peopleNews`, `marketIntelligenceNews`, `productActivityNews`, `allSignals`


    ----


    **Signal Score:** Use [Score Companies by Signal Activity](#operation/getCompanySignalScores) or [Score Contacts by Signal Activity](#operation/getContactSignalScores) to get a single aggregate momentum score ([0,1]) plus the active signal breakdown for a batch of entities, rather than a raw event list.


    ----


    Credits are charged per matched signal per result via `showSignalsContact` or `showSignalsCompany`.


    Pass `tableId` to also persist matching results into an existing table. See [Contacts Tables](#tag/Contacts-Tables) or [Companies Tables](#tag/Companies-Tables).

    '
  x-tag-expanded: true
paths:
  /v3/contacts/signals:
    post:
      tags:
      - Signals
      summary: Contact Signals
      operationId: getContactSignals
      description: 'Retrieve signal events for a list of contacts — job changes and promotions.


        Pass up to 100 contact `ids`. Use `signalTypes` to specify which events to return (`promotion`, `companyChange`, or `allSignals`). Optionally set a `startDate` to limit results to recent activity.


        > **Billing:** Charged per matched signal per result via the `showSignalsContact` action.


        > **Persisting to a table:** Pass `tableId` to also add these contacts to an existing table and populate the Signals column. See [Contacts Tables](#tag/Contacts-Tables).

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/V3ContactSignalsRequest'
            example:
              ids:
              - '4389064624'
              - '4389064654'
              signalTypes:
              - allSignals
              startDate: '2025-01-01'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V3ContactSignalsResponse'
              example:
                results:
                - id: '115889'
                  companyChange:
                  - id: '115889'
                    signalDate: '2025-02-01'
                    previousCompany: ZoomInfo
                    newCompany: Lusha
                  promotion: []
                startDate: '2025-01-01'
                endDate: '2025-03-01'
                billing:
                  creditsCharged: 1
                  resultsReturned: 1
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v3/companies/signals:
    post:
      tags:
      - Signals
      summary: Company Signals
      operationId: getCompanySignals
      description: 'Retrieve signal events for a list of companies — hiring activity, headcount changes, web traffic, IT spend, and news.


        Pass up to 100 company `ids`. Use `signalTypes` to specify which signals to return (or use `allSignals`). Optionally set a `startDate` to limit results to recent activity.


        > **Billing:** Charged per matched signal per result via the `showSignalsCompany` action.


        > **Persisting to a table:** Pass `tableId` to also add these companies to an existing table and populate the Signals column. See [Companies Tables](#tag/Companies-Tables).

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/V3CompanySignalsRequest'
            example:
              ids:
              - '16303253'
              signalTypes:
              - allSignals
              startDate: '2025-01-01'
              maxResultsPerSignal: 10
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V3CompanySignalsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v3/contacts/signals/types:
    get:
      tags:
      - Signals
      summary: Get Contact Signal Types
      operationId: getContactSignalTypes
      description: 'Returns the full list of supported signal types for contacts.

        '
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactSignalTypesResponse'
              example:
                signalTypes:
                - allSignals
                - promotion
                - companyChange
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /v3/companies/signals/types:
    get:
      tags:
      - Signals
      summary: Get Company Signal Types
      operationId: getCompanySignalTypes
      description: 'Returns the full list of supported signal types for companies.

        '
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanySignalTypesResponse'
              example:
                signalTypes:
                - allSignals
                - linkedinActivityIntent
                - websiteTrafficDecrease
                - websiteTrafficIncrease
                - itSpendIncrease
                - itSpendDecrease
                - surgeInHiring
                - headcountIncrease1m
                - headcountIncrease3m
                - headcountIncrease6m
                - headcountIncrease12m
                - headcountDecrease1m
                - headcountDecrease3m
                - headcountDecrease6m
                - headcountDecrease12m
                - surgeInHiringByDepartment
                - surgeInHiringByLocation
                - riskNews
                - commercialActivityNews
                - corporateStrategyNews
                - financialEventsNews
                - peopleNews
                - marketIntelligenceNews
                - productActivityNews
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /v3/companies/signals/filters:
    get:
      tags:
      - Signals
      summary: Get Company Signal Filters (Discovery)
      operationId: getCompanySignalFilters
      description: 'Returns all available filter types for company signals and whether each requires a search query.

        '
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FilterTypesDiscoveryResponse'
              example:
                availableFilters:
                - filterType: newsEventTypes
                  requiresQuery: false
                - filterType: hiringByDepartments
                  requiresQuery: false
                - filterType: hiringByLocations
                  requiresQuery: true
                - filterType: intentCategories
                  requiresQuery: false
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /v3/companies/signals/filters/{filterType}:
    get:
      tags:
      - Signals
      summary: Get Company Signal Filter Values
      operationId: getCompanySignalFilterValues
      description: 'Returns valid values for a single company signal filter type.


        | Filter type | Query required? |

        |---|---|

        | `newsEventTypes` | No |

        | `hiringByDepartments` | No |

        | `hiringByLocations` | Yes (2-256 chars) |

        | `intentCategories` | No — the `query` parameter is not supported for this filter type; passing one returns `400` |

        '
      parameters:
      - name: filterType
        in: path
        required: true
        schema:
          type: string
          enum:
          - newsEventTypes
          - hiringByDepartments
          - hiringByLocations
          - intentCategories
      - name: query
        in: query
        required: false
        schema:
          type: string
          minLength: 2
          maxLength: 256
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FilterValuesResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /v3/companies/signal-score:
    post:
      tags:
      - Signals
      summary: Score Companies by Signal Activity
      operationId: getCompanySignalScores
      description: 'Score companies by their active buying signals. Returns the aggregate Signal Score - a `[0, 1]` value reflecting the fraction of the company''s active signals - plus the active signal breakdown.


        Accepts up to 100 companies, each identified by exactly one of `id`, `domain`, `name`, or `email`. All identifiers are resolved to Lusha company IDs server-side before scoring.


        Each result is one of:

        - A **scored entry** - `signalScore`, `signalTypes`, and `noActiveSignals`.

        - A **`NOT_FOUND`** entry - the company service could not resolve the supplied identifier.

        - A **`NO_SCORE`** entry - the company resolved, but the scoring engine returned nothing for it.


        > **Billing:** 1 credit is charged per scored row via `signal_score_company_reveal`. This action is currently limited-availability - while it isn''t yet seeded on an account''s pricebook, the endpoint stays free (`billing.creditsCharged` is `0`). Error rows (`NOT_FOUND` / `NO_SCORE`) are never charged.

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/V3SignalScoreCompaniesRequest'
            example:
              companies:
              - clientReferenceId: ref-1
                id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
              - clientReferenceId: ref-2
                domain: www.microsoft.com
              - clientReferenceId: ref-3
                name: Apple
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V3SignalScoreCompaniesResponse'
              example:
                requestId: 5d6f13d2-f6b0-4e55-85d5-04e17f932c1a
                results:
                - clientReferenceId: ref-1
                  id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
                  name: Acme Corp
                  domain: www.acmecorp.io
                  signalScore: 0.42
                  signalTypes:
                  - hiringSignalIncrease
                  - websiteVisit
                  noActiveSignals: false
                - clientReferenceId: ref-2
                  id: v1.6789ZyXwVuTsRqPoNmLkJiHgFeDcBa01
                  name: Microsoft
                  domain: www.microsoft.com
                  signalScore: 0
                  signalTypes: []
                  noActiveSignals: true
                - clientReferenceId: ref-3
                  domain: nope-xyz.com
                  error:
                    code: NOT_FOUND
                    message: Company not found
                billing:
                  creditsCharged: 2
                  resultsReturned: 2
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /v3/contacts/signal-score:
    post:
      tags:
      - Signals
      summary: Score Contacts by Signal Activity
      operationId: getContactSignalScores
      description: 'Score contacts by their active buying signals. Returns the aggregate Signal Score - a `[0, 1]` value - plus the active signal breakdown per contact.


        Accepts up to 100 contacts. Each contact is resolved to a Lusha person ID and company ID server-side (identity only - no PII is revealed) before scoring. Provide one of:

        - `id` (encrypted Lusha contact ID)

        - `linkedinUrl`

        - `email`

        - `firstName` + `lastName` + (`companyName` or `companyDomain`)


        Each result is one of:

        - A **scored entry** - `signalScore`, `signalTypes`, and `noActiveSignals`.

        - A **`NOT_FOUND`** entry - identity resolution failed for the supplied identifier.

        - A **`NO_SCORE`** entry - the contact resolved, but the scoring engine returned nothing for it.


        > **Note:** A full outage of the identity-resolution provider is never masked as `NOT_FOUND` - it returns a retryable `502` instead, so callers can retry rather than treating the batch as authoritatively unresolved.


        > **Billing:** 1 credit is charged per scored row via `signal_score_contact_reveal`. This action is currently limited-availability - while it isn''t yet seeded on an account''s pricebook, the endpoint stays free (`billing.creditsCharged` is `0`). Error rows (`NOT_FOUND` / `NO_SCORE`) are never charged.

        '
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/V3SignalScoreContactsRequest'
            example:
              contacts:
              - clientReferenceId: ref-1
                id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
              - clientReferenceId: ref-2
                linkedinUrl: https://linkedin.com/in/johndoe
              - clientReferenceId: ref-3
                firstName: Jane
                lastName: Doe
                companyDomain: acme.com
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V3SignalScoreContactsResponse'
              example:
                requestId: 5d6f13d2-f6b0-4e55-85d5-04e17f932c1a
                results:
                - clientReferenceId: ref-1
                  id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
                  fullName: Jane Doe
                  company:
                    id: v1.6789ZyXwVuTsRqPoNmLkJiHgFeDcBa01
                    name: Acme Corp
                    domain: acme.com
                  signalScore: 0.3
                  signalTypes:
                  - promotion
                  noActiveSignals: false
                - clientReferenceId: ref-2
                  error:
                    code: NOT_FOUND
                    message: Contact not found
                billing:
                  creditsCharged: 1
                  resultsReturned: 1
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '502':
          $ref: '#/components/responses/BadGateway'
components:
  schemas:
    LinkedinActivityIntentCompanyMention:
      type: object
      description: A company referenced in a LinkedIn activity intent post.
      properties:
        id:
          type:
          - string
          - 'null'
          description: Lusha company ID, or null if the company couldn't be resolved to a Lusha record.
          example: '16303253'
        name:
          type: string
          example: Lusha
        linkedinUrl:
          type: string
          example: https://www.linkedin.com/company/lushadata
    LinkedinActivityIntentItem:
      type: object
      properties:
        companyId:
          type: number
          description: Lusha company ID this activity belongs to.
          example: 16303253
        activityPublicationDate:
          type: string
          format: date
          description: Date the post was published.
          example: '2026-05-12'
        signalCategory:
          type: string
          description: Post classification.
          example: Technology or Stack Discussion
        intentTopics:
          type: array
          description: Detected Bombora topics and their category.
          items:
            $ref: '#/components/schemas/LinkedinActivityIntentTopic'
        author:
          $ref: '#/components/schemas/LinkedinActivityIntentPerson'
        contactsMentioned:
          type: array
          items:
            $ref: '#/components/schemas/LinkedinActivityIntentPerson'
        companiesMentioned:
          type: array
          items:
            $ref: '#/components/schemas/LinkedinActivityIntentCompanyMention'
        activityUrl:
          type: string
          description: URL of the source post.
          example: https://www.linkedin.com/feed/update/urn:li:activity:1234567890
        activitySummary:
          type:
          - string
          - 'null'
          description: AI-generated summary. Never contains the raw post text.
          example: Discusses adopting a new cloud security stack ahead of Q3 rollout.
        activityLikes:
          type: integer
          default: 0
          example: 42
        activityComments:
          type: integer
          default: 0
          example: 5
        activityShares:
          type: integer
          default: 0
          example: 3
        activityType:
          type: string
          example: post
    V3ContactSignalsRequest:
      type: object
      required:
      - ids
      - signalTypes
      properties:
        ids:
          type: array
          items:
            type: string
          minItems: 1
          maxItems: 100
          example:
          - '4389064624'
          - '4389064654'
        signalTypes:
          type: array
          items:
            type: string
            enum:
            - allSignals
            - promotion
            - companyChange
          example:
          - allSignals
        startDate:
          type: string
          format: date
          example: '2025-01-01'
        maxResultsPerSignal:
          type: integer
          minimum: 1
          maximum: 100
          example: 10
        tableId:
          type: string
          description: Optional. If provided, these contacts are also added to this table (if not already present) and the Signals column is populated. See the Tables API.
          example: '482910'
    V3CompanySignalsResponse:
      type: object
      properties:
        results:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                example: '16303253'
              companyName:
                type: string
                example: Lusha
              domain:
                type: string
                example: lusha.com
              linkedinActivityIntent:
                type: array
                items:
                  $ref: '#/components/schemas/LinkedinActivityIntentItem'
            additionalProperties:
              type: array
              items:
                type: object
                additionalProperties: true
        startDate:
          type: string
        endDate:
          type: string
        tableWrite:
          $ref: '#/components/schemas/TableWrite'
        billing:
          $ref: '#/components/schemas/V3Billing'
    V3CompanySignalsRequest:
      type: object
      required:
      - ids
      - signalTypes
      properties:
        ids:
          type: array
          items:
            type: string
          minItems: 1
          maxItems: 100
          example:
          - '16303253'
        signalTypes:
          type: array
          items:
            type: string
            enum:
            - allSignals
            - linkedinActivityIntent
            - websiteTrafficDecrease
            - websiteTrafficIncrease
            - itSpendIncrease
            - itSpendDecrease
            - surgeInHiring
            - headcountIncrease1m
            - headcountIncrease3m
            - headcountIncrease6m
            - headcountIncrease12m
            - headcountDecrease1m
            - headcountDecrease3m
            - headcountDecrease6m
            - headcountDecrease12m
            - surgeInHiringByDepartment
            - surgeInHiringByLocation
            - riskNews
            - commercialActivityNews
            - corporateStrategyNews
            - financialEventsNews
            - peopleNews
            - marketIntelligenceNews
            - productActivityNews
          example:
          - allSignals
        startDate:
          type: string
          format: date
          description: 'For linkedinActivityIntent, results are limited to a trailing 90-day window regardless of the value passed (legal requirement). Other signal types are unaffected.

            '
          example: '2025-01-01'
        maxResultsPerSignal:
          type: integer
          minimum: 1
          maximum: 100
          description: 'For linkedinActivityIntent, results are capped at 50 per company regardless of the value passed. Other signal types use the requested value as-is (1-100).

            '
          example: 10
        tableId:
          type: string
          description: Optional. If provided, these companies are also added to this table (if not already present) and the Signals column is populated. See the Tables API.
          example: '583021'
        filters:
          type: object
          properties:
            include:
              type: object
              properties:
                intentCategories:
                  type: array
                  items:
                    type: string
                  description: 'Refines linkedinActivityIntent results by Bombora intent category. Only applies when linkedinActivityIntent is requested (via signalTypes or allSignals). See GET /v3/companies/signals/filters/intentCategories for valid values.

                    '
                  example:
                  - Technology
                  - Business
    V3Billing:
      type: object
      description: Credit usage summary for a V3 API request
      properties:
        creditsCharged:
          type: integer
          description: Total credits charged for this request
          example: 3
        resultsReturned:
          type: integer
          description: Number of successful results returned
          example: 1
    V3SignalScoreCompaniesRequest:
      type: object
      required:
      - companies
      properties:
        companies:
          type: array
          items:
            $ref: '#/components/schemas/V3SignalScoreCompanyItem'
          minItems: 1
          maxItems: 100
    TableWrite:
      type: object
      description: 'Added to a Prospecting, Enrich, Signals, or Lookalike response when `tableId` is passed on the request. The primary response is unaffected even if the table write fails.

        '
      properties:
        tableId:
          type: string
          example: '482910'
        added:
          type: integer
          description: Number of new entities added to the table by this call.
          example: 3
        alreadyPresent:
          type: integer
          description: Number of entities from this call that were already in the table.
          example: 2
        columnsCreated:
          type: integer
          description: Number of columns auto-created by this call (e.g. a Signals column created on first use).
          example: 0
        rowsProcessed:
          type: integer
          description: Number of rows the column-run touched as part of this call.
          example: 5
        rowsCharged:
          type: integer
          description: Number of those rows that incurred a credit charge.
          example: 5
        rowsAlreadyPaidInTable:
          type: integer
          description: Number of those rows that were already paid for i

# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lusha/refs/heads/main/openapi/lusha-signals-api-openapi.yml