# Get Acquisition Signals Source: https://docs.trysignalbase.com/api-reference/acquisition-signals/endpoint/get GET /signals/acquisitions Fetch acquisition signals with filtering, pagination, and search capabilities. Returns acquisition events with acquired company details, acquiring company information, deal amounts, and source references. # Introduction Source: https://docs.trysignalbase.com/api-reference/acquisition-signals/introduction Access real-time acquisition signals with advanced filtering, sorting, and pagination ## Welcome to the Acquisition Signals API The Acquisition Signals API provides access to comprehensive, real-time acquisition signals aggregated from across the web. Our platform continuously monitors and collects acquisition activity, giving you up-to-date information on M\&A deals, acquirers, and market trends. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?count=true&countries=US,GB&date_preset=last_90d" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 8, "totalCount": 152, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.acquisitions", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Real-time Signals**: Acquisition signals are aggregated continuously from web sources * **Advanced Filtering**: Filter by countries, categories, subcategories, date ranges, and search terms * **Numeric Range Filters**: Filter by amount, employee count, and founded year * **Flexible Sorting**: Sort by date, amount, or employee count * **Verification Status**: Filter signals by verified, unverified, or pending status * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Rich Response Data**: Detailed company information, acquisition amounts, and acquirer data * **Credit-based Usage**: Transparent credit consumption per API call ## Company fields and acquirer object The acquired company uses **`companyCountry`** and **`companySubcategory`** on the root of each signal. The nested **`acquiringCompany`** object uses the same naming (**`companyCountry`**, **`companySubcategory`**) so all company HQ fields are consistent across the API. See [Company fields in signal responses](/enums#company-fields-in-signal-responses). ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Real-time aggregation ensures up-to-date signals * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require authentication using a Bearer token passed in the Authorization header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?page=1&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Matching by Company URL (Recommended) If you know a company's website domain or LinkedIn page, query by URL instead of by name. Name search is fuzzy and can return lookalikes (`Novartis` also matches `Novartis UK`); URL identifiers match exactly one company. ```bash theme={null} # By website domain curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" # By LinkedIn company page curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?company_linkedin_url=linkedin.com/company/novartis" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Accepted input formats.** URL identifiers are normalized before matching, so equivalent variants return the same results: * `company_domain`: `novartis.com`, `www.novartis.com`, `https://www.novartis.com/`, `https://novartis.com/any/path` — scheme, `www.`, port, path and trailing slash are ignored. Values that can't be reduced to a domain return `400`. * `company_linkedin_url`: `linkedin.com/company/novartis`, `https://www.linkedin.com/company/Novartis/` — `http`/`https`, `www.` and trailing slash are ignored, the slug is case-insensitive. URLs that aren't LinkedIn *company* pages (e.g. personal `/in/` profiles) return `400`. **Strict matching.** When a URL identifier is provided, the API never falls back to fuzzy name matching: if no company matches, the result is empty. Identifiers combine with `AND` — `company_domain=novartis.com&company_name=Acme` returns empty because they disagree. **Match confidence.** Every result row includes `match_confidence`: | Value | Meaning | | ------- | ------------------------------------------------------ | | `exact` | Matched via `company_domain` or `company_linkedin_url` | | `fuzzy` | Matched via `company_name` partial match only | | `none` | No company identifier was part of the query | ## Query Parameters ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Date Filters | Parameter | Type | Description | | ------------- | ------ | ------------------------------------------------------------------------------------------------------------ | | `dateFrom` | string | Filter by date from (ISO-8601 string) | | `dateTo` | string | Filter by date to (ISO-8601 string) | | `date_preset` | string | Relative date shorthand — takes precedence over `dateFrom`/`dateTo`. See [Date Presets](/enums#date-presets) | ### Company Filters | Parameter | Type | Description | | ---------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `countries` | string | **Acquired** company HQ. Comma-separated country codes (e.g., `US,GB,DE`). Allowlist | | `exclude_countries` | string | **Acquired** company HQ denylist. Comma-separated country names or codes to **exclude** (e.g. `China` or `CN`). Deals whose acquired company has an unknown HQ are kept | | `acquirer_countries` | string | **Acquiring** company HQ. Comma-separated country codes (allowlist). Independent of `countries`/`exclude_countries`, which target the acquired company | | `exclude_acquirer_countries` | string | **Acquiring** company HQ denylist. Comma-separated country names or codes to **exclude**. Deals with an unknown acquirer HQ are kept | | `categories` | string | Pipe-separated company categories / industries | | `subcategories` | string | Comma-separated subcategory IDs (e.g., `ai,fintech,saas`) | | `industry` | string | Comma-separated exact industry names | | `company_domain` | string | **Recommended.** Acquired company website domain (e.g. `novartis.com`). Strict match — see [Matching by company URL](#matching-by-company-url-recommended) | | `company_linkedin_url` | string | **Recommended.** Acquired company LinkedIn URL (e.g. `linkedin.com/company/novartis`). Strict match | | `company_name` | string | Search by acquired company name (partial match, fuzzy). Prefer the URL identifiers above | | `search` | string | Free-text search across company name & industry | ### Numeric Range Filters | Parameter | Type | Description | | -------------------- | ------- | ------------------------------------------------------- | | `amount_min` | integer | Minimum acquisition amount in whole dollars (not cents) | | `amount_max` | integer | Maximum acquisition amount in whole dollars (not cents) | | `employee_count_min` | integer | Minimum company employee count | | `employee_count_max` | integer | Maximum company employee count | | `founded_year_min` | integer | Minimum company founded year | | `founded_year_max` | integer | Maximum company founded year | ### Acquisition-specific Filters | Parameter | Type | Description | | --------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------- | | `currency` | string | Filter by currency (ISO 4217 code). Almost all acquisitions are `USD`; a few are `EUR`. See [Currency Values](/enums#currency-values) | | `verification_status` | string | Comma-separated statuses: `verified`, `unverified`, `pending` | | `acquiring_company` | string | Search by acquiring company name (partial match) | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------------- | ---------------------------------------------------------------------- | | `sort_by` | string | `occurred_at` | Sort field: `occurred_at`, `discovered_at`, `amount`, `employee_count` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [...], "pagination": { "currentPage": 1, "totalPages": 10, "totalCount": 200, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.acquisitions", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Filter by Date Preset and Country ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?date_preset=last_90d&countries=US,GB" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Amount and Acquiring Company ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?amount_min=10000000&acquiring_company=Google" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Subcategory with Sorting ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?subcategories=ai&sort_by=amount&sort_order=desc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Combined Filters ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/acquisitions?date_preset=last_30d&countries=US&verification_status=verified&sort_by=discovered_at&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Get Companies Source: https://docs.trysignalbase.com/api-reference/companies/endpoint/get GET /companies Browse and search companies with filtering, pagination, and sorting. Returns company profiles with industry, headcount, location, and metadata — independent of any signal data. # Introduction Source: https://docs.trysignalbase.com/api-reference/companies/introduction Browse and search companies independently with filtering by industry, size, location, and more ## Welcome to the Companies API The Companies API lets you browse and search our company database independently of any signal data. Query companies by name, industry, country, employee count, founded year, and more — with full pagination and sorting support. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?count=true&countries=US&industry=Software" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 40, "totalCount": 792, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "companies.list", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Identifier Lookup Beyond browsing, you can resolve a **specific** company by its canonical identifier (exact match, not fuzzy search). Accepted URL variants — scheme, `www.`, port, path and trailing slash — are normalized before matching: | Parameter | Description | | -------------- | ----------------------------------------------------------- | | `domain` | Company website domain (e.g. `novartis.com`) | | `linkedin_url` | Company LinkedIn URL (e.g. `linkedin.com/company/novartis`) | Invalid identifier syntax returns `400`. A valid identifier that resolves to nothing returns an empty `data` set with a `200`. Identifiers AND with any other filters, so a conflicting `domain` + `linkedin_url` returns empty rather than merging. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Key Features * **Independent Querying**: Browse companies without needing signal data * **Full-text Search**: Search across company name, industry, description, keywords, and specialties * **Geographic Filtering**: Filter by headquarters country * **Industry Filtering**: Filter by exact industry names * **Numeric Range Filters**: Filter by employee count and founded year ranges * **Growth Data**: Access headcount growth metrics (1m, 3m, 6m, 9m, 12m) * **Flexible Sorting**: Sort by name, employee count, founded year, or creation date * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Credit-based Usage**: Transparent credit consumption per API call ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Company profiles are continuously updated * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require a Bearer token in the `Authorization` header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?page=1&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Query Parameters ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Text Search | Parameter | Type | Description | | --------- | ------ | -------------------------------------------------------------------------------------- | | `search` | string | Free-text search across company name, industry, description, keywords, and specialties | ### Identifier Lookup Resolve a specific company by its canonical identifier — see [Identifier Lookup](#identifier-lookup). | Parameter | Type | Description | | -------------- | ------ | ------------------------------------------------------------------------- | | `domain` | string | Company website domain — exact match (e.g. `novartis.com`) | | `linkedin_url` | string | Company LinkedIn URL — exact match (e.g. `linkedin.com/company/novartis`) | ### Filters | Parameter | Type | Description | | ------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `countries` | string | Comma-separated country codes (e.g., `US,GB,DE`). Allowlist | | `exclude_countries` | string | Comma-separated country names or codes to **exclude** (denylist, e.g. `China` or `CN`). Complements `countries`; companies with an unknown HQ country are kept | | `industry` | string | Comma-separated industry names — exact match (e.g., `Software,Technology`) | | `categories` | string | Pipe-separated industry categories (e.g., `Technology\|Software`) | | `subcategories` | string | Comma-separated subcategory IDs (e.g., `ai,fintech,saas`). See [Subcategories](/enums#subcategories) | ### Numeric Range Filters | Parameter | Type | Description | | -------------------- | ------- | ---------------------- | | `employee_count_min` | integer | Minimum employee count | | `employee_count_max` | integer | Maximum employee count | | `founded_year_min` | integer | Minimum founded year | | `founded_year_max` | integer | Maximum founded year | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------- | ------------------------------------------------------------------ | | `sort_by` | string | `name` | Sort field: `name`, `employee_count`, `founded_year`, `created_at` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [ { "id": "uuid-here", "name": "NextGen Software", "slug": "nextgen-software", "description": "Enterprise SaaS platform for workflow automation.", "website": "https://www.nextgensoftware.com", "linkedinUrl": "https://www.linkedin.com/company/nextgensoftware", "logoUrl": "https://media.licdn.com/dms/image/example.png", "industry": "Technology", "foundedYear": 2018, "headquartersCountry": "US", "employeeCount": 250, "categories": ["Software", "SaaS"], "keywords": ["workflow automation", "enterprise"], "specialties": ["process automation"], "growthInfo": { "growth_1m": 1.2, "growth_3m": 3.5, "growth_6m": 8.1, "growth_9m": 12.0, "growth_12m": 18.5 } } ], "pagination": { "currentPage": 1, "totalPages": 200, "totalCount": 4000, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "companies.list", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **400**: Bad request — invalid `domain` or `linkedin_url` identifier syntax. Note: a *valid* identifier that resolves to no company returns `200` with an empty `data` set, not `400` * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Look up a company by domain ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Look up a company by LinkedIn URL ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?linkedin_url=https://www.linkedin.com/company/novartis" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Search by Keyword and Country ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?search=AI&countries=US" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Industry and Employee Count ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?industry=Software&employee_count_min=50&employee_count_max=1000" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Founded Year with Sorting ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?founded_year_min=2020&sort_by=employee_count&sort_order=desc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Combined Filters ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/companies?search=cloud&countries=US,GB&employee_count_min=10&founded_year_min=2015&sort_by=name&sort_order=asc&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Get CSV Enrichment Job Source: https://docs.trysignalbase.com/api-reference/csv-enrichment/endpoint/get GET /csv-enrichment/{jobId} Retrieve job status, progress, summary counts, and completed results. Polling is free and returns creditsUsed: 0. Results are paginated with cursor and limit. # Create CSV Enrichment Job Source: https://docs.trysignalbase.com/api-reference/csv-enrichment/endpoint/post POST /csv-enrichment Submit companies for enrichment. Each company must include at least one identifier: company name, website URL/domain, or LinkedIn URL. The endpoint costs 1 credit per accepted job. Add wait=true for small lists to return completed results inline when processing finishes within timeout seconds. # Introduction Source: https://docs.trysignalbase.com/api-reference/csv-enrichment/introduction Submit company lists for enrichment with funding, acquisition, hiring, job change, and investor intelligence ## Welcome to the CSV Enrichment API The CSV Enrichment API lets clients submit a list of companies and start the same enrichment workflow available in the Signalbase dashboard. Each company is matched by name, website, or LinkedIn URL, then enriched with company profile data and available signals from Signalbase. Submit companies for enrichment Poll status and retrieve paginated results ## Key Features * **Company Matching**: Match companies by `company_name`, `website_url`, or `linkedin_url` * **Signal Enrichment**: Enrich matched companies with funding, acquisition, hiring, job change, and investor data * **Dashboard Parity**: Uses the same enrichment job pipeline as dashboard CSV enrichment * **Asynchronous Processing**: Returns a job ID immediately while enrichment runs in the background * **Agent-friendly Retrieval**: Poll a free GET endpoint with strict statuses, summary counts, and paginated results * **Synchronous Small-list Mode**: Use `wait=true` for short lists that should complete in one agent turn * **Credit-based Usage**: Transparent credit consumption per API request ## Authentication All API endpoints require authentication using a Bearer token passed in the Authorization header. ```bash theme={null} curl -X POST "https://www.trysignalbase.com/api/v2/csv-enrichment" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "companies": [ { "company_name": "Acme", "website_url": "https://acme.com", "linkedin_url": "https://www.linkedin.com/company/acme" } ] }' ``` ## Create Request Body | Field | Type | Required | Description | | ----------- | ------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | | `companies` | array | Yes | Companies to enrich. Maximum 1,000 companies per request. | | `fileName` | string | No | Optional label stored on the enrichment job. Defaults to `api-companies.json`. | | `wait` | boolean | No | If `true`, the API waits up to `timeout` seconds and returns completed results inline when available. Defaults to `false`. | | `timeout` | integer | No | Maximum wait time in seconds when `wait=true`. Minimum `1`, maximum `30`, default `30`. | Each company must include at least one of: | Field | Type | Description | | -------------- | ------ | ----------------------------- | | `company_name` | string | Company name | | `website_url` | string | Company website URL or domain | | `linkedin_url` | string | Company LinkedIn URL | The API also accepts common aliases such as `companyName`, `name`, `websiteUrl`, `website`, `domain`, `linkedinUrl`, `linkedin`, and `company_linkedin_url`. ## Response Structure A successful request creates an enrichment job and returns its ID: ```json theme={null} { "success": true, "data": { "jobId": "7f4b7a34-8d65-4cc3-8ab0-3477f8a967a6", "detectedMapping": { "companyName": "company_name", "websiteUrl": "website_url", "linkedinUrl": "linkedin_url" } }, "meta": { "endpoint": "csv.enrichment", "creditsUsed": 1, "creditsRemaining": 999 } } ``` For small lists, use synchronous mode: ```bash theme={null} curl -X POST "https://www.trysignalbase.com/api/v2/csv-enrichment" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "wait": true, "timeout": 30, "companies": [ { "company_name": "Mollie", "website_url": "mollie.com" } ] }' ``` If the job completes within the timeout, the response includes `status`, `progress`, `summary`, and `results` inline. If it is still `pending` or `running`, the response remains job-ID based and you should poll the GET endpoint. ## Retrieve Results Polling is free and returns `creditsUsed: 0`. ```bash theme={null} curl "https://www.trysignalbase.com/api/v2/csv-enrichment/7f4b7a34-8d65-4cc3-8ab0-3477f8a967a6?limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` The response uses strict status values: `pending`, `running`, `completed`, or `failed`. ```json theme={null} { "success": true, "data": { "jobId": "7f4b7a34-8d65-4cc3-8ab0-3477f8a967a6", "status": "completed", "progress": { "processed": 148, "total": 148 }, "submittedAt": "2026-05-12T07:25:42.000Z", "completedAt": "2026-05-12T07:27:01.000Z", "summary": { "totalInputs": 148, "matched": 87, "unmatched": 61, "withFundingSignals": 12, "withAcquisitionSignals": 3, "withHiringSignals": 54, "withJobChangeSignals": 0 }, "results": [], "nextCursor": null }, "meta": { "endpoint": "csv.enrichment.get", "creditsUsed": 0 } } ``` `results` is paginated. Use `limit` up to `100`; when `nextCursor` is not `null`, request the next page with `?cursor=&limit=50`. ## Service Level * **Processing-time target**: Approximately 30 seconds for 100 companies and approximately 2 minutes for 1,000 companies, depending on match complexity and upstream availability. * **Recommended polling cadence**: Poll every 5 seconds for the first 60 seconds, then every 30 seconds. Stop polling after 10 minutes and surface the `jobId`. * **Result retention**: Job IDs are retrievable for 30 days. After that, the API returns `410 Gone` with code `job_expired`. * **Maximum Companies**: Up to 1,000 companies per request * **Credit Cost**: 1 API credit per accepted submit request; polling costs 0 credits ## Rate Limits | Tier | Requests/minute | Concurrent enrichment jobs | Max companies/job | Jobs/day | | ------------- | ------------------- | -------------------------- | ----------------- | -------- | | Free | API access disabled | 0 | 0 | 0 | | GTM Signals | 60 | 3 | 1,000 | 10 | | Workflows | 60 | 3 | 1,000 | 10 | | Signal Engine | Custom | Custom | 1,000 by default | Custom | Team-specific limits may be higher when configured contractually. ## Match Rules Identifier precedence is: 1. `linkedin_url` / `linkedinUrl` / `linkedin` / `company_linkedin_url` 2. `website_url` / `websiteUrl` / `website` / `domain` 3. `company_name` / `companyName` / `name` LinkedIn and website/domain matching require a normalized exact match. If one of those stronger identifiers is provided and no confident match is found, the matcher does not fall back to a fuzzy company-name guess. Company-name matching is used when no LinkedIn or website/domain identifier is provided. ### URL & domain normalization Website and domain values are normalized before matching, so equivalent forms are treated identically — you do **not** need to pre-clean them: * The scheme is optional: `https://acme.com`, `http://acme.com`, and `acme.com` are equivalent. * A leading `www.` is stripped: `www.acme.com` and `acme.com` match the same company. * A full URL with a path (`https://acme.com/about`) is reduced to its host (`acme.com`) for matching. Provide a website as a full URL or a bare domain via any of `website_url`, `websiteUrl`, `website`, or `domain` — they are interchangeable. LinkedIn company URLs may be supplied via `linkedin_url`, `linkedinUrl`, `linkedin`, or `company_linkedin_url`. ## Error Handling The API returns standard HTTP status codes: * **200**: Job created successfully * **400**: Invalid request body or missing company identifiers * **401**: Unauthorized - Invalid or missing API key * **402**: Insufficient credits * **403**: Subscription expired * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description", "code": "invalid_company_payload" } ``` Known error codes: | Code | HTTP status | Meaning | | -------------------------- | ----------- | ------------------------------------------------------------------- | | `invalid_company_payload` | 400 | The request JSON, company list, cursor, or identifiers are invalid. | | `invalid_api_key` | 401 | The Authorization header is missing or the API key is invalid. | | `insufficient_credits` | 402 | The team does not have enough API credits to create a job. | | `subscription_expired` | 403 | The API key belongs to a team without an active subscription. | | `rate_limited` | 429 | The team exceeded the endpoint rate limit. | | `job_not_found` | 404 | The job ID does not exist for the authenticated team. | | `job_expired` | 410 | The job is older than the 30-day retention window. | | `match_engine_unavailable` | 500 | The enrichment worker or match engine failed unexpectedly. | When a job itself fails, GET returns HTTP 200 with `data.status: "failed"` and an `error` object: ```json theme={null} { "success": true, "data": { "jobId": "7f4b7a34-8d65-4cc3-8ab0-3477f8a967a6", "status": "failed", "error": { "code": "match_engine_unavailable", "message": "CSV enrichment job failed." } }, "meta": { "endpoint": "csv.enrichment.get", "creditsUsed": 0 } } ``` # Get Funding Signals Source: https://docs.trysignalbase.com/api-reference/funding-signals/endpoint/get GET /signals/funding Fetch funding signals with filtering, pagination, and search capabilities. Returns a list of companies with funding activity including round types, amounts, and investor information. # Introduction Source: https://docs.trysignalbase.com/api-reference/funding-signals/introduction Access real-time funding signals with advanced filtering, sorting, and pagination ## Welcome to the Funding Signals API The Funding Signals API provides access to comprehensive, real-time funding signals aggregated from across the web. Our platform continuously monitors and collects funding activity, giving you up-to-date information on companies raising capital, funding rounds, investors, and market trends. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?count=true&countries=US&round=Seed" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 15, "totalCount": 287, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.funding", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Real-time Signals**: Funding signals are aggregated continuously from web sources * **Advanced Filtering**: Filter by countries, categories, subcategories, funding rounds, date ranges, and search terms * **Funding Round Types**: Filter by round type (e.g. `seed`, `series a`, `pre-seed`, `angel`) — case-insensitive. See [Round Types](/enums#funding-round-types) * **Round Flavors**: Distinguish between bridge, extension, and secondary rounds * **Numeric Range Filters**: Filter by amount, employee count, and founded year * **Flexible Sorting**: Sort by date, amount, employee count, or founded year * **Verification Status**: Filter signals by verified, unverified, or pending status * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Credit-based Usage**: Transparent credit consumption per API call ## Company fields in responses Funding signal payloads include **`companyCountry`** for HQ and **`companySubcategory`** when classified. Conventions match the other signal APIs; see [Company fields in signal responses](/enums#company-fields-in-signal-responses). ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Real-time aggregation ensures up-to-date signals * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require authentication using a Bearer token passed in the Authorization header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?page=1&limit=20&round=Series%20A" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Matching by Company URL (Recommended) If you know a company's website domain or LinkedIn page, query by URL instead of by name. Name search is fuzzy and can return lookalikes (`Novartis` also matches `Novartis UK`); URL identifiers match exactly one company. ```bash theme={null} # By website domain curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" # By LinkedIn company page curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?company_linkedin_url=linkedin.com/company/novartis" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Accepted input formats.** URL identifiers are normalized before matching, so equivalent variants return the same results: * `company_domain`: `novartis.com`, `www.novartis.com`, `https://www.novartis.com/`, `https://novartis.com/any/path` — scheme, `www.`, port, path and trailing slash are ignored. Values that can't be reduced to a domain return `400`. * `company_linkedin_url`: `linkedin.com/company/novartis`, `https://www.linkedin.com/company/Novartis/` — `http`/`https`, `www.` and trailing slash are ignored, the slug is case-insensitive. URLs that aren't LinkedIn *company* pages (e.g. personal `/in/` profiles) return `400`. **Strict matching.** When a URL identifier is provided, the API never falls back to fuzzy name matching: if no company matches, the result is empty. Identifiers combine with `AND` — `company_domain=novartis.com&company_name=Acme` returns empty because they disagree. **Match confidence.** Every result row includes `match_confidence`: | Value | Meaning | | ------- | ------------------------------------------------------ | | `exact` | Matched via `company_domain` or `company_linkedin_url` | | `fuzzy` | Matched via `company_name` partial match only | | `none` | No company identifier was part of the query | ## Query Parameters ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Date Filters | Parameter | Type | Description | | ------------- | ------ | ------------------------------------------------------------------------------------------------------------ | | `dateFrom` | string | Filter by date from (ISO-8601 string) | | `dateTo` | string | Filter by date to (ISO-8601 string) | | `date_preset` | string | Relative date shorthand — takes precedence over `dateFrom`/`dateTo`. See [Date Presets](/enums#date-presets) | ### Company Filters | Parameter | Type | Description | | ---------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `countries` | string | Comma-separated country codes (e.g., `US,GB,DE`). Allowlist | | `exclude_countries` | string | Comma-separated country names or codes to **exclude** (denylist, e.g. `China` or `CN`). Complements `countries`; companies with an unknown HQ country are kept | | `categories` | string | Pipe-separated company categories / industries | | `subcategories` | string | Comma-separated subcategory IDs (e.g., `ai,fintech,saas`) | | `industry` | string | Comma-separated exact industry names | | `company_domain` | string | **Recommended.** Company website domain (e.g. `novartis.com`). Strict match — see [Matching by company URL](#matching-by-company-url-recommended) | | `company_linkedin_url` | string | **Recommended.** LinkedIn company URL (e.g. `linkedin.com/company/novartis`). Strict match | | `company_name` | string | Search by company name (partial match, fuzzy). Prefer the URL identifiers above | | `search` | string | Free-text search across company name & industry | ### Numeric Range Filters | Parameter | Type | Description | | -------------------- | ------- | ------------------------------------------------------------------------ | | `amount_min` | integer | Minimum funding amount in whole units of the deal's currency (not cents) | | `amount_max` | integer | Maximum funding amount in whole units of the deal's currency (not cents) | | `employee_count_min` | integer | Minimum company employee count | | `employee_count_max` | integer | Maximum company employee count | | `founded_year_min` | integer | Minimum company founded year | | `founded_year_max` | integer | Maximum company founded year | ### Funding-specific Filters | Parameter | Type | Description | | --------------------- | ------ | ----------------------------------------------------------------------------------------------------------- | | `round` | string | Comma-separated round types. See [Round Types](/enums#funding-round-types) | | `round_flavor` | string | Comma-separated round flavors: `bridge`, `extension`, `secondary` | | `currency` | string | Filter by ISO 4217 currency code (e.g., `USD`, `EUR`, `GBP`). See [Currency Values](/enums#currency-values) | | `verification_status` | string | Comma-separated statuses: `verified`, `unverified`, `pending` | | `investor_name` | string | Search by investor name (partial match) | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------------- | -------------------------------------------------------------------------------------- | | `sort_by` | string | `occurred_at` | Sort field: `occurred_at`, `discovered_at`, `amount`, `employee_count`, `founded_year` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Funding Round Types Round types are matched **case-insensitively** (`Series A`, `series a`, and `SERIES A` all work) and returned in lowercase. The most common values: * `seed`, `pre-seed` — early-stage funding * `series a` … `series f` — priced venture rounds (later letters also occur) * `angel` — angel/individual investment * `equity`, `fund`, `debt financing`, `debt` — other financing types * `ipo` — initial public offering See [Round Types](/enums#funding-round-types) for the full common list. ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [ { "signalId": "uuid-here", "companyName": "TechStartup Inc", "roundType": "series a", "fundingAmount": 10000000, "investorNames": ["VC Fund 1", "Angel Investor 2"], ... } ], "pagination": { "currentPage": 1, "totalPages": 10, "totalCount": 200, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.funding", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Filter by Date Preset and Round Type ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?date_preset=last_30d&countries=US&round=Seed,Series%20A" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Amount and Employee Count ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?amount_min=1000000&employee_count_max=50&sort_by=amount&sort_order=desc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Subcategory and Verification Status ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?subcategories=ai,fintech&verification_status=verified" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Search with Multiple Filters ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?search=fintech&countries=US&round=Series%20A&sort_by=amount&sort_order=desc&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Get Hiring Signals Source: https://docs.trysignalbase.com/api-reference/hiring-signals/endpoint/get GET /signals/hiring Fetch hiring signals (open job postings) with filtering, pagination, and search. Supports role-aware position filters, department and seniority filters, location targeting, team size, and applicant range filtering. # Introduction Source: https://docs.trysignalbase.com/api-reference/hiring-signals/introduction Access real-time hiring signals with position, department, seniority, and location filters ## Welcome to the Hiring Signals API The Hiring Signals API provides timely insights on open job postings across the web. Track which companies are hiring, what roles they're filling, and where — with precise filters for positions, departments, seniority levels, team size, applicant counts, and geographic targeting. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?count=true&positions=CTO&date_preset=last_30d" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 8, "totalCount": 156, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.hiring", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Real-time Signals**: Hiring signals aggregated continuously from web sources * **Role-aware Filters**: Filter by positions, departments, and seniority levels * **Location Targeting**: Filter by country, US state, and city * **Category Filters**: Filter by industry categories and keyword-based subcategories * **Company Filters**: Filter by team size and applicant count ranges * **Flexible Sorting**: Sort by date posted, title, company name, location, or ingestion date * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Credit-based Usage**: Transparent credit consumption per API call ## Response: company vs. job location Each row includes **`companyCountry`** (employer HQ) and **`jobCountry`** (listing location). Signal rows also include **`companySubcategory`** when the company has been classified. See [Company fields in signal responses](/enums#company-fields-in-signal-responses) for naming conventions shared across signal APIs. The same distinction applies to filtering, with three country scopes: `countries` matches either country (job listing **or** company HQ), `job_countries` matches the job listing country only, and `company_countries` matches the company HQ only. Use `job_countries` when you care about where the job is, not where the company is based — e.g. a Berlin listing from a US-headquartered company matches `job_countries=DE` but not `job_countries=US` — and `company_countries` for the reverse. ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Real-time aggregation ensures up-to-date signals * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require a Bearer token in the `Authorization` header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?page=1&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Matching by Company URL (Recommended) If you know a company's website domain or LinkedIn page, query by URL instead of by name. Name search is fuzzy and can return lookalikes (`Novartis` also matches `Novartis UK`); URL identifiers match exactly one company. ```bash theme={null} # By website domain curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" # By LinkedIn company page curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?company_linkedin_url=linkedin.com/company/novartis" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Accepted input formats.** URL identifiers are normalized before matching, so equivalent variants return the same results: * `company_domain`: `novartis.com`, `www.novartis.com`, `https://www.novartis.com/`, `https://novartis.com/any/path` — scheme, `www.`, port, path and trailing slash are ignored. Values that can't be reduced to a domain return `400`. * `company_linkedin_url`: `linkedin.com/company/novartis`, `https://www.linkedin.com/company/Novartis/` — `http`/`https`, `www.` and trailing slash are ignored, the slug is case-insensitive. URLs that aren't LinkedIn *company* pages (e.g. personal `/in/` profiles) return `400`. **Strict matching.** When a URL identifier is provided, the API never falls back to fuzzy name matching: if no company matches, the result is empty. Identifiers combine with `AND` — `company_domain=novartis.com&company_name=Acme` returns empty because they disagree. **Match confidence.** Every result row includes `match_confidence`: | Value | Meaning | | ------- | ------------------------------------------------------ | | `exact` | Matched via `company_domain` or `company_linkedin_url` | | `fuzzy` | Matched via `company_name` partial match only | | `none` | No company identifier was part of the query | ## Query Parameters Parameter **names** are validated strictly: an unrecognized query parameter returns a `400` listing the supported names, with a did-you-mean hint for near-misses (e.g. `job_country` → `job_countries`). Previously unknown names were silently ignored, which made a typo'd filter look like a filtered result. Malformed range values for `team_size` and `applicants` also return `400`. ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Date Filters | Parameter | Type | Description | | ------------- | ------ | ------------------------------------------------------------------------------------------------------------ | | `dateFrom` | string | Filter by date from (ISO-8601 string) | | `dateTo` | string | Filter by date to (ISO-8601 string) | | `date_preset` | string | Relative date shorthand — takes precedence over `dateFrom`/`dateTo`. See [Date Presets](/enums#date-presets) | ### Text Search & Location | Parameter | Type | Description | | ------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `search` | string | Free-text search across company name, industry, job title, location, and city | | `description` | string | Full-text keyword search over the **job description body only**. Opt-in and separate from `search` — use it to find postings mentioning specific keywords, skills, or tools (e.g. `description=Kubernetes`). Matches whole words (not substrings) and supports `websearch`-style syntax: space-separated terms are ANDed, `"quoted phrases"` match in order, `OR` and leading `-` (exclude) are honored (e.g. `description=kubernetes OR terraform -intern`) | | `city` | string | Free-text search on city, location, and region | | `countries` | string | Comma-separated country codes (e.g., `US,GB,DE`). Allowlist; matches the job listing country **or** the company HQ country | | `exclude_countries` | string | Comma-separated country names or codes to **exclude** (denylist, e.g. `China`). A signal is excluded when **either** the job listing country or the company HQ matches; rows with an unknown country on a side are kept | | `job_countries` | string | Comma-separated country codes matching the job listing location **only**, ignoring company HQ (e.g., `US,GB`) | | `company_countries` | string | Comma-separated country codes matching the company HQ **only**, ignoring job listing location (e.g., `GB`) | | `states` | string | Comma-separated US state codes (e.g., `CA,NY,TX`) | The three country scopes (`countries`, `job_countries`, `company_countries`) are ANDed if combined — `countries=US&job_countries=GB` is almost always empty. Pick the one scope that matches your question. ### Category Filters | Parameter | Type | Description | | --------------- | ------ | ----------------------------------------------------------------- | | `categories` | string | Pipe-separated industry categories (e.g., `Technology\|Software`) | | `subcategories` | string | Comma-separated subcategory IDs (e.g., `ai,fintech,saas`) | ### Role Category Filters | Parameter | Type | Description | | ------------- | ------ | ----------------------------------------------------------------------------------------------------- | | `positions` | string | Comma-separated position IDs (e.g., `CEO,CTO,CFO`). See [Positions](/enums#positions) | | `departments` | string | Comma-separated department IDs (e.g., `marketing,engineering`). See [Departments](/enums#departments) | | `seniorities` | string | Comma-separated seniority IDs (e.g., `c_level,vp,director`). See [Seniorities](/enums#seniorities) | ### Company Filters | Parameter | Type | Description | | ---------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | | `company_domain` | string | **Recommended.** Company website domain (e.g. `novartis.com`). Strict match — see [Matching by company URL](#matching-by-company-url-recommended) | | `company_linkedin_url` | string | **Recommended.** LinkedIn company URL (e.g. `linkedin.com/company/novartis`). Strict match | | `company_name` | string | Search by company name (partial match, fuzzy). Prefer the URL identifiers above | | `team_size` | string | Comma-separated team size ranges (e.g., `1-10,11-50,51-200,201-1000,1000-plus`) | | `applicants` | string | Comma-separated applicant ranges (e.g., `0-25,26-50,51-100,101-200,201-plus`) | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------------ | ---------------------------------------------------------------------------- | | `sort_by` | string | `created_at` | Sort field: `date_posted`, `created_at`, `title`, `company_name`, `location` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [ { "id": "uuid-here", "title": "Senior Software Engineer", "jobUrl": "https://www.linkedin.com/jobs/view/123456789", "location": "San Francisco, CA", "city": "San Francisco", "jobCountry": "US", "datePosted": "2024-11-01T00:00:00Z", "employmentType": "Full-time", "seniorityLevel": "Mid-Senior level", "jobFunction": "Engineering", "numApplicants": "45", "companyName": "NextGen Software", "companyIndustry": "Technology", "companyCountry": "US", "companySubcategory": "saas", "companyEmployeeCount": 250 } ], "pagination": { "currentPage": 1, "totalPages": 50, "totalCount": 1000, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.hiring", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Filter by Position and Date Preset ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?date_preset=last_30d&positions=CTO" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Country and City ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?countries=US&city=San%20Francisco" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Job Location Only Jobs located in Germany or the UK, regardless of where the hiring company is headquartered: ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?job_countries=DE,GB&date_preset=last_30d" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Department and Seniority with Sorting ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?departments=engineering&seniorities=c_level&sort_by=date_posted&sort_order=desc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Team Size and Subcategory ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/hiring?team_size=51-200&subcategories=ai,saas&date_preset=last_90d" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Get Investors Source: https://docs.trysignalbase.com/api-reference/investors/endpoint/get GET /signals/investors Fetch investor data with filtering, pagination, and search. Returns venture capital firms, angel investors, PE firms, corporate investors, accelerators, family offices, hedge funds, and crowdfunding platforms. # Introduction Source: https://docs.trysignalbase.com/api-reference/investors/introduction Access comprehensive VC and investor data with advanced filtering, sorting, and search ## Welcome to the Investors API The Investors API provides access to comprehensive venture capital and investor data aggregated from across the web. Our platform continuously monitors and collects information on VCs, angel investors, private equity firms, corporate investors, and more, giving you up-to-date intelligence on the investment landscape. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?count=true&type=vc,angel&countries=US" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 22, "totalCount": 430, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.investors", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Comprehensive Coverage**: Access data on VCs, angels, PE firms, corporate investors, hedge funds, crowdfunding platforms, and more * **Advanced Filtering**: Filter by countries, investor types, HQ location, and ticket size ranges * **Flexible Sorting**: Sort by name, created date, or ticket size * **Date Filtering**: Filter by created date or use date presets for relative ranges * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Rich Investor Data**: Detailed information on investment focus, portfolio, and contact details * **Credit-based Usage**: Transparent credit consumption per API call ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Continuously updated investor information * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require authentication using a Bearer token passed in the Authorization header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?page=1&limit=20&type=vc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Query Parameters ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Date Filters | Parameter | Type | Description | | ------------- | ------ | ------------------------------------------------------------------------------------------------------------ | | `dateFrom` | string | Filter by created date from (ISO-8601 string) | | `dateTo` | string | Filter by created date to (ISO-8601 string) | | `date_preset` | string | Relative date shorthand — takes precedence over `dateFrom`/`dateTo`. See [Date Presets](/enums#date-presets) | ### Investor Filters | Parameter | Type | Description | | ------------------- | ------ | --------------------------------------------------------------------------------------------------------------- | | `countries` | string | Comma-separated country codes (e.g., `US,GB,DE`). Allowlist; matches the investor's countries | | `exclude_countries` | string | Comma-separated country codes to **exclude** (denylist, e.g. `CN`). Investors with no listed countries are kept | | `type` | string | Comma-separated investor types. See [Investor Types](/enums#investor-types) | | `categories` | string | Legacy: pipe-separated investor types (same values as `type`) | | `headquarters` | string | Search by HQ location (partial match) | | `search` | string | Free-text search across investor name & type | ### Numeric Range Filters | Parameter | Type | Description | | ----------------- | ------- | -------------------------- | | `ticket_size_min` | integer | Minimum ticket size in USD | | `ticket_size_max` | integer | Maximum ticket size in USD | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------------ | ---------------------------------------------------------------------- | | `sort_by` | string | `created_at` | Sort field: `name`, `created_at`, `ticket_size_min`, `ticket_size_max` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Investor Types The API supports filtering by the following investor types: * **vc**: Venture Capital firms * **angel**: Angel investors and angel groups * **pe**: Private Equity firms * **corporate**: Corporate venture arms and strategic investors * **government**: Government-backed investment entities * **accelerator**: Startup accelerators and incubators * **family\_office**: Family offices * **hedge\_fund**: Hedge funds * **crowdfunding**: Crowdfunding platforms These are **case-insensitive groupings** over a free-text `type` field, so e.g. `vc` matches `VC`, `VC firm`, `Venture Capital`, `venture_capital`, and `Corporate VC`. The `type` value returned in the response is the original scraped string (not the slug), so a single `type=vc` query returns rows with mixed `type` values. For values outside this list, use `search`. ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [ { "id": "uuid-here", "name": "Sequoia Capital", "investorType": "vc", "country": "United States", "description": "Leading venture capital firm...", "website": "https://www.sequoiacap.com", ... } ], "pagination": { "currentPage": 1, "totalPages": 10, "totalCount": 200, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.investors", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Filter by Investor Type ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?type=vc,angel&countries=US" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Ticket Size Range ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?ticket_size_min=100000&ticket_size_max=5000000" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Search by HQ Location with Sorting ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?headquarters=San%20Francisco&sort_by=name&sort_order=asc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Combined Filters ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/investors?type=vc&countries=US,GB&ticket_size_min=500000&sort_by=ticket_size_max&sort_order=desc&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Get Job Change Signals Source: https://docs.trysignalbase.com/api-reference/job-change-signals/endpoint/get GET /signals/job-changes Fetch job change signals with filtering, pagination, and search. Supports role-aware position filters, department and seniority filters, LinkedIn targeting, and field-specific search. Person names are GDPR-masked (first name + last initial only). # Introduction Source: https://docs.trysignalbase.com/api-reference/job-change-signals/introduction Access real-time job change signals with role, department, and seniority filters ## Welcome to the Job Change Signals API The Job Change Signals API provides timely insights on job changes across the web. Track role transitions and new hires with precise filters for positions, departments, and seniority levels, plus company and person-level LinkedIn targeting. View the complete OpenAPI specification ## Count Mode You can get the total number of results matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?count=true&positions=CEO,CTO&date_preset=last_30d" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 5, "totalCount": 93, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.job-changes", "creditsUsed": 0 } } ``` Use count mode to preview how many results match your filters before fetching actual data. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Real-time Signals**: Job change signals aggregated continuously from web sources * **Role-aware Filters**: Filter by positions, departments, and seniority levels * **LinkedIn Targeting**: Exact-match filters on person and company LinkedIn URLs * **Field-specific Search**: Search by person name, company name, new role, or keyword * **Flexible Sorting**: Sort by date, person name, or company name * **Pagination Support**: Efficiently retrieve large datasets with up to 100 results per page * **Credit-based Usage**: Transparent credit consumption per API call ## Company vs. person location Company headquarters use **`companyCountry`** and **`companySubcategory`** (when set). Person location uses **`personCountry`**, **`personCity`**, and related fields — see [Company fields in signal responses](/enums#company-fields-in-signal-responses). ## Service Level * **Rate Limit**: Based on your subscription tier * **Uptime**: 99% guaranteed uptime * **Data Freshness**: Real-time aggregation ensures up-to-date signals * **Maximum Results**: Up to 100 results per page ## Authentication All API endpoints require a Bearer token in the `Authorization` header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?page=1&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Matching by Company URL (Recommended) If you know a company's website domain or LinkedIn page, query by URL instead of by name. Name search is fuzzy and can return lookalikes (`Novartis` also matches `Novartis UK`); URL identifiers match exactly one company. ```bash theme={null} # By website domain curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" # By LinkedIn company page curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?company_linkedin_url=linkedin.com/company/novartis" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Accepted input formats.** URL identifiers are normalized before matching, so equivalent variants return the same results: * `company_domain`: `novartis.com`, `www.novartis.com`, `https://www.novartis.com/`, `https://novartis.com/any/path` — scheme, `www.`, port, path and trailing slash are ignored. Values that can't be reduced to a domain return `400`. * `company_linkedin_url`: `linkedin.com/company/novartis`, `https://www.linkedin.com/company/Novartis/` — `http`/`https`, `www.` and trailing slash are ignored, the slug is case-insensitive. URLs that aren't LinkedIn *company* pages (e.g. personal `/in/` profiles) return `400`. **Strict matching.** When a URL identifier is provided, the API never falls back to fuzzy name matching: if no company matches, the result is empty. Identifiers combine with `AND` — `company_domain=novartis.com&company_name=Acme` returns empty because they disagree. **Match confidence.** Every result row includes `match_confidence`: | Value | Meaning | | ------- | ------------------------------------------------------ | | `exact` | Matched via `company_domain` or `company_linkedin_url` | | `fuzzy` | Matched via `company_name` partial match only | | `none` | No company identifier was part of the query | ## Query Parameters ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 20 | Results per page (max: 100) | ### Date Filters | Parameter | Type | Description | | ------------- | ------ | ------------------------------------------------------------------------------------------------------------ | | `dateFrom` | string | Filter by date from (ISO-8601 string) | | `dateTo` | string | Filter by date to (ISO-8601 string) | | `date_preset` | string | Relative date shorthand — takes precedence over `dateFrom`/`dateTo`. See [Date Presets](/enums#date-presets) | ### Text Search | Parameter | Type | Description | | --------- | ------ | --------------------------------------------------------------------- | | `search` | string | Free-text search across company name, industry, person name, and role | ### Country Filters | Parameter | Type | Description | | ------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `countries` | string | Comma-separated country codes (e.g., `US,GB,DE`). Allowlist; matches the person country **or** the company HQ country | | `exclude_countries` | string | Comma-separated country names or codes to **exclude** (denylist, e.g. `China` or `CN`). A signal is excluded when **either** the person country or the company HQ matches; rows with an unknown country on a side are kept | ### Exact Match Filters | Parameter | Type | Description | | ---------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `personLinkedinUrl` | string | Exact LinkedIn URL for a person (`person_linkedin_url` is accepted as an alias) | | `company_linkedin_url` | string | **Recommended.** LinkedIn company URL (e.g. `linkedin.com/company/novartis`). Strict match — see [Matching by company URL](#matching-by-company-url-recommended). Legacy alias: `companyLinkedinUrl` | | `company_domain` | string | **Recommended.** Company website domain (e.g. `novartis.com`), matched via the linked company record. Strict match | | `source` | string | Exact match on source: `linkedin`, `press_release`, `other` | ### Field-specific Search (partial match) | Parameter | Type | Description | | -------------- | ------ | -------------------------------------------------------------------------------------------------------------------- | | `company_name` | string | Search by company name (partial match, fuzzy). Prefer `company_domain` or `company_linkedin_url` for strict matching | | `new_role` | string | Search by new role / job title | | `keyword` | string | Search by keyword tag | There is no `person_name` filter. For privacy (GDPR), people are queryable only by `personLinkedinUrl`, and `personName` is returned masked (first name + last initial). To locate a specific person, filter by their LinkedIn URL. ### Role Category Filters | Parameter | Type | Description | | ------------- | ------ | ----------------------------------------------------------------------------------------------------- | | `positions` | string | Comma-separated position IDs (e.g., `CEO,CTO,CFO`). See [Positions](/enums#positions) | | `departments` | string | Comma-separated department IDs (e.g., `marketing,engineering`). See [Departments](/enums#departments) | | `seniorities` | string | Comma-separated seniority IDs (e.g., `c_level,vp,director`). See [Seniorities](/enums#seniorities) | ### Sorting | Parameter | Type | Default | Description | | ------------ | ------ | ------------- | ------------------------------------------------------------------------- | | `sort_by` | string | `occurred_at` | Sort field: `occurred_at`, `discovered_at`, `person_name`, `company_name` | | `sort_order` | string | `desc` | Sort direction: `asc` or `desc` | ## Enum Values **Positions** ``` "ceo", "cto", "cfo", "coo", "vp of engineering", "vp of sales", "vp of marketing", "head of product", "head of growth", "head of engineering", "engineering manager", "product manager", "sales manager", "marketing manager", "founder", "co-founder" ``` **Departments** ``` "marketing", "sales", "engineering", "product", "design", "operations", "finance", "people", "data", "customer_success", "growth", "legal" ``` **Seniorities** ``` "founder", "c_level", "vp", "director", "head", "lead", "manager" ``` ## Response Structure All successful responses follow this structure: ```json theme={null} { "success": true, "data": [...], "pagination": { "currentPage": 1, "totalPages": 10, "totalCount": 200, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "signals.job-changes", "creditsUsed": 1 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **401**: Unauthorized - Invalid or missing API key * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Error message description" } ``` ## Example Usage ### Filter by Position and Date Preset ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?date_preset=last_30d&positions=CEO,CTO" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Filter by Company and Seniority ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?company_name=Google&seniorities=c_level" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Search by New Role with Sorting ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?new_role=VP%20Engineering&sort_by=occurred_at&sort_order=desc" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Target by LinkedIn URLs ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/job-changes?personLinkedinUrl=https://www.linkedin.com/in/example&company_linkedin_url=linkedin.com/company/example" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Search People Source: https://docs.trysignalbase.com/api-reference/people/endpoint/get GET /people Discover people across employees and job-change subjects, filtered by title, function, seniority, geography, company attributes, and signal activity. Each result includes an inline `matched_signal` — the latest signal that matched your filters — plus `is_latest_signal`, which reports whether that matched signal is also the person's newest overall signal. Different filters combine with AND; comma-separated values within a single filter combine with OR. A person qualifies if any of their signals match the filters, and the latest matching one is surfaced as `matched_signal`. Results are deduplicated by normalized person LinkedIn URL (falling back to normalized name + company identity) before pagination. Default sort is `matched_signal.date` descending. # Introduction Source: https://docs.trysignalbase.com/api-reference/people/introduction Find the right people to reach out to — every result carries the signal that explains why now ## Welcome to the People API The People API is ICP-style people discovery across Signalbase's signal-driven dataset. Filter by title, function, seniority, geography, and company attributes to build a target list — and every person you get back arrives with a `matched_signal` inline (a funding round, acquisition, or job change) that tells you **why now**: the timing reason to reach out, not just who matches your ICP. This is not a static contact database. People whose company has no active signal within the requested window are excluded by design. It is also a **search** endpoint — it reads existing records and never triggers the enrichment pipeline. You can also use it as a **precise lookup** rather than an ICP browse: pass an identifier — a person's `linkedin_url`, or a `company_domain` / `company_linkedin_url` — to resolve a specific record and return its people with their signals. See [Identifier Lookup](#identifier-lookup) below. View the complete OpenAPI specification ## Why now: `matched_signal` and `is_latest_signal` Every result includes a `matched_signal` — the **latest signal that matched your filters**. Because Signalbase filters first and then surfaces the latest *matching* signal, `matched_signal` is always consistent with your query, but it is not necessarily the person's newest overall signal. The `is_latest_signal` boolean tells you which case you're in: * `true` — the matched signal is also the person's most recent signal. * `false` — an older signal matched your filters, and the person has a more recent signal that did not match. When you don't pass `signal_type`, `matched_signal` is the person's newest qualifying signal of **any** supported type (`funding_round`, `acquisition`, `job_change`), so types can mix across a page. Pass `signal_type` to pin the surface to specific type(s). ## Identifier Lookup Instead of browsing an ICP, you can resolve a **specific** person or company and return its people with their signals. Any of these identifiers matches the source record by canonical (exact) equality — all accepted URL variants (scheme, `www.`, trailing slash) are normalized before matching: | Parameter | Matches | Notes | | ---------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | `linkedin_url` | A specific person | Personal profile URL (`/in/` or legacy `/pub/`). Matches current employees and job-change subjects. Pass a company page to `company_linkedin_url` instead. | | `company_domain` | People at a company | Company website domain, e.g. `novartis.com` | | `company_linkedin_url` | People at a company | Company LinkedIn URL, e.g. `linkedin.com/company/novartis` | **All-time by default.** When any identifier is set, `signal_date_range` defaults to **all-time** rather than `12m` — a lookup means "everything on record for this person/company", not "matched something in the last 12 months". Pass `signal_date_range` explicitly to still narrow the window. **Behavior.** Invalid identifier syntax returns `400`. A valid identifier that resolves to nothing returns an empty `data` set with a `200`. Identifiers AND with any other filters you pass. ```bash theme={null} # Everything on record for one person curl -X GET "https://www.trysignalbase.com/api/v2/people?linkedin_url=https://www.linkedin.com/in/jane-doe" \ -H "Authorization: Bearer YOUR_API_KEY" # All people at a company, by domain curl -X GET "https://www.trysignalbase.com/api/v2/people?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Count Mode You can get the total number of people matching any filter combination **without consuming credits** by adding `count=true` to your request. This returns an empty `data` array with full pagination metadata, including `totalCount`. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?count=true&seniority=c_level&signal_type=funding_round&signal_date_range=6m" \ -H "Authorization: Bearer YOUR_API_KEY" ``` **Response:** ```json theme={null} { "success": true, "data": [], "pagination": { "currentPage": 1, "totalPages": 12, "totalCount": 1183, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "people.list", "creditsUsed": 0 } } ``` Use count mode to preview how many people match your filters before fetching results. This is useful for building filter UIs, showing result counts, or validating queries — all at zero credit cost. ## Key Features * **Signal-backed results**: Every person carries a `matched_signal` explaining the timing to reach out * **Taxonomy-aware filters**: Filter by title, function, and seniority with word-boundary matching (no `COO` → `Coordinator` false positives) * **Company targeting**: Narrow by company size band and industry * **Geography**: Filter by country (person or company), person-only country (`person_countries`), and city (job-change people) * **Flexible lookback**: Control the signal window with `signal_date_range` (e.g. `30d`, `6m`, `2y`) * **Pagination support**: Up to 100 results per page * **Credit-based usage**: Transparent credit consumption per API call, with a free count mode ## How Filtering Works * **Different filters AND together**; comma-separated values **within one filter OR together**. For example, `seniority=c_level,vp&country=US` returns people who are (C-level OR VP) AND in the US. * A person qualifies if **any** of their signals matches the filters; the latest matching one is surfaced as `matched_signal`. * Results merge two sources (current company employees and job-change subjects) and are **deduplicated before pagination** by normalized person LinkedIn URL, falling back to normalized name + company domain/LinkedIn/name. * **Default sort**: `matched_signal.date` descending (most recent why-now first). ## Source-dependent Fields Some fields are only populated from one of the two underlying sources: | Field | Behavior | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `city` (person) | Only job-change-sourced people carry a city. Setting the `city` filter excludes employee-sourced people. | | `country` (person) | Only job-change-sourced people carry their own country. Setting the `person_countries` filter excludes employee-sourced people and job-change people without a known person country. | | `company.size_band` | Requires a linked company with a known headcount. Setting `company_size` excludes people whose company headcount is unknown. | | `company.city` | Always `null` today — companies do not carry a city field yet. | ## Active vs. Former The endpoint is currently **active-only** (current employees). `include_former=true` returns a `400` because job-change records have no current/former semantics yet, so honoring the flag would silently mix records. Until that data dependency is defined, every result has `status: "active"`. ## Privacy Person names are **masked** in responses (first name + last initial, e.g. `Sarah K.`), consistent with the Job Change and Employees endpoints. Use `linkedin_url` to identify a specific person. ## Authentication All API endpoints require a Bearer token in the `Authorization` header. ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?page=1&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ## Query Parameters Parameter **names** are validated strictly: an unrecognized query parameter returns a `400` listing the supported names. Spellings from the signal endpoints get a pointer to the equivalent here — e.g. `countries` → `country`, `team_size` → `company_size`, `type` → `signal_type`, `person_country` → `person_countries`. Previously unknown names were silently ignored, so a typo'd filter returned the full unfiltered dataset. ### Pagination | Parameter | Type | Default | Description | | --------- | ------- | ------- | --------------------------- | | `page` | integer | 1 | Page number | | `limit` | integer | 100 | Results per page (max: 100) | ### Person Filters | Parameter | Type | Description | | ----------- | ------ | ------------------------------------------------------------------------------------------ | | `title` | string | Title or comma-separated list (e.g. `CTO,VP of Engineering`). Word-boundary taxonomy match | | `function` | string | Comma-separated function ids. See [People Functions](/enums#people-functions) | | `seniority` | string | Comma-separated seniority ids. See [People Seniorities](/enums#people-seniorities) | ### Geography | Parameter | Type | Description | | ------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `country` | string | ISO 3166-1 alpha-2 code or comma-separated list (e.g. `US,NL`). Matches person or company country | | `person_countries` | string | ISO 3166-1 alpha-2 code or comma-separated list (e.g. `GB,IE`). Matches the **person's own country only** — no company fallback. Person location exists on a minority of records (job-change sourced), so this favors precision over recall — see [Source-dependent fields](#source-dependent-fields) | | `exclude_countries` | string | Comma-separated country codes to **exclude** (denylist, e.g. `CN`). A person is excluded when **either** their company country or their own person country matches; rows with an unknown country on a side are kept | | `city` | string | Free-text city (partial match). Job-change people only — see [Source-dependent fields](#source-dependent-fields) | ### Company Filters | Parameter | Type | Description | | -------------- | ------ | -------------------------------------------------------------------------------------- | | `company_size` | string | Comma-separated size bands. See [Company Size Bands](/enums#people-company-size-bands) | | `industry` | string | Industry or comma-separated list (case-insensitive exact match) | ### Identifier Lookup Resolve a specific person or company instead of browsing an ICP — see [Identifier Lookup](#identifier-lookup). Setting any of these defaults `signal_date_range` to all-time. | Parameter | Type | Description | | ---------------------- | ------ | ------------------------------------------------------------------------------------------ | | `linkedin_url` | string | Person LinkedIn profile URL (`/in/` or `/pub/`). Matches employees and job-change subjects | | `company_domain` | string | Company website domain (e.g. `novartis.com`) — returns the people at that company | | `company_linkedin_url` | string | Company LinkedIn URL (e.g. `linkedin.com/company/novartis`) | ### Signal Filters | Parameter | Type | Default | Description | | ------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | `signal_type` | string | — | Comma-separated signal type(s): `funding_round`, `acquisition`, `job_change`. Pins `matched_signal` to these types | | `signal_date_range` | string | `12m` \* | Lookback window as `` with unit `d`/`w`/`m`/`y` — e.g. `30d`, `6m`, `12m`, `2y`. \*Defaults to all-time when an identifier lookup is set | ### Active / Former | Parameter | Type | Default | Description | | ---------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------ | | `include_former` | boolean | `false` | Currently only `false` is supported. `true` returns `400` — see [Active vs. Former](#active-vs-former) | ### Count Mode | Parameter | Type | Description | | --------- | ------ | --------------------------------------------------------------------------------------------- | | `count` | string | Set to `true` to return only the total count, without data rows and without consuming credits | ## Enum Values **Functions** ``` marketing, sales, engineering, product, design, operations, finance, people, data, customer_success, growth, legal ``` **Seniorities** ``` founder, c_level, vp, director, head, lead, manager ``` **Company Size Bands** ``` 1-10, 11-50, 51-100, 101-250, 251-500, 501-1000, 1000-plus ``` **Signal Types** ``` funding_round, acquisition, job_change ``` ## Response Structure Each result includes the person, their company, `is_latest_signal`, and the inline `matched_signal`: ```json theme={null} { "success": true, "data": [ { "name": "Sarah K.", "linkedin_url": "https://www.linkedin.com/in/sarah-k", "title": "Chief Technology Officer", "status": "active", "city": null, "country": null, "company": { "name": "NextGen Software", "domain": "nextgensoftware.com", "linkedin_url": "https://www.linkedin.com/company/nextgensoftware", "country": "NL", "city": null, "size_band": "101-250", "industry": "Technology" }, "is_latest_signal": true, "matched_signal": { "type": "funding_round", "date": "2026-05-12", "summary": "Series B, $40M led by Accel", "source_url": "https://techcrunch.com/2026/05/12/nextgen-series-b" } } ], "pagination": { "currentPage": 1, "totalPages": 12, "totalCount": 1183, "hasNextPage": true, "hasPreviousPage": false }, "meta": { "endpoint": "people.list", "creditsUsed": 1, "creditsRemaining": 4999 } } ``` ## Error Handling The API returns standard HTTP status codes: * **200**: Success * **400**: Bad request — invalid filter value (unknown `function`/`seniority`/`company_size`/`signal_type`, malformed `signal_date_range`, `include_former=true`, or invalid identifier syntax in `linkedin_url`/`company_domain`/`company_linkedin_url`). Note: a *valid* identifier that resolves to no records returns `200` with an empty `data` set, not `400` * **401**: Unauthorized — invalid or missing API key * **402**: Insufficient credits * **429**: Rate limit exceeded * **500**: Internal server error Error responses include: ```json theme={null} { "success": false, "error": "Invalid seniority value: exec. Accepted values: founder, c_level, vp, director, head, lead, manager." } ``` ## Example Usage ### CTOs in the Netherlands at mid-size companies ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?title=CTO&country=NL&company_size=51-100,101-250" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### C-level people at recently funded companies ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?seniority=c_level&signal_type=funding_round&signal_date_range=6m" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Engineering leaders in SaaS ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?function=engineering&industry=SaaS&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Look up one person by LinkedIn URL ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?linkedin_url=https://www.linkedin.com/in/jane-doe" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### All people at a company, by domain ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/people?company_domain=novartis.com" \ -H "Authorization: Bearer YOUR_API_KEY" ``` # Create Webhook Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/create POST /webhooks Create a webhook subscription for the authenticated team. The full signing secret is returned exactly once in this response — store it now, because every later read returns only a 4-character preview. Creating a webhook is free (0 API credits). A team may have at most 10 active webhooks. # Delete Webhook Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/delete DELETE /webhooks/{id} Soft-delete a webhook by setting active to false. It stops receiving events and disappears from list/retrieve. The record and its delivery history are retained, and it can be re-enabled with PUT active:true. Free (0 credits). # List Deliveries Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/deliveries GET /webhooks/{id}/deliveries List delivery attempts for a webhook, newest first, using keyset (cursor) pagination. Optionally filter by status. Free (0 credits). # List Webhooks Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/list GET /webhooks List the authenticated team's active webhook subscriptions, newest first. Secrets are never returned here — each item includes only secret_preview. Free (0 credits). # Retrieve Webhook Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/retrieve GET /webhooks/{id} Retrieve a single active webhook by ID. Returns secret_preview only (never the full secret). Soft-deleted webhooks return 404. Free (0 credits). # Retry Delivery Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/retry POST /webhooks/{id}/deliveries/{deliveryId}/retry Replay a failed delivery inline. The retry reuses the original event_id and event_type (so receivers can dedupe) and re-signs the payload with the subscription's current secret. Retrying a delivery that already succeeded returns 409. A successful retry is billed as one delivery (1 credit); a failed retry is free. # Send Test Event Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/test POST /webhooks/{id}/test Deliver a signed system.test event to the webhook's endpoint immediately, without waiting for a real signal, and record it as a delivery. The request body is ignored. Returns the delivery outcome. Free (0 credits). # Update Webhook Source: https://docs.trysignalbase.com/api-reference/webhooks/endpoint/update PUT /webhooks/{id} Update any subset of a webhook's fields. Set rotate_secret to true to mint a new signing secret — the response then includes the full new secret (shown only on rotation) and the previous secret immediately stops verifying. Set active to true to re-enable a previously deleted webhook. Free (0 credits). # Introduction Source: https://docs.trysignalbase.com/api-reference/webhooks/introduction Manage webhook subscriptions as a first-class API resource — create, configure, test, and debug real-time signal delivery entirely over REST ## Welcome to the Webhooks API Webhooks push real-time signal data to **your own HTTPS endpoint** the moment events happen — funding rounds, acquisitions, job changes, new hires, newly discovered companies, and newly discovered investors. Instead of polling, your system receives a signed `POST` with the full event payload. Webhooks are a **first-class API resource**: you can create, list, retrieve, update, rotate the signing secret of, test, and delete them entirely over REST, plus list delivery attempts and replay failed ones. Anything you do in the dashboard for webhooks is doable via the API now. Subscribe an endpoint to event types and receive the signing secret. Retrieve every active webhook for your team. Fire a signed system.test event without waiting for a real signal. Inspect recent delivery attempts and their status. ## Key Features * **API-first**: Full CRUD plus test, delivery listing, and retry — no dashboard required. * **Signed payloads**: Every delivery carries an HMAC-SHA256 signature so you can verify authenticity. * **Secret rotation**: Rotate the signing secret in place without recreating the webhook. * **Event subscriptions**: Subscribe each webhook to exactly the event types you care about. * **Delivery visibility**: List delivery attempts with status, response code, and stored response body. * **Manual retry**: Replay a failed delivery; it reuses the original `event_id` so you can dedupe. * **Dashboard parity**: The same webhook is fully manageable from the dashboard and the API. ## Authentication Every request needs an API key (`ff_live_…`) belonging to a team with an active or trialing subscription. Pass it as a Bearer token in the `Authorization` header. Get your key from the dashboard at [trysignalbase.com/workspace/api](https://www.trysignalbase.com/workspace/api). ```bash theme={null} curl -X POST "https://www.trysignalbase.com/api/v2/webhooks" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "endpoint_url": "https://example.com/hooks/signalbase", "event_types": ["funding.created", "hiring.created"], "filters": { "countries": "US,GB" } }' ``` The base URL for all V2 endpoints is `https://www.trysignalbase.com/api/v2`. A key is bound to one team; all webhooks it creates belong to that team and are visible to every team member. Request bodies may use `snake_case` (canonical) or `camelCase` (`endpointUrl`, `eventTypes`, `rotateSecret`). ## Response Envelope Every endpoint returns a consistent JSON envelope. **Success:** ```json theme={null} { "success": true, "data": {}, "pagination": {}, "meta": { "endpoint": "webhooks.create", "creditsUsed": 0 } } ``` `pagination` is present only on list endpoints. `meta.creditsUsed` reflects the credits this request consumed. **Error:** ```json theme={null} { "success": false, "error": "Webhook not found", "code": "not_found" } ``` ## The Webhook Resource ```json theme={null} { "id": "b1f2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "endpoint_url": "https://example.com/hooks/signalbase", "event_types": ["funding.created", "hiring.created"], "filters": { "countries": "US,GB" }, "active": true, "created_at": "2026-05-29T10:30:00.000Z", "updated_at": "2026-05-29T10:30:00.000Z", "last_modified_by": "user_2a9f8c7b6d5e4f3a", "last_modified_via": "api", "secret": "3f9a1c7e-2b4d-4e6a-9f1b-8c2d3e4f5a6b", "secret_preview": "…5a6b", "stats": { "total_deliveries": 42, "successful_deliveries": 40, "failed_deliveries": 2, "last_success_at": "2026-05-29T12:00:00.000Z", "last_failure_at": "2026-05-28T09:00:00.000Z", "consecutive_failures": 0 } } ``` | Field | Type | Description | | --------------------------- | -------------- | ---------------------------------------------------------------------------------------- | | `id` | string | Unique webhook ID (UUID). | | `endpoint_url` | string | HTTPS endpoint that receives deliveries. | | `event_types` | string\[] | Event types this webhook is subscribed to. | | `filters` | object | String key/value filters that narrow which events are delivered. | | `active` | boolean | `false` for soft-deleted/paused webhooks. | | `created_at` / `updated_at` | string | ISO-8601 timestamps. | | `last_modified_by` | string \| null | User ID of the last editor. | | `last_modified_via` | string \| null | `"api"` or `"dashboard"` — where the last change originated. | | `secret` | string | Full signing secret. **Returned only on create and on rotation.** | | `secret_preview` | string | Ellipsis + last 4 characters of the secret (e.g. `…5a6b`). Returned on every other read. | | `stats` | object | Delivery counters and last success/failure timestamps. | The full `secret` is returned **exactly once** — when you create the webhook, and again only if you rotate it (`rotate_secret: true`). Store it securely on receipt. Every other read returns only `secret_preview`; the full secret cannot be retrieved again via the API. ## Event Types Subscribe to these in `event_types` when you create or update a webhook: | Event type | Triggered when | | --------------------- | ------------------------------------------------------ | | `funding.created` | A tracked company raises a funding round. | | `acquisition.created` | A tracked company is acquired or makes an acquisition. | | `job_change.created` | A monitored person changes jobs. | | `hiring.created` | A tracked company opens a relevant role. | | `new_company.created` | A new company matching your filters is discovered. | | `investor.created` | A new investor (VC, angel, PE, …) is discovered. | Two additional event types may appear on the **receiving** side but are not regular subscriptions: * `system.test` — delivered only by the [Send Test Event](/api-reference/webhooks/endpoint/test) endpoint. It is accepted in `event_types` for convenience but never fires automatically. * `dashboard.push` — delivered when a teammate uses the dashboard **Push** button to send selected companies/investors/contacts to a webhook. Personal data is GDPR-masked (last names masked, personal emails filtered) before delivery. ### Filters `filters` is an optional string-to-string map that narrows which events are delivered, applied to every `*.created` event the subscription is registered for. Only the keys below are recognized — **any other key is silently ignored** (it does not narrow anything), so the key names matter. All values are strings. | Key | Applies to | Value format | Matches when | | --------------------- | -------------------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `countries` | all signal types | Comma-separated ISO 3166-1 alpha-2 codes, e.g. `"US,GB"` | the company HQ country is in the list; for `hiring.created` events the job listing country also counts (job country OR HQ country, mirroring the REST hiring endpoint) | | `jobCountries` | `hiring.created` only | Comma-separated ISO 3166-1 alpha-2 codes, e.g. `"US,GB"` | the job listing country is in the list (ignores company HQ — mirrors the REST `job_countries` param) | | `categories` | all signal types | Pipe-separated industry labels, e.g. `"Software Development\|Financial Services"` | the company industry/categories match (case-insensitive) | | `search` | all signal types | Free text, e.g. `"fintech"` | the substring appears in the company name or industry | | `teamSize` | all signal types | Comma-separated ranges `min-max` or `1000-plus`, e.g. `"11-50,51-200"` | the company employee count falls in any range | | `dateFrom` / `dateTo` | all signal types | ISO-8601 date, e.g. `"2026-01-01"` | the signal's `occurredAt` is within the range | | `funding` | `funding.created` only | Comma-separated round types, e.g. `"seed,series a"` | the round type matches (case-insensitive) | | `roundFlavor` | `funding.created` only | Comma-separated flavors: `bridge`, `extension`, `secondary` | the round flavor matches | | `fundingAmount` | `funding.created` only | Comma-separated amount ranges, e.g. `"1m-5m,5m-20m"` (also `">$100m"`) | the funding amount falls in any range | | `acquisitionAmount` | `acquisition.created` only | Comma-separated amount ranges, e.g. `"10m-50m"` | the acquisition amount falls in any range | | `healthScore` | `funding.created` only | A single number `0`–`100`, e.g. `"40"` | the round's confidence score is ≥ that value | **`investor.created` is filtered differently.** Investor events carry an investor profile, not a company signal, so only two keys apply — `countries` (matched against the investor's operating countries) and `search` (substring match on the investor's **name or type**, e.g. `"vc"` or `"sequoia"`). Every other key (`categories`, `teamSize`, `funding`, date ranges, …) is ignored for investor events and does not narrow them. **Important behaviours:** * **Use `funding` (not `round`) to filter funding rounds.** The webhook filter key names differ from the REST query params — e.g. the round-type key here is `funding`, and amount uses `fundingAmount`/`acquisitionAmount` ranges rather than `amount_min`/`amount_max`. A wrong key like `{ "round": "seed" }` is ignored and you'll receive the full firehose. * **Multiple keys combine with AND** — an event must satisfy every filter to be delivered. * **Type-specific keys drop other types.** If a subscription listens to several event types and you set a `funding`-only key (`funding`, `roundFlavor`, `fundingAmount`, `healthScore`) or the hiring-only `jobCountries`, events of other types (e.g. `hiring.created` for a funding key, `funding.created` for `jobCountries`) won't match and won't be delivered. Prefer one webhook per event type when using type-specific filters. Example — only US/GB seed & Series A rounds above \$1M: ```json theme={null} { "countries": "US,GB", "funding": "seed,series a", "fundingAmount": "1m-100m" } ``` ## Credits & Limits | Item | Value | | ---------------------------------------------------------- | -------------------------------------------------------------------------------- | | Create a webhook | Free (0 credits) | | Successful delivery (including a successful retry) | 1 API credit | | List / retrieve / update / delete / test / list deliveries | Free (0 credits) | | Max active webhooks per team | 10 | | Endpoint URL max length | 500 characters | | Allowed protocols | HTTP or HTTPS (HTTPS strongly recommended) | | Stored response body | First 1000 characters per delivery | | Default rate limit | 60 requests/minute per endpoint per team (higher limits available contractually) | Webhook management, reads, and creation are all free; only **successful deliveries** (including a successful manual retry) consume credits. If your team's API credit balance reaches zero, deliveries stop. ## The Delivery Your Endpoint Receives Each delivery is an HTTP `POST` with `Content-Type: application/json` and `User-Agent: Signalbase-Webhooks/1.0`. | Header | Value | | --------------------- | ------------------------------------------------------------------------------------------- | | `X-Webhook-Event` | The event type (e.g. `funding.created`). | | `X-Webhook-ID` | The event ID — stable across retries, safe for idempotency. | | `X-Webhook-Timestamp` | Unix timestamp in **seconds**. | | `X-Webhook-Signature` | Hex-encoded HMAC-SHA256 of the raw request body. No `sha256=` prefix — the bare hex digest. | **Body envelope** — every delivery has the same four top-level keys. `data` holds the full signal object, whose shape depends on `event_type` (see [Payload by event type](#payload-by-event-type) below). ```json theme={null} { "data": { "...": "full signal object — shape depends on event_type" }, "event_id": "1f2e3d4c-5b6a-4790-8a1b-2c3d4e5f6071", "event_type": "funding.created", "timestamp": "2026-05-29T10:30:00.000Z" } ``` The delivered body is **canonical JSON with object keys sorted alphabetically at every level** (note the `data`, `event_id`, `event_type`, `timestamp` order above). The signature is computed over those exact bytes — so always verify against the **raw request body you received**, never a re-serialized copy. ## Payload by event type Every **company signal** payload shares a common envelope inside `data`: * `signal` — `{ id, type, externalId, occurredAt, discoveredAt, active }` * `company` — the full company object (or `null` for some events); `headquartersCountry` is an ISO-style country code * `employees` — array of `{ id, name, title, linkedinUrl, email }` (may be empty) * `sources` — array of `{ url, sourceType, author, title, content, validationScore, validationReasoning, publishedAt }` Each event type then adds one type-specific block. The exception is `investor.created`: investors are profiles, not company signals, so its `data` contains a single `investor` object and none of the envelope keys above (see its tab below). Monetary `amount` fields are **whole currency units** (integers, not cents); `currency` tells you which currency, as an ISO 4217 code (e.g. `USD`, `EUR`). See [Amounts & Currency](/enums#amounts--currency). ```json funding.created theme={null} { "data": { "signal": { "id": "a3f1c2d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d", "type": "funding_round", "externalId": "fund_abc123", "occurredAt": "2026-05-29T00:00:00.000Z", "discoveredAt": "2026-05-29T08:15:00.000Z", "active": true }, "company": { "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f", "name": "Acme AI", "slug": "acme-ai", "description": "Realtime fraud detection for fintechs.", "website": "https://acme.ai", "linkedinUrl": "https://www.linkedin.com/company/acme-ai", "twitterUrl": "https://x.com/acmeai", "logoUrl": "https://logo.clearbit.com/acme.ai", "industry": "Software Development", "subcategory": "fraud-detection", "foundedYear": 2021, "headquartersCountry": "US", "employeeCount": 85, "categories": "ai,fintech", "keywords": "fraud,risk,ml", "specialties": "fraud detection,risk scoring" }, "employees": [], "sources": [ { "url": "https://techcrunch.com/2026/05/29/acme-ai-series-b", "sourceType": "news_article", "author": "Jane Reporter", "title": "Acme AI raises $40M Series B", "content": "Acme AI today announced...", "validationScore": 0.92, "validationReasoning": "Multiple corroborating sources.", "publishedAt": "2026-05-29T07:00:00.000Z" } ], "fundingRound": { "roundType": "series b", "roundFlavor": null, "amount": 40000000, "currency": "USD", "announcedDate": "2026-05-29", "confidenceScore": 0.92, "verificationStatus": "verified", "investors": [ { "name": "Sequoia Capital", "type": "vc", "leadInvestor": true }, { "name": "Y Combinator", "type": "accelerator", "leadInvestor": false } ] } }, "event_id": "1f2e3d4c-5b6a-4790-8a1b-2c3d4e5f6071", "event_type": "funding.created", "timestamp": "2026-05-29T08:15:00.000Z" } ``` ```json acquisition.created theme={null} { "data": { "signal": { "id": "b4f2d3e5-6a7b-4c8d-9e0f-1a2b3c4d5e6f", "type": "acquisition", "externalId": "acq_def456", "occurredAt": "2026-05-28T00:00:00.000Z", "discoveredAt": "2026-05-28T14:30:00.000Z", "active": true }, "company": { "id": "d2e3f4a5-6b7c-4d8e-9f0a-1b2c3d4e5f6a", "name": "Beta Analytics", "slug": "beta-analytics", "description": "Product analytics platform.", "website": "https://beta-analytics.com", "linkedinUrl": "https://www.linkedin.com/company/beta-analytics", "twitterUrl": null, "logoUrl": "https://logo.clearbit.com/beta-analytics.com", "industry": "Software Development", "subcategory": "analytics", "foundedYear": 2018, "headquartersCountry": "US", "employeeCount": 140, "categories": "analytics,saas", "keywords": "analytics,product", "specialties": "product analytics" }, "employees": [], "sources": [], "acquisition": { "acquiringCompanyId": "e3f4a5b6-7c8d-4e9f-0a1b-2c3d4e5f6a7b", "acquiringCompany": { "id": "e3f4a5b6-7c8d-4e9f-0a1b-2c3d4e5f6a7b", "name": "Gamma Corp", "website": "https://gamma.com", "linkedinUrl": "https://www.linkedin.com/company/gamma", "industry": "Software Development", "logoUrl": "https://logo.clearbit.com/gamma.com" }, "amount": 250000000, "currency": "USD", "percentage": "100", "announcedDate": "2026-05-28" } }, "event_id": "2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6072", "event_type": "acquisition.created", "timestamp": "2026-05-28T14:30:00.000Z" } ``` ```json job_change.created theme={null} { "data": { "signal": { "id": "c5f3e4d6-7a8b-4c9d-0e1f-2a3b4c5d6e7f", "type": "job_change", "externalId": "jc_ghi789", "occurredAt": "2026-05-27T00:00:00.000Z", "discoveredAt": "2026-05-27T09:45:00.000Z", "active": true }, "company": { "id": "f4a5b6c7-8d9e-4f0a-1b2c-3d4e5f6a7b8c", "name": "Delta Systems", "slug": "delta-systems", "description": "Cloud infrastructure provider.", "website": "https://delta.systems", "linkedinUrl": "https://www.linkedin.com/company/delta-systems", "twitterUrl": null, "logoUrl": "https://logo.clearbit.com/delta.systems", "industry": "IT Services and IT Consulting", "subcategory": "cloud-infra", "foundedYear": 2015, "headquartersCountry": "GB", "employeeCount": 320, "categories": "cloud,devops", "keywords": "cloud,infrastructure", "specialties": "cloud,kubernetes" }, "employees": [], "sources": [ { "url": "https://www.linkedin.com/posts/...", "sourceType": "social_media", "author": null, "title": null, "content": null, "validationScore": null, "validationReasoning": null, "publishedAt": null } ], "jobChange": { "personName": "Jordan M.", "personLinkedinUrl": "https://www.linkedin.com/in/jordan-m", "newRole": "VP of Engineering", "companyName": "Delta Systems", "companyLinkedinUrl": "https://www.linkedin.com/company/delta-systems", "postContent": "Excited to share that I've joined Delta Systems...", "personCurrentTitle": "VP of Engineering", "personHeadline": "Engineering leader", "personLocation": "London, United Kingdom", "personCity": "London", "personCountry": "GB" } }, "event_id": "3b4c5d6e-7f80-4910-9a1b-2c3d4e5f6073", "event_type": "job_change.created", "timestamp": "2026-05-27T09:45:00.000Z" } ``` ```json hiring.created theme={null} { "data": { "signal": { "id": "d6f4e5d7-8a9b-4c0d-1e2f-3a4b5c6d7e8f", "type": "hiring", "externalId": "job_jkl012", "occurredAt": "2026-05-26T00:00:00.000Z", "discoveredAt": "2026-05-26T11:00:00.000Z", "active": true }, "company": { "id": "a5b6c7d8-9e0f-4a1b-2c3d-4e5f6a7b8c9d", "name": "Epsilon Health", "slug": "epsilon-health", "description": "Digital health platform.", "website": "https://epsilon.health", "linkedinUrl": "https://www.linkedin.com/company/epsilon-health", "twitterUrl": null, "logoUrl": "https://logo.clearbit.com/epsilon.health", "industry": "Hospitals and Health Care", "subcategory": "digital-health", "foundedYear": 2019, "headquartersCountry": "US", "employeeCount": 60, "categories": "healthtech", "keywords": "health,telemedicine", "specialties": "telemedicine" }, "employees": [], "sources": [], "hiringDetails": [ { "title": "Senior Backend Engineer", "jobUrl": "https://epsilon.health/careers/senior-backend-engineer", "location": "San Francisco, CA", "city": "San Francisco", "country": "US", "employmentType": "Full-time", "seniorityLevel": "Senior", "jobFunction": "Engineering", "datePosted": "2026-05-26T00:00:00.000Z" } ] }, "event_id": "4c5d6e7f-8091-4a21-9b2c-3d4e5f6a7074", "event_type": "hiring.created", "timestamp": "2026-05-26T11:00:00.000Z" } ``` ```json new_company.created theme={null} { "data": { "signal": { "id": "e7f5e6d8-9a0b-4c1d-2e3f-4a5b6c7d8e9f", "type": "new_company", "externalId": "co_mno345", "occurredAt": "2026-05-25T00:00:00.000Z", "discoveredAt": "2026-05-25T10:00:00.000Z", "active": true }, "company": { "id": "b6c7d8e9-0f1a-4b2c-3d4e-5f6a7b8c9d0e", "name": "Zeta Robotics", "slug": "zeta-robotics", "description": "Warehouse automation robots.", "website": "https://zeta-robotics.com", "linkedinUrl": "https://www.linkedin.com/company/zeta-robotics", "twitterUrl": null, "logoUrl": "https://logo.clearbit.com/zeta-robotics.com", "industry": "Automation Machinery Manufacturing", "subcategory": "robotics", "foundedYear": 2024, "headquartersCountry": "DE", "employeeCount": 12, "categories": "robotics,hardware", "keywords": "robotics,automation", "specialties": "warehouse automation" }, "employees": [], "sources": [] }, "event_id": "5d6e7f80-9112-4a31-9b2c-3d4e5f6a7075", "event_type": "new_company.created", "timestamp": "2026-05-25T10:00:00.000Z" } ``` ```json investor.created theme={null} { "data": { "investor": { "id": "f8a6b7c9-1d2e-4f3a-4b5c-6d7e8f9a0b1c", "name": "Nova Ventures", "type": "VC", "website": "https://nova.vc", "linkedinUrl": "https://www.linkedin.com/company/nova-ventures", "twitterUrl": null, "logoUrl": "https://logo.clearbit.com/nova.vc", "countries": ["US", "GB"], "ticketSizeMin": 250000, "ticketSizeMax": 2000000, "headquarters": "San Francisco, CA", "createdAt": "2026-07-09T10:00:00.000Z" } }, "event_id": "6e7f8091-a223-4b41-9c2d-4e5f6a7b8076", "event_type": "investor.created", "timestamp": "2026-07-09T10:00:00.000Z" } ``` Person names in `job_change.created` payloads are GDPR-masked (first name + last initial, e.g. `"Jordan M."`), matching the masking applied across the REST API. Use `personLinkedinUrl` as the stable identifier for a person. In `investor.created` payloads, `type` is the original scraped value (free text, e.g. `VC`, `Corporate VC`, `Solo angel` — see [Investor Types](/enums#investor-types)), `countries` is an array of ISO 3166-1 alpha-2 codes, and `ticketSizeMin` / `ticketSizeMax` are whole USD amounts. Nullable fields are `null`, and `countries` may be empty. For `dashboard.push`, `data` instead contains `companies`, `investors`, and `contacts` arrays (contacts GDPR-masked) plus a `meta` block describing the push. ## Verifying the Signature The signature is `HMAC-SHA256(raw_body, secret)`, hex-encoded, sent in `X-Webhook-Signature`. The secret is the value returned when you created (or last rotated) the webhook. Verify against the **exact raw bytes** of the request body. Parsing the JSON and re-serializing it can change whitespace or key order, which changes the bytes and breaks the HMAC. Capture the raw body before any JSON parsing. ```js Node.js (Express) theme={null} import express from "express"; import crypto from "node:crypto"; const app = express(); const WEBHOOK_SECRET = "your-webhook-secret"; // express.raw keeps req.body as the raw Buffer so the HMAC matches exactly. app.post( "/webhook", express.raw({ type: "application/json" }), (req, res) => { const sent = req.get("X-Webhook-Signature") ?? ""; const expected = crypto .createHmac("sha256", WEBHOOK_SECRET) .update(req.body) // raw bytes .digest("hex"); const a = Buffer.from(expected); const b = Buffer.from(sent); if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) { return res.status(401).send("bad signature"); } const event = JSON.parse(req.body.toString("utf8")); // ...handle event, dedupe on event.event_id... res.json({ ok: true }); }, ); app.listen(3000); ``` ```python Python (FastAPI) theme={null} import hmac, hashlib from fastapi import FastAPI, Request, HTTPException app = FastAPI() WEBHOOK_SECRET = "your-webhook-secret" @app.post("/webhook") async def webhook(request: Request): raw_body = await request.body() # raw bytes, before parsing sent = request.headers.get("X-Webhook-Signature", "") expected = hmac.new( WEBHOOK_SECRET.encode(), raw_body, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, sent): raise HTTPException(status_code=401, detail="bad signature") event = await request.json() # ...handle event, dedupe on event["event_id"]... return {"ok": True} ``` ## Delivery & Retry Contract * **Success** = any HTTP `2xx` from your endpoint. Any other status, or a network error, is a **failure** (a network error is recorded with `response_status: 0`). * **One attempt per event.** The current release does **not** automatically retry failed deliveries on a schedule. Build idempotent handlers and reconcile gaps yourself. * **Manual retry** is available: list failed deliveries with [List Deliveries](/api-reference/webhooks/endpoint/deliveries) (`?status=failed`) and replay them with [Retry Delivery](/api-reference/webhooks/endpoint/retry). * **Idempotency:** `event_id` (also sent as `X-Webhook-ID`) is stable across the original delivery and any retries, so you can safely dedupe. * **Response storage:** the first **1000 characters** of your response body are stored per delivery for debugging. * Respond quickly — acknowledge with `2xx`, then process asynchronously. ## Full Lifecycle Over the API A vendor can onboard end-to-end without opening the dashboard: ```bash theme={null} # 1. Create (capture the secret from the response — shown only once) curl -X POST "https://www.trysignalbase.com/api/v2/webhooks" \ -H "Authorization: Bearer $SB_KEY" -H "Content-Type: application/json" \ -d '{ "endpoint_url": "https://example.com/hook", "event_types": ["funding.created"] }' # 2. List curl "https://www.trysignalbase.com/api/v2/webhooks" -H "Authorization: Bearer $SB_KEY" # 3. Fire a test event and verify the signature on your endpoint curl -X POST "https://www.trysignalbase.com/api/v2/webhooks/$ID/test" \ -H "Authorization: Bearer $SB_KEY" # 4. Inspect failed deliveries, then retry one curl "https://www.trysignalbase.com/api/v2/webhooks/$ID/deliveries?status=failed" \ -H "Authorization: Bearer $SB_KEY" curl -X POST "https://www.trysignalbase.com/api/v2/webhooks/$ID/deliveries/$DELIVERY_ID/retry" \ -H "Authorization: Bearer $SB_KEY" # 5. Delete (soft-delete) curl -X DELETE "https://www.trysignalbase.com/api/v2/webhooks/$ID" \ -H "Authorization: Bearer $SB_KEY" ``` ## Dashboard Parity & Migration Everything above is also available without code under **Workspace → Webhooks** in the dashboard. Because the dashboard and the REST API share one code path, a webhook created in the UI is fully manageable via the API and vice versa. * **Webhooks are editable in place.** To change a URL or event list, use [Update Webhook](/api-reference/webhooks/endpoint/update) (or the dashboard **Edit** button) — you no longer need to delete and recreate. The signing secret is preserved across edits unless you pass `rotate_secret: true`. * **Retrieve existing config:** vendors who configured webhooks through the dashboard can list and manage them immediately via [List Webhooks](/api-reference/webhooks/endpoint/list) — no migration step required. Only `secret_preview` is exposed for pre-existing webhooks; rotate the secret if you need a fresh full value. ## Error Handling Errors return a non-2xx status with `{ success: false, error, code }`. | HTTP | `code` | Meaning | | ---- | ------------------------------------------ | -------------------------------------------------------------------------------------------- | | 400 | `bad_request` | Invalid body, invalid endpoint URL, invalid event type, or the 10-webhook limit was reached. | | 401 | `invalid_api_key` | Missing or invalid API key. | | 403 | `subscription_expired` | The key's team has no active subscription. | | 404 | `not_found` | Webhook or delivery not found (or not owned by your team). | | 409 | `conflict` | Retrying a delivery that already succeeded. | | 429 | `rate_limited` | Rate limit exceeded. Includes a `retryAfter` field and `X-RateLimit-*` headers. | | 500 | `internal_server_error` / `internal_error` | Unexpected server error. | # Enums & Constants Source: https://docs.trysignalbase.com/enums Reference for enumerated values used across the Signalbase V2 APIs ## Overview This page lists all enumeration values and constants used across the Signalbase V2 APIs. Use it to validate filter parameters, build UIs, and understand available options for each endpoint. ## Company fields in signal responses Across **funding**, **acquisition**, **hiring**, and **job change** signal endpoints, company headquarters are always exposed as **`companyCountry`** (ISO-style country code where available). * **Nested company objects** use the same rule. For example, on acquisition signals the `acquiringCompany` object uses **`companyCountry`** (not `country`) for the acquirer’s HQ. * **Hiring signals** also return **`jobCountry`**: the country associated with the **job listing location**. That is separate from **`companyCountry`** (the employer’s HQ). ## Company subcategory in responses When a company row has been classified, responses include **`companySubcategory`**: a single subcategory id drawn from the same vocabulary as the **`subcategories`** query parameter (see the **Subcategories** section on this page). The field is omitted or `null` when no subcategory is assigned. ## Signal Types The three signal types available in the API: ```json copy theme={null} ["funding_round", "acquisition", "job_change"] ``` ## Date Presets Industry-standard relative date filters supported across the **signal endpoints** — funding, acquisitions, hiring, job changes, and investors. When provided, `date_preset` takes precedence over `dateFrom` / `dateTo`. The **Companies** endpoint does not support date filtering (`date_preset`, `dateFrom`, and `dateTo` are ignored there). ```json copy theme={null} [ "today", "yesterday", "last_7d", "last_14d", "last_30d", "last_60d", "last_90d", "last_6m", "last_1y", "last_2y", "this_week", "this_month", "this_quarter", "this_year", "last_week", "last_month", "last_quarter", "last_year" ] ``` ## Funding Signals Enums ### Funding Round Types Values accepted by the `round` filter, ordered by prevalence. Values are stored and returned in **lowercase**. ```json copy theme={null} [ "seed", "series a", "pre-seed", "series b", "series c", "series d", "angel", "series e", "equity", "series f", "debt financing", "fund", "debt", "ipo", "crowdfunding", "growth", "series g", "series h" ] ``` The `round` filter is an **exact, case-insensitive match** — `Series A`, `series a`, and `SERIES A` all match the same rows, so you don't need to match the exact capitalization. Passing a value **not** in the list above returns **`400 Bad Request`** (rather than silently empty results), so you get a clear error on a typo. Responses may still contain other, less common round types for rows matched by your other filters. ### Round Flavors Optional modifiers that can be applied to a funding round: ```json copy theme={null} ["bridge", "extension", "secondary"] ``` ### Verification Statuses Filter signals by their verification status: ```json copy theme={null} ["verified", "unverified", "pending"] ``` ### Amounts & Currency #### How `amount`, `amount_min`, `amount_max`, and `currency` work Funding and acquisition amounts are **whole units of the deal's currency** (an integer — not cents and not a float). For example, a \$5M round is `5000000`. The `currency` field tells you which currency each `amount` is in. | Field | Description | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | `amount` (response) | Integer amount in whole currency units (see `currency`). `null` when the amount is undisclosed. | | `amount_min` (filter) | Minimum amount, inclusive (`>=`). Compared directly against `amount`. | | `amount_max` (filter) | Maximum amount, inclusive (`<=`). Compared directly against `amount`. | | `currency` (filter) | Filters rows by their `currency` value. **Does not convert** between currencies — it's a simple exact match on the currency field. | Amounts are **not converted to a common currency** — each `amount` is expressed in its own `currency` (most are `USD`). If your results span multiple currencies, an `amount_min` / `amount_max` filter compares the raw numbers regardless of currency, so add a `currency` filter (e.g. `currency=USD`) when you need an apples-to-apples range. #### Currency Values Both endpoints record `currency` as **ISO 4217 codes** (exact match, case-sensitive): * **Funding** — most records are `USD`; the rest are mostly `EUR` and `GBP`. Filter with the exact code, e.g. `?currency=USD`. Common values: ```json copy theme={null} ["USD", "EUR", "GBP", "CHF", "JPY", "INR", "CAD", "AUD", "SEK", "CNY", "NZD", "KRW", "SGD", "DKK", "BRL"] ``` * **Acquisitions** — almost all records are `USD`, with a small number of `EUR`. Filter with `?currency=USD`. ### Funding Sort Fields Available sort fields for the funding endpoint: ```json copy theme={null} ["occurred_at", "discovered_at", "amount", "employee_count", "founded_year"] ``` ### Acquisition Sort Fields Available sort fields for the acquisitions endpoint: ```json copy theme={null} ["occurred_at", "discovered_at", "amount", "employee_count"] ``` ## Job Change Signals Enums ### Positions Filter job changes by specific positions: ```json copy theme={null} [ "ceo", "cto", "cfo", "coo", "vp of engineering", "vp of sales", "vp of marketing", "head of product", "head of growth", "head of engineering", "engineering manager", "product manager", "sales manager", "marketing manager", "founder", "co-founder" ] ``` ### Departments Filter by department: ```json copy theme={null} [ "marketing", "sales", "engineering", "product", "design", "operations", "finance", "people", "data", "customer_success", "growth", "legal" ] ``` ### Seniorities Filter by seniority level: ```json copy theme={null} ["founder", "c_level", "vp", "director", "head", "lead", "manager"] ``` ### Job Change Sources ```json copy theme={null} ["linkedin", "press_release", "other"] ``` ### Job Change Sort Fields Available sort fields for the job changes endpoint: ```json copy theme={null} ["occurred_at", "discovered_at", "person_name", "company_name"] ``` ## People Search Enums Values for the [People API](/api-reference/people/introduction) (`GET /api/v2/people`). These use their own taxonomy — matched by word boundaries on job titles — and are distinct from the Job Change position/department enums above. ### People Functions Filter people by function (`function` parameter): ```json copy theme={null} [ "marketing", "sales", "engineering", "product", "design", "operations", "finance", "people", "data", "customer_success", "growth", "legal" ] ``` ### People Seniorities Filter people by seniority level (`seniority` parameter): ```json copy theme={null} ["founder", "c_level", "vp", "director", "head", "lead", "manager"] ``` ### People Company Size Bands Filter people by their company's headcount (`company_size` parameter): ```json copy theme={null} ["1-10", "11-50", "51-100", "101-250", "251-500", "501-1000", "1000-plus"] ``` ### People Signal Types Signal types that can back a person's `matched_signal` (`signal_type` parameter): ```json copy theme={null} ["funding_round", "acquisition", "job_change"] ``` ### People Signal Date Range The `signal_date_range` parameter is a relative lookback window written as ``, where unit is one of: | Unit | Meaning | Example | | ---- | ------- | --------------- | | `d` | days | `30d` | | `w` | weeks | `6w` | | `m` | months | `12m` (default) | | `y` | years | `2y` | ## Signal Source Types Types of sources a signal may originate from: ```json copy theme={null} [ "press_release", "news_article", "social_media", "blog_post", "sec_filing", "crunchbase", "pitchbook" ] ``` ## Investors Enums ### Investor Types Values accepted by the `type` filter: ```json copy theme={null} [ "vc", "angel", "pe", "corporate", "government", "accelerator", "family_office", "hedge_fund", "crowdfunding" ] ``` The underlying `type` field is **free-text** (scraped values like `VC`, `VC firm`, `Venture Capital`, `venture_capital`, `Corporate VC`, `Solo angel`, `PE fund`). These slugs are **convenience groupings**: each is matched **case-insensitively** against the common real-world variants — e.g. `vc` matches `VC` / `VC firm` / `Venture Capital` / `venture_capital` / `Corporate VC`, and `angel` matches `Angel` / `Solo angel` / `Angel network`. To filter by a value outside this list, use the `search` parameter, which also matches the `type` field. The `type` field **in the response is the original scraped value** (e.g. `Corporate VC`), not the slug you filtered by — so a single `type=vc` query returns rows whose `type` reads `VC`, `Venture Capital`, `Corporate VC`, and so on. ### Investor Sort Fields Available sort fields for the investors endpoint: ```json copy theme={null} ["name", "created_at", "ticket_size_min", "ticket_size_max"] ``` ## Sort Orders Used across all endpoints: ```json copy theme={null} ["asc", "desc"] ``` ## Countries (All APIs) Both country categories and country codes can be used to filter results via the `countries` parameter. Every endpoint that accepts `countries` also accepts **`exclude_countries`** — a denylist that removes rows whose country matches any listed value (country names such as `China` or codes such as `CN`). It complements `countries`, and rows with an unknown/NULL country are kept, not excluded. The acquisition-signals endpoint additionally exposes **`acquirer_countries`** and **`exclude_acquirer_countries`**, which apply the same allowlist/denylist logic to the **acquiring** company's HQ (the `countries`/`exclude_countries` pair targets the **acquired** company). The people endpoint uses the singular `country` for its allowlist alongside `exclude_countries`. ### Country Categories ```json copy theme={null} ["CEE", "WE", "NORDICS", "NA", "LATAM"] ``` ### Country Codes (ISO 3166-1 alpha-2) ```json copy theme={null} [ "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW" ] ``` ## Company Categories & Industries Companies have two classification systems that map to different API filter parameters: | API Parameter | DB Column | Description | Delimiter | | --------------- | --------------------- | ----------------------------------- | ------------------- | | `categories` | `company.industry` | LinkedIn industry label (free text) | pipe `\|` separated | | `subcategories` | `company.subcategory` | Signalbase category (strict enum) | comma `,` separated | ### Categories (`categories` parameter) The `categories` parameter filters by exact match on the company's LinkedIn industry label. These are free-text labels sourced from LinkedIn's industry taxonomy. The taxonomy has **20 main categories** that group **434 industries**. Since this is a free-text field, new labels may appear as companies are ingested. #### Main Categories (20) ```json copy theme={null} [ "Accommodation Services", "Administrative and Support Services", "Construction", "Consumer Services", "Education", "Entertainment Providers", "Farming, Ranching, Forestry", "Financial Services", "Government Administration", "Holding Companies", "Hospitals and Health Care", "Manufacturing", "Oil, Gas, and Mining", "Professional Services", "Real Estate and Equipment Rental Services", "Retail", "Technology, Information and Media", "Transportation, Logistics, Supply Chain and Storage", "Utilities", "Wholesale" ] ``` #### All Industries (434) ```json copy theme={null} [ "Abrasives and Nonmetallic Minerals Manufacturing", "Accessible Architecture and Design", "Accessible Hardware Manufacturing", "Accommodation Services", "Accounting", "Administration of Justice", "Administrative and Support Services", "Advertising Services", "Agricultural Chemical Manufacturing", "Agriculture, Construction, Mining Machinery Manufacturing", "Air, Water, and Waste Program Management", "Airlines and Aviation", "Alternative Dispute Resolution", "Alternative Fuel Vehicle Manufacturing", "Alternative Medicine", "Ambulance Services", "Amusement Parks and Arcades", "Animal Feed Manufacturing", "Animation and Post-production", "Apparel Manufacturing", "Appliances, Electrical, and Electronics Manufacturing", "Architectural and Structural Metal Manufacturing", "Architecture and Planning", "Armed Forces", "Artificial Rubber and Synthetic Fiber Manufacturing", "Artists and Writers", "Audio and Video Equipment Manufacturing", "Automation Machinery Manufacturing", "Aviation and Aerospace Component Manufacturing", "Baked Goods Manufacturing", "Banking", "Bars, Taverns, and Nightclubs", "Bed-and-Breakfasts, Hostels, Homestays", "Beverage Manufacturing", "Biomass Electric Power Generation", "Biotechnology Research", "Blockchain Services", "Blogs", "Boilers, Tanks, and Shipping Container Manufacturing", "Book Publishing", "Book and Periodical Publishing", "Breweries", "Broadcast Media Production and Distribution", "Building Construction", "Building Equipment Contractors", "Building Finishing Contractors", "Building Structure and Exterior Contractors", "Business Consulting and Services", "Business Content", "Business Intelligence Platforms", "Cable and Satellite Programming", "Capital Markets", "Caterers", "Chemical Manufacturing", "Chemical Raw Materials Manufacturing", "Child Day Care Services", "Chiropractors", "Circuses and Magic Shows", "Civic and Social Organizations", "Civil Engineering", "Claims Adjusting, Actuarial Services", "Clay and Refractory Products Manufacturing", "Climate Data and Analytics", "Climate Technology Product Manufacturing", "Coal Mining", "Collection Agencies", "Commercial and Industrial Equipment Rental", "Commercial and Industrial Machinery Maintenance", "Commercial and Service Industry Machinery Manufacturing", "Communications Equipment Manufacturing", "Community Development and Urban Planning", "Community Services", "Computer Games", "Computer Hardware Manufacturing", "Computer Networking Products", "Computer and Network Security", "Computers and Electronics Manufacturing", "Conservation Programs", "Construction", "Construction Hardware Manufacturing", "Consumer Goods Rental", "Consumer Services", "Correctional Institutions", "Cosmetology and Barber Schools", "Courts of Law", "Credit Intermediation", "Cutlery and Handtool Manufacturing", "Dairy Product Manufacturing", "Dance Companies", "Data Infrastructure and Analytics", "Data Security Software Products", "Defense and Space Manufacturing", "Dentists", "Design Services", "Desktop Computing Software Products", "Digital Accessibility Services", "Distilleries", "E-Learning Providers", "Economic Programs", "Education", "Education Administration Programs", "Electric Lighting Equipment Manufacturing", "Electric Power Generation", "Electric Power Transmission, Control, and Distribution", "Electrical Equipment Manufacturing", "Electronic and Precision Equipment Maintenance", "Embedded Software Products", "Emergency and Relief Services", "Engineering Services", "Engines and Power Transmission Equipment Manufacturing", "Entertainment Providers", "Environmental Quality Programs", "Environmental Services", "Equipment Rental Services", "Events Services", "Executive Offices", "Executive Search Services", "Fabricated Metal Products", "Facilities Services", "Family Planning Centers", "Farming", "Farming, Ranching, Forestry", "Fashion Accessories Manufacturing", "Financial Services", "Fine Arts Schools", "Fire Protection", "Fisheries", "Flight Training", "Food and Beverage Manufacturing", "Food and Beverage Retail", "Food and Beverage Services", "Footwear Manufacturing", "Footwear and Leather Goods Repair", "Forestry and Logging", "Fossil Fuel Electric Power Generation", "Freight and Package Transportation", "Fruit and Vegetable Preserves Manufacturing", "Fuel Cell Manufacturing", "Fundraising", "Funds and Trusts", "Furniture and Home Furnishings Manufacturing", "Gambling Facilities and Casinos", "Geothermal Electric Power Generation", "Glass Product Manufacturing", "Glass, Ceramics and Concrete Manufacturing", "Golf Courses and Country Clubs", "Government Administration", "Government Relations Services", "Graphic Design", "Ground Passenger Transportation", "HVAC and Refrigeration Equipment Manufacturing", "Health and Human Services", "Higher Education", "Highway, Street, and Bridge Construction", "Historical Sites", "Holding Companies", "Home Health Care Services", "Horticulture", "Hospitality", "Hospitals", "Hospitals and Health Care", "Hotels and Motels", "Household Appliance Manufacturing", "Household Services", "Household and Institutional Furniture Manufacturing", "Housing Programs", "Housing and Community Development", "Human Resources Services", "Hydroelectric Power Generation", "IT Services and IT Consulting", "IT System Custom Software Development", "IT System Data Services", "IT System Design Services", "IT System Installation and Disposal", "IT System Operations and Maintenance", "IT System Testing and Evaluation", "IT System Training and Support", "Individual and Family Services", "Industrial Machinery Manufacturing", "Industry Associations", "Information Services", "Insurance", "Insurance Agencies and Brokerages", "Insurance Carriers", "Insurance and Employee Benefit Funds", "Interior Design", "International Affairs", "International Trade and Development", "Internet Marketplace Platforms", "Internet News", "Internet Publishing", "Interurban and Rural Bus Services", "Investment Advice", "Investment Banking", "Investment Management", "Janitorial Services", "Landscaping Services", "Language Schools", "Laundry and Drycleaning Services", "Law Enforcement", "Law Practice", "Leasing Non-residential Real Estate", "Leasing Residential Real Estate", "Leather Product Manufacturing", "Legal Services", "Legislative Offices", "Libraries", "Lime and Gypsum Products Manufacturing", "Loan Brokers", "Machinery Manufacturing", "Magnetic and Optical Media Manufacturing", "Manufacturing", "Maritime Transportation", "Market Research", "Marketing Services", "Mattress and Blinds Manufacturing", "Measuring and Control Instrument Manufacturing", "Meat Products Manufacturing", "Media & Telecommunications", "Media Production", "Medical Equipment Manufacturing", "Medical Practices", "Medical and Diagnostic Laboratories", "Mental Health Care", "Metal Ore Mining", "Metal Treatments", "Metal Valve, Ball, and Roller Manufacturing", "Metalworking Machinery Manufacturing", "Military and International Affairs", "Mining", "Mobile Computing Software Products", "Mobile Food Services", "Mobile Gaming Apps", "Motor Vehicle Manufacturing", "Motor Vehicle Parts Manufacturing", "Movies and Sound Recording", "Movies, Videos and Sound", "Museums", "Museums, Historical Sites, and Zoos", "Musicians", "Nanotechnology Research", "Natural Gas Distribution", "Natural Gas Extraction", "Newspaper Publishing", "Non-profit Organizations", "Nonmetallic Mineral Mining", "Nonresidential Building Construction", "Nuclear Electric Power Generation", "Nursing Homes and Residential Care Facilities", "Office Administration", "Office Furniture and Fixtures Manufacturing", "Oil Extraction", "Oil and Coal Product Manufacturing", "Oil and Gas", "Oil, Gas, and Mining", "Online Audio and Video Media", "Online and Mail Order Retail", "Operations Consulting", "Optometrists", "Outpatient Care Centers", "Outsourcing and Offshoring Consulting", "Packaging and Containers Manufacturing", "Paint, Coating, and Adhesive Manufacturing", "Paper and Forest Product Manufacturing", "Pension Funds", "Performing Arts", "Performing Arts and Spectator Sports", "Periodical Publishing", "Personal Care Product Manufacturing", "Personal Care Services", "Personal and Laundry Services", "Pet Services", "Pharmaceutical Manufacturing", "Philanthropic Fundraising Services", "Photography", "Physical, Occupational and Speech Therapists", "Physicians", "Pipeline Transportation", "Plastics Manufacturing", "Plastics and Rubber Product Manufacturing", "Political Organizations", "Postal Services", "Primary Metal Manufacturing", "Primary and Secondary Education", "Printing Services", "Professional Organizations", "Professional Services", "Professional Training and Coaching", "Public Assistance Programs", "Public Health", "Public Policy Offices", "Public Relations and Communications Services", "Public Safety", "Racetracks", "Radio and Television Broadcasting", "Rail Transportation", "Railroad Equipment Manufacturing", "Ranching", "Ranching and Fisheries", "Real Estate", "Real Estate Agents and Brokers", "Real Estate and Equipment Rental Services", "Recreational Facilities", "Regenerative Design", "Religious Institutions", "Renewable Energy Equipment Manufacturing", "Renewable Energy Power Generation", "Renewable Energy Semiconductor Manufacturing", "Repair and Maintenance", "Research Services", "Residential Building Construction", "Restaurants", "Retail", "Retail Apparel and Fashion", "Retail Appliances, Electrical, and Electronic Equipment", "Retail Art Dealers", "Retail Art Supplies", "Retail Books and Printed News", "Retail Building Materials and Garden Equipment", "Retail Florists", "Retail Furniture and Home Furnishings", "Retail Gasoline", "Retail Groceries", "Retail Health and Personal Care Products", "Retail Luxury Goods and Jewelry", "Retail Motor Vehicles", "Retail Musical Instruments", "Retail Office Equipment", "Retail Office Supplies and Gifts", "Retail Pharmacies", "Retail Recyclable Materials & Used Merchandise", "Reupholstery and Furniture Repair", "Robot Manufacturing", "Robotics Engineering", "Rubber Products Manufacturing", "Satellite Telecommunications", "Savings Institutions", "School and Employee Bus Services", "Seafood Product Manufacturing", "Secretarial Schools", "Securities and Commodity Exchanges", "Security Guards and Patrol Services", "Security Systems Services", "Security and Investigations", "Semiconductor Manufacturing", "Services for Renewable Energy", "Services for the Elderly and Disabled", "Sheet Music Publishing", "Shipbuilding", "Shuttles and Special Needs Transportation Services", "Sightseeing Transportation", "Skiing Facilities", "Smart Meter Manufacturing", "Soap and Cleaning Product Manufacturing", "Social Networking Platforms", "Software Development", "Solar Electric Power Generation", "Sound Recording", "Space Research and Technology", "Specialty Trade Contractors", "Spectator Sports", "Sporting Goods Manufacturing", "Sports Teams and Clubs", "Sports and Recreation Instruction", "Spring and Wire Product Manufacturing", "Staffing and Recruiting", "Steam and Air-Conditioning Supply", "Strategic Management Services", "Subdivision of Land", "Sugar and Confectionery Product Manufacturing", "Surveying and Mapping Services", "Taxi and Limousine Services", "Technical and Vocational Training", "Technology, Information and Internet", "Technology, Information and Media", "Telecommunications", "Telecommunications Carriers", "Telephone Call Centers", "Temporary Help Services", "Textile Manufacturing", "Theater Companies", "Think Tanks", "Tobacco Manufacturing", "Translation and Localization", "Transportation Equipment Manufacturing", "Transportation Programs", "Transportation, Logistics, Supply Chain and Storage", "Travel Arrangements", "Truck Transportation", "Trusts and Estates", "Turned Products and Fastener Manufacturing", "Urban Transit Services", "Utilities", "Utilities Administration", "Utility System Construction", "Vehicle Repair and Maintenance", "Venture Capital and Private Equity Principals", "Veterinary Services", "Vocational Rehabilitation Services", "Warehousing and Storage", "Waste Collection", "Waste Treatment and Disposal", "Water Supply and Irrigation Systems", "Water, Waste, Steam, and Air Conditioning Services", "Wellness and Fitness Services", "Wholesale", "Wholesale Alcoholic Beverages", "Wholesale Apparel and Sewing Supplies", "Wholesale Appliances, Electrical, and Electronics", "Wholesale Building Materials", "Wholesale Chemical and Allied Products", "Wholesale Computer Equipment", "Wholesale Drugs and Sundries", "Wholesale Food and Beverage", "Wholesale Footwear", "Wholesale Furniture and Home Furnishings", "Wholesale Hardware, Plumbing, Heating Equipment", "Wholesale Import and Export", "Wholesale Luxury Goods and Jewelry", "Wholesale Machinery", "Wholesale Metals and Minerals", "Wholesale Motor Vehicles and Parts", "Wholesale Paper Products", "Wholesale Petroleum and Petroleum Products", "Wholesale Photography Equipment and Supplies", "Wholesale Raw Farm Products", "Wholesale Recyclable Materials", "Wind Electric Power Generation", "Wineries", "Wireless Services", "Women's Handbag Manufacturing", "Wood Product Manufacturing", "Writing and Editing", "Zoos and Botanical Gardens" ] ``` **Example:** `?categories=Software Development|Financial Services` ### Subcategories (`subcategories` parameter) The `subcategories` parameter filters by the Signalbase-assigned company category. Values are **comma-separated** and validated against a strict enum. Only exact matches from the list below are accepted; invalid values are silently ignored. ```json copy theme={null} [ "ai", "saas", "software", "cybersecurity", "web3", "devtools", "analytics", "cloud", "iot", "fintech", "payments", "accounting", "ecommerce", "insurance", "vc & investment", "regtech", "marketing", "advertising", "sales", "hr tech", "legal", "healthcare", "biotechnology", "education", "real estate", "energy", "logistics", "manufacturing", "retail", "agriculture", "food & beverage", "automotive", "aerospace & defense", "robotics", "telecommunications", "travel", "sports", "gaming", "media", "govtech", "construction", "environmental services", "battery technology", "arts", "architecture", "cosmetics", "science", "non-profit" ] ``` **Example:** `?subcategories=ai,fintech,saas` # Signalbase API Source: https://docs.trysignalbase.com/index Real-time Funding, Acquisition, Job Change Signals & Investor Data API ## Welcome to Signalbase Signalbase API provides real-time access to funding signals, acquisition signals, job change signals, and comprehensive investor data. Our platform continuously monitors and aggregates intelligence from across the web, giving you up-to-date information to power your sales, marketing, and research workflows. Track real-time funding rounds, amounts, and investor participation across companies worldwide. Identify companies showing acquisition indicators and potential M\&A targets. Monitor leadership changes and key hires with role, department, and seniority filters. Access comprehensive data on VCs, angels, PE firms, and corporate investors. ## Getting Started Get your API key from the Signalbase dashboard at [trysignalbase.com/workspace/api](https://www.trysignalbase.com/workspace/api) ### Authentication All API endpoints require a Bearer token in the `Authorization` header: ```bash theme={null} curl -X GET "https://www.trysignalbase.com/api/v2/signals/funding?page=1&limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### Base URL All V2 API endpoints use the following base URL: ``` https://www.trysignalbase.com/api/v2 ``` ## Key Features * **Real-time Data**: Signals aggregated continuously from web sources * **Advanced Filtering**: Filter by countries, categories, subcategories, date ranges, numeric ranges, and more * **Date Presets**: Use relative date shortcuts like `last_30d`, `this_quarter`, or `last_year` * **Flexible Sorting**: Sort results by date, amount, employee count, and other fields * **Pagination Support**: Efficiently retrieve large datasets (up to 100 results per page) * **Credit-based Usage**: Transparent credit consumption per API call * **99% Uptime**: Enterprise-grade reliability ## Quick Reference View all available filter values, country codes, categories, and enum references.