# Authentication
Source: https://docs.pubrio.com/en/api-reference/authentication
Authenticate Pubrio API requests using the `pubrio-api-key` header — setup, key management, and security best practices.
## API Key
For authentication, the `pubrio-api-key` header needs to be included. The header should contain the api key, for example a `a1b2c3d4e5f6g7h8` which represents your API key.
```
pubrio-api-key: a1b2c3d4e5f6g7h8
```
You need to create an API key to access the Pubrio API. To create an API key, you can do so by accessing the [Settings](https://dashboard.pubrio.com/#/settings/) section.
The API key already includes your workspace (profile) information, so you do not need to pass `profile_id` in your request body. The `profile_id` parameter is still accepted for backward compatibility but is no longer required.
## Request headers
Along with `pubrio-api-key`, send a `User-Agent` header identifying your client.
```
pubrio-api-key: a1b2c3d4e5f6g7h8
Content-Type: application/json
User-Agent: my-app/1.0
```
**A missing or generic `User-Agent` is rejected before it reaches the API.** Requests without a recognised user agent are blocked at the edge and return `HTTP 403` with the plain-text body `error code: 1010` — not JSON, and not one of the [documented error codes](/en/api-reference/status-codes). This looks like an authentication failure but is not: your API key is fine.
Default user agents from common HTTP libraries are affected — Python's `urllib` (`Python-urllib/3.x`) is blocked, while `curl` and `requests` are not. If you get `error code: 1010`, set an explicit `User-Agent` and retry.
# List API Request Logs
Source: https://docs.pubrio.com/en/api-reference/endpoint/api-keys/logs
en-openapi POST /api_keys/logs
Retrieve a paginated list of API request logs for the workspace. Each entry summarizes a single request made with a `pubrio-api-key`, including the path, method, status code, duration, response size, and credit cost. Use the [Look up log details](/api-reference/endpoint/api-keys/logs_lookup) endpoint to fetch the full request/response payload for a specific entry.
# Look up API Request Log
Source: https://docs.pubrio.com/en/api-reference/endpoint/api-keys/logs_lookup
en-openapi POST /api_keys/logs/lookup
Retrieve the full request body, request headers, response body, and response size for a specific API request log entry. Use this to inspect what was sent or returned for a given `query_log_id` discovered via the list endpoint.
# API Usage Breakdown
Source: https://docs.pubrio.com/en/api-reference/endpoint/api-keys/usage_breakdown
en-openapi POST /api_keys/usage/breakdown
Retrieve a breakdown of API requests and credits consumed within a date range, grouped both by individual API key (`by_key`) and by endpoint (`by_endpoint`). Useful for identifying the highest-traffic keys and the most credit-intensive endpoints across the workspace.
# Daily API Usage
Source: https://docs.pubrio.com/en/api-reference/endpoint/api-keys/usage_daily
en-openapi POST /api_keys/usage/daily
Retrieve a daily breakdown of API requests and credits consumed by the workspace within a date range. The response includes a per-day timeseries and a stacked per-endpoint series suitable for building usage charts.
# Create Channel Template
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/create
en-openapi POST /channels/templates/create
Create a new outreach channel template with specified parameters.
# Create Channel Template Version
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/create_version
en-openapi POST /channels/templates/create_version
Create a new version of an existing channel template.
# Set Default Channel Template
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/default
en-openapi POST /channels/templates/default
Retrieve the default channel template for the workspace.
# Delete Channel Template
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/delete
en-openapi DELETE /channels/templates/delete
Delete a channel template from the workspace.
# Channel Template Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/lookup
en-openapi POST /channels/templates/lookup
Retrieve details of a specific channel template by ID.
# Channel Templates
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/templates
en-openapi POST /channels/templates
Retrieve a list of all channel outreach templates in the workspace.
# Update Channel Template
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/templates/update
en-openapi POST /channels/templates/update
Update an existing channel template's configuration.
# Channel Template Type
Source: https://docs.pubrio.com/en/api-reference/endpoint/channels/types/template_types
en-openapi GET /channels/types/templates
Retrieve available channel types for outreach templates.
# Company Advertisement Insights
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/advertisements_insights
en-openapi POST /companies/advertisements/insights
Aggregated advertising-signal insights for a company over a date window: active and launched ad counts, channel and placement mix, creative samples, audience reach as a tier distribution, and a weekly time series. Reach is reported as a distribution across tiers, never as a single summed figure.
# Company Advertisement Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/advertisements_lookup
en-openapi POST /companies/advertisements/lookup
Retrieve advertisement details for a specific company using an advertisement search ID. The response includes the resolved `destination_url`, the original `raw_link_url`, and, for Meta ads, `publisher_platforms`.
# Company Advertisement Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/advertisements_search
en-openapi POST /companies/advertisements/search
Search advertisements run by companies. See the [Advertisement Search guide](/en/developer-guides/search/advertisement-search).
# Company Cloud Footprint Insights
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/cloud_footprints_insights
en-openapi POST /companies/cloud_footprints/insights
Aggregate cloud footprint for one company: totals, the leading providers, countries and regions, a weekly series of newly seen infrastructure, and the most recent additions. See the [Cloud Footprint Search guide](/en/developer-guides/search/cloud-footprint-search).
# Company Cloud Footprint Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/cloud_footprints_lookup
en-openapi POST /companies/cloud_footprints/lookup
Return a single cloud footprint row by its identifier, with its cloud regions, cities and a recent sample of the infrastructure behind it. See the [Cloud Footprint Search guide](/en/developer-guides/search/cloud-footprint-search).
# Company Cloud Footprint Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/cloud_footprints_search
en-openapi POST /companies/cloud_footprints/search
Search the public cloud and hosting footprint of companies: which providers, countries and regions they run infrastructure in. Each row is one company at one provider in one country. See the [Cloud Footprint Search guide](/en/developer-guides/search/cloud-footprint-search).
# Company Lookup Enrichment
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/enrichment
en-openapi POST /companies/lookup/enrich
Realtime company enrichment. Returns the company record plus its recent hiring, media, advertising and similar-company signals in one call.
**The first call for a company can be slow.** When the record has to be enriched from scratch, expect tens of seconds — a measured cold call took 45 seconds. Once enriched, the same company returns in well under a second. Set your HTTP client timeout to at least 90 seconds: many clients default to 30 and will abort a cold call that would have succeeded. If you only ever need the stored record, call [Company Lookup](/en/api-reference/endpoint/companies/lookup) instead, which is always fast.
# Company Job Insights
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/job_insights
en-openapi POST /companies/jobs/insights
Aggregated hiring-signal insights for a company over a date window: posting volume, seniority distribution, top functions/departments/locations, and a weekly time series.
# Company Job Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/job_lookup
en-openapi POST /companies/jobs/lookup
Retrieve job posting details for a specific company using a job search ID.
# Company Job Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/job_search
en-openapi POST /companies/jobs/search
Search job postings. See the [Job Search guide](/en/developer-guides/search/job-search).
# LinkedIn Company Lookup (Realtime)
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/linkedin_lookup
en-openapi POST /companies/linkedin/lookup
Retrieve company details using a LinkedIn company page URL. Provides real-time data retrieval.
# Company Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/lookup
en-openapi POST /companies/lookup
Retrieve detailed information about a specific company using their Pubrio search ID, domain, or LinkedIn URL.
# Company News Insights
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/news_insights
en-openapi POST /companies/news/insights
Aggregated news-signal insights for a company over a date window: mention volume, top topics and sources, category and market breakdowns, and a weekly time series.
# Company News Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/news_lookup
en-openapi POST /companies/news/lookup
Retrieve news article details for a specific company using a news search ID.
# Company News Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/news_search
en-openapi POST /companies/news/search
Search news about companies. See the [News Search guide](/en/developer-guides/search/news-search).
# Company Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/search
en-openapi POST /companies/search
Search the Pubrio database for companies matching specified criteria such as industry, size, location, and technologies.
# Search Similar Companies
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/search_similar
en-openapi POST /companies/search/similar
Find companies similar to a reference company. Supply exactly one singular identifier (`domain_search_id`, `domain`, `linkedin_url` or another `*_url`); rows carry a `similarity_score` and are ordered by it, highest first.
# Lookalike Companies Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/similar
en-openapi POST /companies/lookalikes/search
**Deprecated.** Use `POST /companies/search/similar` instead — same data, same body.
Find companies similar to a specified target company based on firmographic and technographic attributes.
# Lookalike Company Lookup (Alias)
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/similar_lookup
en-openapi POST /companies/similar/lookup
Retrieve companies similar to a specified company using their Pubrio search ID, domain, or LinkedIn URL.
# Company Technology Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/companies/technology_lookup
en-openapi POST /technologies/lookup
Retrieve detailed information about a specific technology used by companies.
# Company Size
Source: https://docs.pubrio.com/en/api-reference/endpoint/company-size/company-size
en-openapi GET /company_sizes
Retrieve the list of company size categories for filtering.
# Departments
Source: https://docs.pubrio.com/en/api-reference/endpoint/departments/departments
en-openapi GET /departments/title
Retrieve the list of department titles for filtering.
# Department Function
Source: https://docs.pubrio.com/en/api-reference/endpoint/departments/function
en-openapi GET /departments/function
Retrieve the list of department functions for filtering.
# Compare Company Expansions
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/company_compare
en-openapi POST /expansions/companies/compare
Compare the expansion footprint of several companies side by side, with optional comparable peers for a target company.
# Company Expansion Detail
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/company_lookup
en-openapi POST /expansions/companies/lookup
In-depth expansion profile for a single company — current stage, signals, market presence, and stage-transition history — for one market or aggregated across all markets.
# Expansion Rankings
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/company_markers
en-openapi POST /expansions/companies/rankings
Lightweight ranked list of company/market pairs by expansion score — suited to map or heatmap rendering.
# Company Signal Events
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/company_pulse_events
en-openapi POST /expansions/companies/pulse_events
Enriched, paginated drill-down into the signal events driving a single company's expansion.
# Batch Company Expansion Summaries
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/company_summaries
en-openapi POST /expansions/companies/summaries
Ready-to-render expansion summaries for a batch of companies, prepared for side-by-side comparison without client-side aggregation.
# Expansion Overview
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/dashboard
en-openapi POST /expansions/dashboard
Market-level expansion KPIs — per-market stage counts and top cross-border flows. Aggregated, not paginated.
# Expansion Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/market_lookup
en-openapi POST /expansions/search
Find companies expanding into one or more markets using firmographic and signal filters or a plain-language query, with optional AI match explanations grounded in each company's real signals.
# Expansion Signal Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/signal_search
en-openapi POST /expansions/signals/search
Raw, paginated expansion signal rows — the dated evidence behind each company's stage, with source and evidence URL.
# Expansion Filters
Source: https://docs.pubrio.com/en/api-reference/endpoint/expansions/types
en-openapi POST /expansions/types
Reference catalog for the expansion taxonomy — stages, signal types, strengths, polarities, momentum, and freshness — used to resolve the values returned by the other expansion endpoints.
# Locations
Source: https://docs.pubrio.com/en/api-reference/endpoint/locations/locations
en-openapi GET /locations
Retrieve the list of locations available for search filters.
# Management Levels
Source: https://docs.pubrio.com/en/api-reference/endpoint/management-levels/management-levels
en-openapi GET /management_levels
Retrieve the list of management and seniority levels for filtering.
# Create Monitor
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/create
en-openapi POST /monitors/create
Create a data monitor: an always-on watch that continuously surfaces the business signals you care about — new job postings, news, advertisements, or market-expansion moves — from the companies and filters you define, enriches each match with company and contact data, and delivers it to your destination (email or webhook) on your chosen schedule. Configure it field by field, or describe the whole monitor in one plain-language sentence with `query` and it is interpreted into the configuration within the same request.
# Delete Monitor
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/delete
en-openapi DELETE /monitors/delete
Delete a monitor from the workspace.
# Duplicate Monitor
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/duplicate
en-openapi POST /monitors/duplicate
Create a copy of an existing monitor with the same configuration.
# Interpret Monitor
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/interpret
en-openapi POST /monitors/interpret
Preview a monitor before you build it — turn a plain-language request (in any language) into a validated **draft** configuration you can inspect, adjust, and then submit to [Create Monitor](/en/api-reference/endpoint/monitors/create). It's safe to call as often as you need: it only drafts, and never persists a monitor, sends alerts, or spends credits. Use `intent` to choose the action; if omitted, an English keyword heuristic is applied and unrecognised input defaults to `create_monitor`.
# Monitor Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/lookup
en-openapi POST /monitors/lookup
Retrieve detailed information about a specific monitor.
# Get Monitor List
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/monitors
en-openapi POST /monitors
Retrieve a list of all monitors in the workspace.
# Monitor Process Retry
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/process_retry
en-openapi POST /monitors/process/retry
Retry a failed monitor processing run.
# Monitor Process Try
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/process_try
en-openapi POST /monitors/process/try
Run a saved monitor by id, or run an unsaved ad-hoc configuration by passing the config inline; with monitor_id, inline fields override the saved monitor for this run.
# Monitor Signature Reveal
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/signature_reveal
en-openapi POST /monitors/signature/reveal
Retrieve the webhook signing secret for a monitor.
# Monitor Statistics
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/statistics
en-openapi POST /monitors/statistics
Retrieve a workspace-wide overview of monitor trigger statistics. There is no monitor_id parameter — figures are aggregated across all monitors in the workspace (watchlist-backed monitors are excluded).
# Monitor Statistics Chart
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/statistics_chart
en-openapi POST /monitors/statistics/chart
Retrieve chart-ready time-series statistics data for a monitor.
# Monitor Statistic Logs
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/statistics_logs
en-openapi POST /monitors/statistics/logs
Retrieve a paginated list of detection logs for a specific monitor.
# Monitor Statistic Log Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/statistics_logs_lookup
en-openapi POST /monitors/statistics/logs/lookup
Retrieve details of a specific monitor detection log entry.
# Update Monitor
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/update
en-openapi POST /monitors/update
Update an existing monitor's configuration and detection rules.
# Monitor Validate Webhook
Source: https://docs.pubrio.com/en/api-reference/endpoint/monitors/webhook_validate
en-openapi POST /monitors/webhook/validate
Send a signed test payload to a webhook URL and report whether it was accepted.
**This performs a real HTTP delivery**, not a URL syntax check. The receiver must accept a `POST` and respond successfully — a URL that merely serves a page on `GET` still fails. On failure you get `40023` (URL not valid or unreachable) or `40022` (test delivery failed), and `details` carries the raw upstream response body, which can be several kilobytes of HTML. Pass `monitor_id` to sign the test with that monitor's real signature; omit it and a placeholder signature is used.
# News Categories
Source: https://docs.pubrio.com/en/api-reference/endpoint/news/categories
en-openapi GET /companies/news/categories
Retrieve the list of news article categories for filtering.
# News Galleries
Source: https://docs.pubrio.com/en/api-reference/endpoint/news/galleries
en-openapi GET /companies/news/galleries
Retrieve the list of news galleries for filtering.
# News Languages
Source: https://docs.pubrio.com/en/api-reference/endpoint/news/languages
en-openapi GET /companies/news/languages
Retrieve the list of available languages for news filtering.
# LinkedIn People Lookup (Realtime)
Source: https://docs.pubrio.com/en/api-reference/endpoint/people/linkedin_lookup
en-openapi POST /people/linkedin/lookup
Retrieve person details using a LinkedIn profile URL. Provides real-time data retrieval.
# People Lookup
Source: https://docs.pubrio.com/en/api-reference/endpoint/people/lookup
en-openapi POST /people/lookup
Retrieve detailed information about a specific person using their Pubrio search ID or LinkedIn URL.
# People Search
Source: https://docs.pubrio.com/en/api-reference/endpoint/people/search
en-openapi POST /people/search
Search the Pubrio database for people matching specified criteria such as job title, location, company, and seniority.
# Search Similar People
Source: https://docs.pubrio.com/en/api-reference/endpoint/people/search_similar
en-openapi POST /people/search/similar
Find people similar to a reference person. Supply one reference (`people_search_id`, `linkedin_url`, `linkedin_urls`, `peoples` or `people_titles`); rows carry a `similarity_score` and are ordered by it, highest first.
# Profile Details
Source: https://docs.pubrio.com/en/api-reference/endpoint/profile/profile
en-openapi POST /profile
Retrieve the current workspace profile details including plan information and settings.
# Profile Usage
Source: https://docs.pubrio.com/en/api-reference/endpoint/profile/profile-usage
en-openapi POST /profile/usage
Retrieve credit usage and quota statistics for the current workspace profile.
# Redeem People - Single
Source: https://docs.pubrio.com/en/api-reference/endpoint/redeem/people
en-openapi POST /redeem/people
Spend credits to unlock full contact details (email, phone) for a specific person.
# Redeem People - Bulk
Source: https://docs.pubrio.com/en/api-reference/endpoint/redeem/people/batch
en-openapi POST /redeem/people/batch
Submit a batch request to unlock contact details for multiple people at once.
# Redeem People - Bulk Status
Source: https://docs.pubrio.com/en/api-reference/endpoint/redeem/people/batch/query
en-openapi POST /redeem/people/batch/query
Check the status and results of a previously submitted batch redeem request.
# Contact Lookup - Single
Source: https://docs.pubrio.com/en/api-reference/endpoint/redeem/people/contact/lookup
en-openapi POST /redeem/people/contact/lookup
Reverse-lookup a person by email, phone, or (with similarity search enabled) first/last name plus domain or company. Returns the matched person's `people_search_id` and base details, plus `match` metadata describing how the match was made. Charges 1 credit per billable match.
# Contact Lookup - Bulk
Source: https://docs.pubrio.com/en/api-reference/endpoint/redeem/people/contact/lookup/batch
en-openapi POST /redeem/people/contact/lookup/batch
Batch version of `/redeem/people/contact/lookup`. Submit up to your subscription's bulk size limit in a single request. Each entry in `peoples` accepts the same identifiers as the single-lookup body. Charges 1 credit per billable match — duplicate inputs and unmatched entries are not charged.
# Technology Categories
Source: https://docs.pubrio.com/en/api-reference/endpoint/technologies/categories
en-openapi POST /technologies/categories
Retrieve the list of technology categories for filtering.
# Technologies
Source: https://docs.pubrio.com/en/api-reference/endpoint/technologies/technologies
en-openapi POST /technologies
Retrieve the list of technologies available for search filters.
# Timezones
Source: https://docs.pubrio.com/en/api-reference/endpoint/timezones/timezones
en-openapi GET /timezones
Retrieve the list of supported timezones.
# User Details
Source: https://docs.pubrio.com/en/api-reference/endpoint/user/user
en-openapi GET /user
Retrieve details about the currently authenticated user.
# Vertical Categories
Source: https://docs.pubrio.com/en/api-reference/endpoint/verticals/vertical_categories
en-openapi POST /verticals/categories
Retrieve the list of vertical categories for filtering.
# Vertical Sub-Categories
Source: https://docs.pubrio.com/en/api-reference/endpoint/verticals/vertical_sub_categories
en-openapi POST /verticals/sub_categories
Retrieve the list of vertical sub-categories for filtering.
# Verticals
Source: https://docs.pubrio.com/en/api-reference/endpoint/verticals/verticals
en-openapi POST /verticals
Retrieve the list of industry verticals for filtering.
# Enums & Constants
Source: https://docs.pubrio.com/en/api-reference/enums
Every fixed value the Pubrio API accepts or returns — seniority ranks, job functions, ad sources and formats, reach tiers, signal types, management levels — on one page.
Most Pubrio filters take a **slug** from a closed list. Short lists are printed here in full. Long, changing lists (countries, technologies, verticals, news categories) come from the endpoints under the **Filters** group, and this page tells you which one.
Most search filters **do not reject** an unknown value. Some drop the filter and return everything (`seniority_ranks`), others apply it and return nothing (`functions`, `source_types`, `reach_tiers`). Both look like a normal `200`. Always check `metadata.ignored_fields` and, on advertisement search, `metadata.unsupported_source_types`.
## Conventions
| Shape | Meaning | Example |
| ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
| `["YYYY-MM-DD", "YYYY-MM-DD"]` | Inclusive date window `[from, to]`. Day boundaries follow your workspace timezone, except `launch_dates` and `active_dates`, which use UTC. Where noted, a single element means that one day. | `["2026-08-01", "2026-08-31"]` |
| Date or ISO timestamp (scalar: `created_at`, `published_at`) | At or after this instant, compared in UTC. | `"2026-09-02T12:00:00Z"` |
| `[min, max]` with `null` | Numeric range; `null` leaves that side open. | `[1, null]` = at least one |
| Arrays of slugs | Match **any** listed value (OR) unless you promote the key to AND with [`filter_conditions`](/en/developer-guides/filters/filter-conditions). | `["linkedin", "facebook"]` |
| Country codes | ISO 3166-1 alpha-2, upper-case. Full list from [Locations](/en/api-reference/endpoint/locations/locations). | `"US"`, `"SG"` |
***
## Job Search
Used by [Job Search](/en/api-reference/endpoint/companies/job_search) and echoed on every job row.
### Seniority ranks
`seniority_ranks` filter · `seniority_rank` response field. Resolved from the job title.
| Rank | Tier | Covers |
| ---- | ------------ | ---------------------------------------------------------------------------- |
| `5` | executive | VP and above, owners, founders, partners, C-suite |
| `4` | director | Director and head-of roles below VP |
| `3` | manager | Manager |
| `2` | senior | Senior individual contributor |
| `1` | junior | Entry, intern and other individual contributors |
| `0` | unclassified | Response only — the title could not be classified. Not a valid filter value. |
A value outside `1`–`5` is ignored and the filter is dropped, so `[7]` returns everything.
### Job functions
`functions` filter · `functions` response field (array, `null` when unclassified). The same slug can appear on many titles; a title can carry several slugs. Matches any listed slug; an unrecognised slug matches nothing.
The most common slugs, in descending order of postings:
| Slug | Slug | Slug |
| -------------------------- | ----------------------- | ----------------------------- |
| `engineering` | `sales` | `entrepreneurship` |
| `human_resources` | `operations` | `marketing` |
| `consulting` | `business_development` | `information_technology` |
| `education` | `finance` | `support` |
| `administrative` | `arts_and_design` | `media_and_commmunication` |
| `legal` | `accounting` | `data_science` |
| `product_management` | `engineering_technical` | `teacher` |
| `customer_service_support` | `software_development` | `office_operations` |
| `lawyer_attorney` | `all_design` | `project_management` |
| `nursing` | `logistics` | `financial_planning_analysis` |
| `content_marketing` | `graphic_design` | `executive` |
| `it_operations` | `talent_management` | `research_development` |
| `financial_reporting` | `quality_assurance` | `construction` |
| `medicine` | `customer_experience` | `psychology` |
`media_and_commmunication` is spelled with three `m`s in the data. Copy it as written.
The long tail (several hundred further slugs such as `information_security`, `supply_chain`, `devops`) uses the same vocabulary as the `slug` column of [Department Functions](/en/api-reference/endpoint/departments/function). The quickest way to discover slugs for a niche is to run an unfiltered search on a few relevant companies and read the `functions` array on the rows.
### Job source types
`source_type` response field. `linkedin` for the large majority of postings; partner job boards report their own slug (`wantedly`, `tw1111`, `rocketpunch`). Older rows can be `null`.
***
## Advertisement Search
Used by [Advertisement Search](/en/api-reference/endpoint/companies/advertisements_search), [Advertisement Insights](/en/api-reference/endpoint/companies/advertisements_insights) and the `advertisement_*` filters on [Company Search](/en/api-reference/endpoint/companies/search).
### Source types
`source_types` / `exclude_source_types` filters · `source_type` response field · `advertisement_platforms` on Company Search.
`linkedin` · `facebook` · `google` · `tiktok` · `apple`
`meta` is accepted as an alias of `facebook`. `facebook` spans every Meta surface; narrow it with `publisher_platforms`.
### Formats
`advertisement_formats` filter · `advertisement_format_normalized` response field. The raw label the source publishes is kept in `advertisement_format`.
| Canonical slug | Raw labels it covers |
| ----------------- | ----------------------------------------------------------------- |
| `image` | `image`, `IMAGE`, `Single Image Ad` |
| `video` | `video`, `VIDEO`, `Video Ad`, `MULTI_VIDEOS`, `Premiere Video Ad` |
| `text` | `text`, `TEXT`, `Text Ad` |
| `carousel` | `CAROUSEL`, `MULTI_IMAGES`, `MULTI_MEDIAS`, `DCO`, `Carousel Ad` |
| `dynamic_product` | `DPA` |
| `document` | `Document Ad` |
| `message` | `Message Ad` |
| `event` | `EVENT`, `Event Ad` |
| `article` | `LinkedIn Article Ad` |
| `spotlight` | `Spotlight Ad` |
| `follow` | `Follow Company Ad` |
| `job` | `Job Ad` |
| `engagement` | `PAGE_LIKE` |
| `other` | Response only — a raw label not in this map |
### Publisher platforms
`publisher_platforms` / `exclude_publisher_platforms` filters · `publisher_platforms` response field. Meta surfaces only; `null` on every other source. Case-insensitive on input, lower-case in responses.
`facebook` · `instagram` · `messenger` · `threads` · `audience_network`
### Reach tiers
`reach_tiers` filter · `reach_tiers[]` catalog on Advertisement Insights. Derived from the **lower bound** of the source's impression range, so a `10k-50k` ad sits in `10k_50k`. Ads with no impression estimate never match a tier.
| Slug | Impressions |
| ----------- | ----------- |
| `lt_1k` | \< 1K |
| `1k_10k` | 1K – 10K |
| `10k_50k` | 10K – 50K |
| `50k_100k` | 50K – 100K |
| `100k_500k` | 100K – 500K |
| `500k_1m` | 500K – 1M |
| `1m_plus` | 1M+ |
### Advertisement status
`advertisement_status` filter on Company Search.
| Slug | Meaning |
| -------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `currently_running` | Companies with advertising on record. For ads that are still live, filter with `advertisement_running_ads: [1, null]` |
| `active_last_30_min` | The company's ad records changed in the last 30 minutes — useful for polling |
### Social media
`social_media` filter on Company Search. OR by default.
`linkedin` · `facebook` · `instagram` · `tiktok` · `twitter` · `x` · `github` · `wantedly` · `rocketpunch`
### Country activity
`advertisement_country_activity` takes one object: `{ "country": "US", "rank": [null, 500] }` or `{ "country": "US", "percentile": [90, null] }`. Rank `1` is the biggest advertiser in that country. See [Advertising activity filters](/en/developer-guides/filters/overview#advertising-activity-filters).
***
## News Search
Used by [News Search](/en/api-reference/endpoint/companies/news_search) and [News Insights](/en/api-reference/endpoint/companies/news_insights).
| Filter | Vocabulary | Where to fetch it |
| ------------------------------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
| `categories` | Category slugs such as `acquires`, `partners_with`, `receives_financing`, `launches` | [News Categories](/en/api-reference/endpoint/news/categories) — `slug` |
| `news_galleries` / `news_gallery_ids` | Gallery slug or UUID | [News Galleries](/en/api-reference/endpoint/news/galleries) |
| `news_languages` | ISO 639-1 codes (`en`, `ja`, `ko`, `zh`, …) | [News Languages](/en/api-reference/endpoint/news/languages) |
| `locations` / `company_locations` | Country codes | [Locations](/en/api-reference/endpoint/locations/locations) |
### Expansion signal enums
Only applied when `is_expansion_signal_available: true`.
| Field | Values |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `expansion_signal_types` | `AD` `AUDIENCE` `DNS` `ENTITY` `EVENT` `EVENT_PLUS` `EXEC` `HIRE` `INFRA` `IP` `NEWS` `OFFICE` `PARTNER` `PRODUCT` `REG` `SCALE` `TECH` |
| `expansion_signal_polarities` | `expansion` `contraction_leading` `contraction_confirming` `contraction_lagging` |
| `signal_strength_slug` (response) | `low` `medium` `high` `very_high` |
The full expansion vocabulary — stages, freshness, momentum — is on [Expansion Filters](/en/api-reference/endpoint/expansions/types).
***
## People Search
### Management levels
`management_levels` filter. An unknown slug is dropped when other people filters are present; when it is the only people filter the request fails with `40037 Parameter(s) incorrect`.
`c_suite` · `director` · `entry` · `founder` · `head` · `intern` · `manager` · `owner` · `partner` · `senior` · `vp`
Note the C-suite slug is `c_suite`, not `c_level`. Fetch names in your language from [Management Levels](/en/api-reference/endpoint/management-levels/management-levels).
### Departments and functions
| Filter | Vocabulary | Where to fetch it |
| ---------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `departments` | `master_*` slugs, e.g. `master_engineering_technical`, `master_sales` | [Departments](/en/api-reference/endpoint/departments/departments) |
| `department_functions` | Function slugs, e.g. `software_development`, `account_management` | [Department Functions](/en/api-reference/endpoint/departments/function) |
***
## Company Search
| Filter | Vocabulary | Where to fetch it |
| ------------------------------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------- |
| `verticals`, `vertical_categories`, `vertical_sub_categories` | Vertical slugs | [Verticals](/en/api-reference/endpoint/verticals/verticals) and its category endpoints |
| `technologies` | Technology slugs | [Technologies](/en/api-reference/endpoint/technologies/technologies) |
| `employees` | Company-size band slugs | [Company Size](/en/api-reference/endpoint/company-size/company-size) |
| `locations`, `exclude_locations` | Country codes | [Locations](/en/api-reference/endpoint/locations/locations) |
***
## Response-only constants
| Field | Values | Meaning |
| ---------------------------------------- | -------------------------------- | ---------------------------------------------------------------- |
| `metadata.coverage_notes[].scope` | `eea_uk_ch` | Coverage note for a requested source |
| `metadata.skipped_source_types[].reason` | `country_unknown_until_enriched` | The source was not applied for the requested `target_locations` |
| `pagination.is_timeout` | `true` / `false` | The count query timed out; `total_entries` is a partial estimate |
| `metadata.ignored_fields` | Array of request keys | Keys the endpoint dropped because it does not recognise them |
## Related
How arrays, AND/OR and `filter_conditions` combine across every search endpoint.
The full error-code table.
# Pubrio API Overview
Source: https://docs.pubrio.com/en/api-reference/introduction
Complete Pubrio REST API reference — endpoints for company and people enrichment, search, lookup, redeem, real-time monitors, and more.
The Pubrio REST API exposes the expansion-intelligence graph powering the platform — real-time signals that catch companies entering new markets, plus the company and people data beneath them: search, enrichment, lookup, redeem, and monitors. All endpoints share the same base URL and authentication scheme.
## Base URL
```
https://api.pubrio.com
```
## Getting Started
Authenticate requests with the `pubrio-api-key` header.
Per-endpoint and per-plan rate limits.
HTTP responses, error codes, and retry guidance.
## Endpoint Groups
Workspace profile, usage, and authenticated user details.
Enrich company and people records with firmographic and contact data.
Search companies, people, jobs, news, and advertisements with rich filters.
Direct lookup by company, person, job, news, technology, or LinkedIn URL.
Find similar companies and people based on a reference record.
Reveal verified emails and phone numbers — single or batch.
Lookup companies and people directly by LinkedIn URL.
Manage outreach templates and channel types.
Real-time signal detection with automatic enrichment and webhook delivery.
Reference values for technologies, locations, departments, verticals, and more.
## Next Steps
Walkthroughs for monitors, webhooks, and filter conditions.
Concepts, best practices, and integration case studies.
# Logo API
Source: https://docs.pubrio.com/en/api-reference/logo-api
Free, public company logo lookup by domain. Embed company logos in your CRM, dashboards, marketing pages, or sequences with a simple URL — no API key required.
The Pubrio Logo API returns a company's logo from its domain. No API key. No sign-up. Just a URL.
```html theme={null}
```
## Quick start
```html HTML theme={null}
```
```bash curl theme={null}
curl -L https://logo.pubrio.com/stripe.com -o stripe-logo.png
```
```js JavaScript theme={null}
const logoUrl = `https://logo.pubrio.com/${domain}`;
// Use directly in
or fetch the binary
```
```jsx React theme={null}
```
```python Python theme={null}
import requests
r = requests.get(f"https://logo.pubrio.com/{domain}")
with open("logo.png", "wb") as f:
f.write(r.content)
```
## Endpoint
```
GET https://logo.pubrio.com/{domain}
```
| Parameter | In | Required | Description |
| --------- | ---- | -------- | -------------------------------------------------------------------------------------------------------------- |
| `domain` | path | ✅ | The company domain (e.g., `stripe.com`, `apple.com`). With or without `www.`; protocol is ignored if included. |
**Response:** the logo image binary, served with the appropriate `Content-Type` header.
No authentication required. No `Authorization` header, no API key, no signed URLs. Hotlink directly from `
` in production.
## How it works
Provide any company domain in the URL path. Pubrio resolves the canonical brand and returns its logo from a continuously refreshed source set.
Logos are cached at the edge. First request warms the cache; subsequent requests serve from the closest POP with sub-100ms latency.
Public endpoint. Embed directly in `
` tags, marketing sites, prospecting tools, dashboards, or browser extensions.
Unknown or unresolvable domains return a neutral placeholder rather than a broken image — your UI never shows a missing-asset icon.
## Examples
## Common use cases
Show logos next to company records in your CRM, sales tooling, or BI dashboards — no need to upload, store, or maintain a logo asset library.
Embed the recipient's company logo in personalized outbound — every send fetches the freshest logo from the CDN.
Render a company grid by domain. Works for public, private, early-stage, or international companies that aren't in mainstream stock-image sets.
Customer logo walls, integration grids, "trusted by" sections — fed straight from a list of domains.
## Migrating from another logo provider
If your existing logo URLs follow the `host/{domain}` pattern, switching to Pubrio is a one-line find-and-replace.
```diff Before / After theme={null}
-
+
```
```js JavaScript theme={null}
// Replace the host in your existing helper
const logo = `https://logo.pubrio.com/${domain}`;
```
Same URL shape, same response contract (image binary by domain), no auth — for most codebases the migration is a single string replacement.
## FAQ
No. The Logo API is public and free. You can hotlink images from `
` in client-side HTML, marketing pages, dashboards, and extensions without any credentials.
Unknown or unresolvable domains return a neutral placeholder image rather than a 404 — your UI stays clean. If you need to detect "no logo found" programmatically, inspect the response headers.
Pubrio returns the highest-quality format available for each brand (typically PNG with transparency). The `Content-Type` header reflects the actual format served.
The endpoint is designed for in-page hotlinking and high-volume CDN delivery. There are no per-IP rate limits for normal browser usage. Server-to-server bulk crawling is subject to fair-use throttling — if you have a high-volume backend use case, reach out.
Yes — that's the primary use case. Embed `
` directly. Logos are cached at the edge for fast delivery worldwide.
Pubrio continuously re-fetches and refreshes logos from canonical brand sources. Most logos are updated within days of a brand change.
No. The Logo API is a standalone free service. If you also want company enrichment, employee counts, signals, or contact data, see the [main API reference](/en/api-reference/introduction).
## Beyond logos: the full Pubrio API
The Logo API is a free utility. If you find it useful, the rest of the Pubrio platform turns the same domain into a full company profile.
Resolve a domain into employee count, industry, location, technographics, and more.
Find verified contacts at any company by role, seniority, or department.
Real-time hiring, news, and ad signals delivered via Webhook.
Free plan with credits — no card required.
# Rate limit
Source: https://docs.pubrio.com/en/api-reference/rate-limits
Rate limit to ensure the stability and reliability.
## Total API Requests
Your total API requests are governed by the specifics of your current Pubrio plan. To understand your monthly request limits, be sure to check out Pubrio’s API pricing details.
Pubrio employs a fixed-window rate limiting approach for API calls. For example,
| Subscription | API Call (Per Hour) | API Call (Per Day) | API Call (Per Month) |
| ------------ | ------------------- | ------------------ | -------------------- |
| Free | `60` | `1,440` | `44,640` |
| Growth | `6,000` | `144,000` | `4,464,000` |
| Business | `60,000` | `1,440,000` | `44,640,000` |
| Organization | `Custom` | `Custom` | `Custom` |
API calls are consumption based, which means if you have multiple users in the same profile (i.e. organization), the API calls will be a multiple of the number of user licences.
## Rate limit
The Pubrio API has a rate limit to ensure the stability and reliability of the service. It has a fixed window rate limit of 3,000 requests per minute.
This is a soft limit and can be adjusted based on your specific use case; please let the support team know if you have any particular requirements. When you exceed the rate limit, you will receive a 429 response code.
## Checking your usage
Call [Profile Usage](/en/api-reference/endpoint/profile/profile-usage) to read your current consumption and ceilings without guessing from the table above.
| Field | Meaning |
| ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
| `api_hourly_usage` / `api_daily_usage` / `api_monthly_usage` | API calls consumed in the current window |
| `max_api_hourly_query` / `max_api_daily_query` / `max_api_monthly_query` | Your plan's per-licence ceiling for each window |
| `total_max_api_hourly_query` / `total_max_api_daily_query` / `total_max_api_monthly_query` | The per-licence ceiling multiplied by your seat count — the limit that actually applies to the workspace |
| `api_last_refreshed` | When the counters were last rolled over |
The same four groups exist with a `portal_` prefix for dashboard usage, which is metered separately from API usage.
Compare `api_monthly_usage` against `total_max_api_monthly_query`, not `max_api_monthly_query` — the `total_` figures already account for the licence multiplier described above.
## Plan limits
Every ceiling that can reject a request is returned by [Profile](/en/api-reference/endpoint/profile/profile) under `subscription`. Read them rather than hard-coding values — they differ by plan.
| Field | Governs |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `max_search_per_page` | Largest `per_page` accepted. Exceeding it returns HTTP 416 (`41676`, or `41613` on company and people search) |
| `max_search_page` | Highest `page` accepted on most searches |
| `max_company_search_page` | Highest `page` accepted on company search specifically |
| `max_display_search_page` | Page count reported back in `pagination.total_display_pages` |
| `max_company_search_select_limit` / `max_people_search_select_limit` | Largest `select_size` for bulk selection |
| `max_export_limit` / `max_statistic_export_limit` | Row ceiling for exports |
| `max_record_upload_size` | Largest accepted upload |
| `max_expansion_window_days` | Widest date window on expansion endpoints (`null` = unlimited) |
| `max_expansion_markets_preview` | Markets returned before `other_markets_locked_count` truncates (`null` = unlimited) |
| `max_expansion_comparison_peers` | Peers returned by expansion comparison (`null` = unlimited) |
A limit breach is **HTTP 416**, not 400, and the result set is never silently clamped — the request fails outright. See [Status Codes](/en/api-reference/status-codes).
# Status Codes / Errors
Source: https://docs.pubrio.com/en/api-reference/status-codes
Pubrio employs HTTP status / error codes to signify the outcome of your requests.
Not all API status codes are currently documented by Pubrio. This documentation contains the most common codes.
If you encounter a status that does not make sense, contact Pubrio's support team for further assistance.
## Response codes
Typically, 2xx HTTP status codes denote success, 4xx codes represent failures related to the user, and 5xx codes signal infrastructure problems.
Codes are **not** derivable from the HTTP status. Pagination and quota overflows return **HTTP 416** with a `416xx` code — branch on the `code` field, not on the status alone.
| Status | Code | Description |
| ------ | ------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `200` | `-` | Request was successful |
| `400` | `400` | Data not exists |
| `400` | `40020` | Monitor with this title already exists |
| `400` | `40021` | Monitor detection mode cannot be modified after creation |
| `400` | `40022` | Webhook test delivery failed |
| `400` | `40023` | Webhook URL is not valid or unreachable |
| `400` | `40024` | Company-first detection mode requires at least one domain search |
| `400` | `40025` | Monitor has reached the maximum failure threshold and has been deactivated |
| `400` | `40026` | People enrichment configuration is invalid |
| `400` | `40027` | Monitor log already succeeded |
| `400` | `40028` | Monitor log is missing payload or monitor reference |
| `400` | `40029` | Monitor no longer exists |
| `400` | `40035` | The target sequence for this monitor no longer exists. Update the destination sequence before saving or resuming this monitor. |
| `400` | `40037` | Parameter(s) incorrect |
| `400` | `40038` | URL incorrect format |
| `400` | `40041` | Bad request |
| `400` | `40043` | country\_code must be a valid cca2 in Locations |
| `400` | `40051` | Email has already signed up |
| `400` | `41847` | Missing parameter |
| `401` | `40001` | Unauthorized |
| `401` | `40129` | Environment access unauthorized |
| `403` | `40303` | Forbidden |
| `403` | `40313` | Profile access forbidden |
| `403` | `40335` | API access forbidden |
| `403` | `40343` | Secret token access forbidden |
| `403` | `40346` | Chrome extension access forbidden |
| `403` | `40348` | Permission forbidden |
| `403` | `40349` | Subscription permission forbidden |
| `403` | `40360` | Permission denied for expansion signals operation |
| `404` | `40435` | No expansion activity found for this company in the selected market. |
| `404` | `40437` | Expansion signal not found |
| `406` | `40604` | You need to purchase additional user licence |
| `406` | `40605` | Credit purchase minimum #min\_credit\_topup# |
| `406` | `40606` | Not enough credits |
| `406` | `40632` | The current status does not allow updates to the status you selected |
| `406` | `40633` | You need to submit a request to update the status of your choice |
| `408` | `40801` | Request timeout |
| `409` | `40901` | Current subscription |
| `409` | `40902` | This plan is not able to subscribe |
| `409` | `40903` | Contact support |
| `409` | `40904` | Data conflict |
| `416` | `41613` | Maximum limit exceeded |
| `416` | `41675` | Maximum page limit exceeded |
| `416` | `41676` | Maximum per page limit exceeded |
| `416` | `41691` | Maximum API query limit exceeded |
| `416` | `41692` | Maximum portal query limit exceeded |
| `416` | `41695` | Maximum extension query limit exceeded |
| `422` | `42234` | Record not found |
| `422` | `42235` | Record already exists |
| `422` | `42236` | Cycle hierarchy detected |
| `429` | `429` | Too Many Requests |
# Best Practices & Polling
Source: https://docs.pubrio.com/en/developer-guides/best-practices
Optimize your monitor setup for reliability, performance, and efficient delivery.
## Real-Time Frequency
The `frequency_minute` parameter controls how often your monitor scans.
| Setting | Behavior | Use Case |
| ----------------- | ----------------------------------------------------------------- | ---------------------------------------------- |
| **`0` (default)** | **Real-time** — signals are detected and delivered as they appear | Most monitors — fastest possible delivery |
| `1 - 60` | Fixed interval in minutes | When you want predictable cadence |
| `60 - 1440` | Hourly to daily | Digest-style summaries, lower priority signals |
With `frequency_minute: 0`, Pubrio detects and delivers signals as they appear — no polling, no delay.
***
## Retry Configuration
When a webhook delivery fails, retries help recover automatically.
| Parameter | Range | Default | Recommendation |
| ----------------------- | ----- | ------- | ---------------------------------------------------- |
| `max_retry_per_trigger` | 0 - 3 | 1 | Set to 2-3 for critical monitors |
| `retry_delay_second` | 1 - 5 | 1 | Use 3-5 seconds to allow transient issues to resolve |
Retries re-deliver the same payload — they do not re-run the signal detection or incur additional search credits.
***
## Process Retry
The [Process Retry](/en/api-reference/endpoint/monitors/process_retry) endpoint lets you re-attempt a specific failed delivery. Key benefits:
* **No charge for failures** — you are not charged credits when a delivery fails. Credits are only consumed on successful delivery.
* **Troubleshooting** — retry a failed log entry to diagnose webhook issues without creating new triggers.
* **Original destination option** — use `is_use_original_destination` to retry with the destination snapshot from the original log, useful when you have updated your webhook URL since the failure.
Find failed deliveries via [Statistic Logs](/en/api-reference/endpoint/monitors/statistics_logs) and retry them individually.
***
## Failure Handling
The `max_failure_trigger` parameter (range: 1-10, default: 5) controls how many consecutive delivery failures are allowed before the monitor automatically pauses.
**Recommended approach:**
1. Set `notification_email` to receive alerts when failures occur
2. Keep `max_failure_trigger` at 3-5 for production monitors
3. Use [Statistic Logs](/en/api-reference/endpoint/monitors/statistics_logs) to diagnose failures — check `error_message` and `response_status_code`
4. After fixing the issue, reactivate via [Update Monitor](/en/api-reference/endpoint/monitors/update)
5. Use [Process Retry](/en/api-reference/endpoint/monitors/process_retry) to re-attempt specific failed deliveries
***
## Polling with Statistics Endpoints
While webhooks handle real-time delivery, the statistics endpoints provide monitoring, debugging, and audit capabilities.
### Overview polling
Use [Monitor Statistics](/en/api-reference/endpoint/monitors/statistics) for a dashboard-level health check:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/statistics \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{ "profile_id": 1 }'
```
Returns aggregate metrics: total monitors, triggers today vs yesterday, success rates, and comparison rates.
### Log-based polling
Use [Statistic Logs](/en/api-reference/endpoint/monitors/statistics_logs) to review trigger history:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/statistics/logs \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"profile_id": 1,
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"page": 1,
"per_page": 10
}'
```
Each log entry includes status, credit usage, signal/company/people counts, processing time, and error details.
Combine webhook delivery with periodic log polling for maximum reliability: webhooks handle real-time processing, while log polling catches any missed deliveries and provides an audit trail.
***
## Scaling Recommendations
**Prefer focused monitors over overly broad ones.** A monitor tracking "AI jobs at US enterprise companies" is easier to debug than "all jobs everywhere." Focused monitors also let you route different signal types to different webhook endpoints.
Your webhook endpoint should:
* Respond within 30 seconds
* Return `200` immediately and process data asynchronously
* Handle duplicate payloads gracefully (idempotency)
* Log all incoming payloads for debugging
Use [Get Monitor List](/en/api-reference/endpoint/monitors/monitors) with filtering:
* Filter by `detection_mode` and `destination_type`
* Sort by `last_modified` or `last_trigger_at`
* Search by name with `search_term`
Use [Monitor Statistics](/en/api-reference/endpoint/monitors/statistics) to spot underperforming monitors quickly.
# Example: Tracking Job Postings
Source: https://docs.pubrio.com/en/developer-guides/examples/tracking-job-postings
Complete walkthroughs for monitoring job postings using company_first and signal_first detection modes — with copyable code.
This guide walks through two real-world scenarios. Every code block is ready to copy, paste, and run — just replace `YOUR_API_KEY` with your actual key.
## Scenario: Monitor when OpenAI posts new jobs
You want to know immediately when OpenAI posts job openings — and automatically get contact details for their engineering leadership.
### Create the monitor
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/create \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"name": "OpenAI Job Tracker",
"detection_mode": "company_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"locations": ["US"]
}
}
],
"companies": [
"67c4696b-b7b0-46b5-b2af-9f434543661e"
],
"is_company_enrichment": true,
"is_people_enrichment": true,
"people_enrichment_configs": [
{
"max_people_to_return": 5,
"people_contact_types": ["email-work"],
"filters": {
"management_levels": ["director", "vp"],
"departments": ["master_engineering"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"headers": {
"Authorization": "Bearer your-secret-token"
}
},
"max_records_per_trigger": 5,
"profile_id": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/monitors/create",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY"
},
json={
"name": "OpenAI Job Tracker",
"detection_mode": "company_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"locations": ["US"]
}
}
],
"companies": [
"67c4696b-b7b0-46b5-b2af-9f434543661e"
],
"is_company_enrichment": True,
"is_people_enrichment": True,
"people_enrichment_configs": [
{
"max_people_to_return": 5,
"people_contact_types": ["email-work"],
"filters": {
"management_levels": ["director", "vp"],
"departments": ["master_engineering"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"headers": {
"Authorization": "Bearer your-secret-token"
}
},
"max_records_per_trigger": 5,
"profile_id": 1
}
)
data = response.json()
print(f"Monitor created: {data['data']['monitor_id']}")
print(f"Signature: {data['data']['signature']}")
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/monitors/create", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY"
},
body: JSON.stringify({
name: "OpenAI Job Tracker",
detection_mode: "company_first",
signal_types: ["jobs"],
signal_filters: [
{
signal_type: "jobs",
filters: {
locations: ["US"]
}
}
],
companies: [
"67c4696b-b7b0-46b5-b2af-9f434543661e"
],
is_company_enrichment: true,
is_people_enrichment: true,
people_enrichment_configs: [
{
max_people_to_return: 5,
people_contact_types: ["email-work"],
filters: {
management_levels: ["director", "vp"],
departments: ["master_engineering"]
}
}
],
destination_type: "webhook",
destination_config: {
webhook_url: "https://usewebhook.com/YOUR_WEBHOOK_ID",
headers: {
Authorization: "Bearer your-secret-token"
}
},
max_records_per_trigger: 5,
profile_id: 1
})
});
const data = await response.json();
console.log("Monitor created:", data.data.monitor_id);
console.log("Signature:", data.data.signature);
```
**What this does:**
* Monitors OpenAI (`companies: ["67c4696b-..."]`) for new US-based job postings
* Enriches company data and finds up to 5 Director/VP-level Engineering contacts
* Delivers up to 5 records per trigger to your webhook
* All other settings use sensible defaults (real-time frequency, 500 daily cap, etc.)
For `company_first` mode, you typically only need `companies` (or `domains` / `linkedin_urls`) and signal filters. `company_filters` is optional — it adds a second filtering layer when you want to combine a watch list with broader company criteria.
### Test it immediately
Do not wait for the scheduled scan — trigger a manual run to verify everything works. Include `tried_at` with a past timestamp to ensure there is data available (using the current time may return 0 results if no new signals have appeared yet):
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/process/try \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "YOUR_MONITOR_ID",
"tried_at": "2026-01-01T00:00:00.000Z",
"profile_id": 1
}'
```
Manual triggers consume credits just like scheduled triggers. Use `tried_at` with a recent past date to get a representative sample of results for testing.
### Check the results
After a few seconds, check your webhook URL at [usewebhook.com](https://usewebhook.com) to see the payload. You can also verify via the logs:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/statistics/logs \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"profile_id": 1,
"monitor_id": "YOUR_MONITOR_ID",
"page": 1,
"per_page": 5
}'
```
Each log entry shows the status, signal/company/people counts, credit usage, and processing time.
## Scenario: Discover companies hiring for AI/ML roles
You want to find companies actively building AI teams — regardless of whether you have tracked them before. This is a prospecting use case.
### Create the monitor
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/create \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"name": "AI Hiring Discovery",
"detection_mode": "signal_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"titles": ["Machine Learning", "AI Engineer", "Data Scientist"],
"locations": ["US"]
}
}
],
"company_filters": {
"employees": [[201, 500], [501, 1000], [1001, 5000]]
},
"is_company_enrichment": true,
"is_people_enrichment": true,
"people_enrichment_configs": [
{
"max_people_to_return": 3,
"people_contact_types": ["email-work"],
"filters": {
"management_levels": ["founder", "c_suite", "vp"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"body": {
"pipeline": "ai-prospecting"
}
},
"max_records_per_trigger": 10,
"profile_id": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/monitors/create",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY"
},
json={
"name": "AI Hiring Discovery",
"detection_mode": "signal_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"titles": ["Machine Learning", "AI Engineer", "Data Scientist"],
"locations": ["US"]
}
}
],
"company_filters": {
"employees": [[201, 500], [501, 1000], [1001, 5000]]
},
"is_company_enrichment": True,
"is_people_enrichment": True,
"people_enrichment_configs": [
{
"max_people_to_return": 3,
"people_contact_types": ["email-work"],
"filters": {
"management_levels": ["founder", "c_suite", "vp"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"body": {
"pipeline": "ai-prospecting"
}
},
"max_records_per_trigger": 10,
"profile_id": 1
}
)
data = response.json()
print(f"Monitor created: {data['data']['monitor_id']}")
```
**What this does:**
* Scans for AI/ML job postings across the US
* **Global company filters** narrow results to mid-size companies (201-5,000 employees) — this is the power of combining signals with company criteria
* Enriches companies and finds up to 3 founder/C-suite/VP contacts
* Adds a custom `pipeline` field to payloads for routing in your webhook handler
* Real-time frequency by default
### Test it immediately
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/process/try \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "YOUR_MONITOR_ID",
"tried_at": "2026-01-01T00:00:00.000Z",
"profile_id": 1
}'
```
Manual triggers consume credits. Use `tried_at` with a recent past date to get representative data for testing — using the current time may return 0 results if no new signals have appeared in that instant.
### What you receive
Check [usewebhook.com](https://usewebhook.com) — you will see a `signal_first` payload with signals as the primary structure. Notice the custom `pipeline` field at the root from your `destination_config.body`:
```json theme={null}
{
"monitor": { ... },
"metadata": {
"total_signals": 5,
"total_companies": 4,
"total_people": 10
},
"triggered_at": "2026-04-06T14:30:00.000Z",
"signals": [
{
"signal_type": "jobs",
"signal": { ... },
"companies": [
{
"company_name": "...",
"domain": "...",
"company_size": 800,
"people": [...],
...
}
]
},
...
],
"pipeline": "ai-prospecting"
}
```
***
## Retrying a Failed Delivery
If a specific trigger failed (e.g., your webhook was temporarily down), retry it without re-running the entire scan:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/process/retry \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "YOUR_MONITOR_ID",
"monitor_log_id": "THE_FAILED_LOG_ID",
"profile_id": 1
}'
```
Find the `monitor_log_id` by querying [Statistic Logs](/en/api-reference/endpoint/monitors/statistics_logs) and filtering for entries with `"status": "failed"`.
***
## Next Steps
Frequency, credits, retries, and scaling.
Detailed webhook configuration and signature verification.
# Introduction to Monitors
Source: https://docs.pubrio.com/en/developer-guides/introduction
Automated signal detection with enrichment — delivered to your webhook or email in real-time.
## Why Monitors?
Traditional APIs require you to build and maintain your own signal pipeline — polling endpoints, tracking state, handling pagination, and stitching together multiple calls for enrichment. Monitors replace all of that with a single configuration.
Signals are detected and delivered as they appear — no polling loops or cron jobs required.
Combine signal filters with global company filters in one query. "Companies with 500+ employees hiring for AI roles" — one config, not multiple API calls.
Company profiles and people contacts are enriched automatically with each trigger. No separate API calls needed.
Retry logic, failure handling, deduplication, and delivery tracking — all managed for you.
***
## How Monitors Work
Choose which signals to track (jobs, news, advertisements, expansions) and set signal-level filters. Optionally layer on **global company filters** to narrow results — for example, only surface signals from companies with 500+ employees in the US.
With `frequency_minute` set to `0` (the default), your monitor runs in real-time — detecting and delivering signals as they appear.
Matching signals are enriched with full company profiles and, optionally, people contacts — all in a single trigger. No extra calls needed.
Results arrive at your webhook endpoint or email inbox. You also get full statistics and log history through the dashboard endpoints.
***
## Detection Modes
Every monitor operates in one of two detection modes:
**Signals drive discovery.** You define what signals to look for — the system finds matching signals across all companies, then enriches the results.
Use **global company filters** (`company_filters`) as a second layer to narrow which companies qualify. For example: "Find all AI job postings, but only from companies with 1,000+ employees."
Best for:
* Broad market scanning and trend discovery
* Finding new companies you have never tracked before
* Signal-driven prospecting at scale
```
Signal Filters → Matching Signals → Global Company Filters (optional) → Enrichment → Delivery
```
**Specific companies drive discovery.** You provide a list of target companies via `companies`, `domains`, or `linkedin_urls` and the system monitors them for matching signals.
**Global company filters** (`company_filters`) still apply as a second layer here — useful when combining a watch list with broader criteria.
Best for:
* Tracking named accounts ("alert me when OpenAI posts new jobs")
* Competitive intelligence on specific companies
* Account-based monitoring pipelines
```
Target Companies (companies / domains / linkedin_urls) → Signal Filters → Global Company Filters (optional) → Enrichment → Delivery
```
***
## Signal Types
Monitors currently support four signal types, with more being added regularly:
New job postings — filter by title, location, posting date, and more.
Company news — launches, partnerships, funding rounds, leadership changes, and more.
Active ad campaigns — filter by target location, date range, and keywords.
Market-expansion evidence — a company entering or growing in a new market, filtered by corridor, stage, and signal strength.
### What Each Signal Tells You
| Signal Type | What It Reveals | Example Use Cases |
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **Jobs** | A company is actively hiring — indicating growth, new initiatives, or budget allocation in specific departments. | A surge in engineering hires often signals a new product build. Sales hiring suggests revenue expansion. |
| **News** | Company milestones — funding rounds, product launches, partnerships, leadership changes, or challenges. | A funding announcement is an ideal time to reach out. Leadership changes create new decision-maker opportunities. |
| **Advertisements** | Where and how a company is spending on marketing — revealing expansion plans, target markets, and competitive positioning. | Heavy ad spend in a new geography signals market entry. Competitors running similar campaigns indicate market activity. |
| **Expansions** | A company is entering or scaling in a specific market — backed by dated, sourced evidence such as local hiring, an office, or a registration. | A company reaching the `expanding` stage in your territory is a timed opening. Contraction signals flag accounts worth pausing. |
### Delivery Cadence
You control how frequently your monitor scans for new signals using `frequency_minute`:
| Setting | Behavior | Best For |
| ----------------- | ------------------------------------------------------------- | -------------------------------------------------- |
| **`0` (default)** | **Real-time** — signals detected and delivered as they appear | Time-sensitive alerts, competitive intelligence |
| `15` | Every 15 minutes | High-priority monitoring with predictable delivery |
| `60` | Hourly | Balanced frequency for moderate-volume monitors |
| `1440` | Daily | Digest-style summaries, lower-priority tracking |
The signal library is continuously expanding. New signal types are added as they become available — your existing monitors are not affected when new types launch.
***
## Global Company Filters
One of the most powerful features of monitors is the ability to combine signal filters with **global company filters**. This means you can define criteria like:
* "Companies with **500+ employees** that are **hiring for AI roles**"
* "**US-based SaaS companies** that appeared in **product launch news**"
* "Companies using **specific technologies** that are running **ad campaigns** in Europe"
Global company filters (`company_filters`) accept the same parameters as the [Company Search](/en/api-reference/endpoint/companies/search) endpoint — locations, employee size, industries, technologies, verticals, and more.
In `company_first` mode, use `companies` (domain\_search\_ids), `domains`, or `linkedin_urls` to specify your target company list — only one is required. `company_filters` adds additional filtering criteria in both modes.
***
## People Enrichment
When you enable people enrichment, each trigger automatically finds relevant contacts at the matched companies. Configure `people_enrichment_configs` with:
* **Filters** — management levels, departments, titles, locations — same parameters as the [People Search](/en/api-reference/endpoint/people/search) endpoint
* **Contact types** — `email-work`, `email-personal`, `phone` — refers to the [Redeem](/en/api-reference/endpoint/redeem/people) endpoint contact types
* **Max people to return** — 1 to 25 per config layer
You can define **multiple enrichment layers**, each with different filters. For example, one layer for C-suite executives and another for engineering directors. Each layer runs an independent people search.
Each enrichment layer consumes people search credits per trigger, regardless of how many people are returned. Plan your layers based on the distinct audiences you need.
***
## Understanding Credits
Each monitor trigger consumes credits based on what it processes. Refer to the [Pricing](/en/get-started/pricing) page for the latest credit rates.
| Credit Type | How It Is Consumed |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| **Trigger credit** | 10 credits per trigger |
| **Company credit** | Per company enriched in the results |
| **People search credit** | Per enrichment layer in `people_enrichment_configs` — each layer runs a people search (same credit cost as the People Search endpoint) |
| **Redeem credit** | Per person redeemed — charged on successful retrieval only, regardless of the number of emails or phone numbers returned per person |
### Example
A monitor configured with `is_company_enrichment: true`, one people enrichment layer with email redemption, and `max_records_per_trigger: 5` triggers and finds 3 companies with 2 people each:
| Component | Calculation | Credits |
| ------------- | -------------------------------------------------------- | ------------------------------- |
| Trigger | 1 trigger | 10 |
| Companies | 3 enriched companies | 3 |
| People search | 1 enrichment layer | people search credits |
| People redeem | 6 people redeemed (3 × 2, charged per person on success) | 6 × redeem rate |
| **Total** | | **13 + people search + redeem** |
Credit rates may change — always check the [Pricing](/en/get-started/pricing) page for the latest information. Only enable people enrichment if you need contact data.
***
## Destination Types
Receive results as a JSON payload at your HTTP endpoint. Include custom headers and body fields for authentication. Verify delivery authenticity using the monitor's signature.
This is the recommended destination for developers. See [Setting up Webhooks](/en/developer-guides/setting-up-webhooks) for a complete walkthrough.
Receive formatted results via email. Supports white-label branding for agencies and teams.
Interested in white-label email delivery? [Get in touch](https://pubrio.com/en/get-in-touch) to learn more.
Auto-enroll matched contacts into an outreach sequence. Requires `sequence_identifier` and `record_type` in `destination_config`.
See the [Create Monitor](/en/api-reference/endpoint/monitors/create) endpoint reference for configuration details.
***
## Configuration Reference
All configuration parameters have sensible defaults. In most cases, you only need to set the filters and destination — everything else is optional.
| Parameter | Range | Default | Description |
| ------------------------- | --------- | ------- | ------------------------------------------- |
| `frequency_minute` | 0 - 10080 | 0 | Minutes between scans. **`0` = real-time.** |
| `max_records_per_trigger` | 1 - 100 | 25 | Maximum records delivered per trigger. |
| `max_daily_trigger` | 0 - 86400 | 500 | Daily trigger cap. `0` = unlimited. |
| `max_retry_per_trigger` | 0 - 3 | 1 | Retry attempts on delivery failure. |
| `retry_delay_second` | 1 - 5 | 1 | Seconds between retry attempts. |
| `max_failure_trigger` | 1 - 10 | 5 | Consecutive failures before auto-pause. |
***
## Filter Reference
Signal and company filters reuse the same schemas as the search endpoints:
Same filters as Job Search — titles, locations, posting dates, and more.
Same filters as News Search — categories, galleries, keywords, and dates.
Same filters as Advertisements Search — target locations, date ranges, and keywords.
Same filters as Company Search — locations, size, industries, technologies, verticals, and more.
Same filters as Expansion Search — `froms` / `tos`, stages, scopes, momentum, freshness, and signal types.
People enrichment filters (management levels, departments, titles) follow the same structure as the [People Search](/en/api-reference/endpoint/people/search) endpoint.
***
## Next Steps
Connect your systems to receive data in real-time.
Frequency, delivery reliability, and failure handling.
Complete company\_first and signal\_first walkthroughs with copyable code.
Jump to the Create Monitor endpoint reference.
# Setting up Webhooks
Source: https://docs.pubrio.com/en/developer-guides/setting-up-webhooks
Configure webhook destinations, validate endpoints, verify signatures, and handle payloads.
Webhooks are the recommended way to receive monitor results. When a monitor triggers, Pubrio sends a POST request with a JSON payload to your configured URL — in real-time.
## Prerequisites
* A Pubrio API key with monitor access
* A publicly accessible HTTPS endpoint (or a test URL from [usewebhook.com](https://usewebhook.com))
**Quick testing:** Use [usewebhook.com](https://usewebhook.com) to generate a free temporary webhook URL. You can inspect every incoming payload without deploying anything.
***
## Step 1: Create a Monitor with Webhook Destination
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/create \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"name": "My First Monitor",
"detection_mode": "signal_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"locations": ["US"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"headers": {
"X-Custom-Auth": "your-secret-token"
},
"body": {
"pipeline": "my-webhook"
}
},
"max_records_per_trigger": 5,
"profile_id": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/monitors/create",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY"
},
json={
"name": "My First Monitor",
"detection_mode": "signal_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": {
"locations": ["US"]
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"headers": {
"X-Custom-Auth": "your-secret-token"
},
"body": {
"pipeline": "my-webhook"
}
},
"max_records_per_trigger": 5,
"profile_id": 1
}
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/monitors/create", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY"
},
body: JSON.stringify({
name: "My First Monitor",
detection_mode: "signal_first",
signal_types: ["jobs"],
signal_filters: [
{
signal_type: "jobs",
filters: {
locations: ["US"]
}
}
],
destination_type: "webhook",
destination_config: {
webhook_url: "https://usewebhook.com/YOUR_WEBHOOK_ID",
headers: {
"X-Custom-Auth": "your-secret-token"
},
body: {
pipeline: "my-webhook"
}
},
max_records_per_trigger: 5,
profile_id: 1
})
});
console.log(await response.json());
```
**Response:**
```json theme={null}
{
"data": {
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "My First Monitor",
"detection_mode": "signal_first",
"destination_type": "webhook",
"is_active": true,
"is_paused": false,
"masked_signature": "7••••••••••••••••8df",
"created_at": "2026-04-06T10:00:00.000Z",
"signature": "71a2b3c4-d5e6-f789-0abc-def123456789"
}
}
```
The `headers` object adds custom HTTP headers to every delivery (useful for authentication). The `body` object adds custom fields to the root of the webhook payload.
Save the `signature` from the response — you will need it to verify incoming payloads. It is only returned at creation time, via the [Signature Reveal](/en/api-reference/endpoint/monitors/signature_reveal) endpoint, or from [Monitor Lookup](/en/api-reference/endpoint/monitors/lookup) with `is_signature_reveal: true`.
***
## Step 2: Validate Your Webhook Connection
Use the [Validate Webhook](/en/api-reference/endpoint/monitors/webhook_validate) endpoint to test that your endpoint is reachable. This sends a **sample payload** with placeholder data — no credits are consumed, no real signals are fetched.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/webhook/validate \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"detection_mode": "signal_first",
"signal_types": ["jobs"],
"signal_filters": [
{
"signal_type": "jobs",
"filters": { "locations": ["US"] }
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
"headers": { "X-Custom-Auth": "your-secret-token" },
"body": { "pipeline": "my-webhook" }
},
"profile_id": 1
}'
```
A successful response returns the sample request payload that was sent and the response your endpoint returned — so you can confirm the connection works before going live.
***
## Step 3: Test with Real Data
Once the connection is validated, trigger a real run using the [Process Try](/en/api-reference/endpoint/monitors/process_try) endpoint. This fetches actual signals and delivers them to your webhook — use `tried_at` with a recent past date to ensure data is available:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/monitors/process/try \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"tried_at": "2026-01-01T00:00:00.000Z",
"profile_id": 1
}'
```
Unlike validate, the try endpoint runs a real scan and **consumes credits**. Use it to verify real payloads arrive correctly and to get a quick estimate of results before the scheduled scan kicks in.
***
## Step 4: Verify Signatures
Each monitor has a unique signature for verifying that incoming payloads are genuinely from Pubrio.
```bash cURL — Reveal Signature theme={null}
curl -X POST https://api.pubrio.com/monitors/signature/reveal \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"profile_id": 1
}'
```
```json theme={null}
{
"data": {
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"signature": "71a2b3c4-d5e6-f789-0abc-def123456789"
}
}
```
Compare this signature against the `monitor.monitor_id` in incoming payloads to verify authenticity.
***
## Webhook Payload Structure
Payloads differ based on the monitor's `detection_mode`:
In `signal_first` mode, the payload contains a top-level `signals` array:
```json theme={null}
{
"monitor": {
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "My Signal Monitor",
"detection_mode": "signal_first",
"signal_types": ["jobs", "news"],
"signal_filters": [...],
"company_filters": {...},
"is_company_enrichment": true,
"is_people_enrichment": true,
"people_enrichment_configs": [...]
},
"metadata": {
"total_signals": 3,
"total_companies": 2,
"total_people": 5
},
"triggered_at": "2026-04-05T20:29:43.832Z",
"signals": [
{
"signal_type": "jobs",
"signal": {
"signal_type": "jobs",
"job_search_id": "...",
"companies": [
{
"domain_search_id": "...",
"company_name": "...",
"domain": "...",
...
}
],
...
},
"companies": [
{
"domain_search_id": "...",
"company_name": "...",
"domain": "...",
"logo_url": "...",
"country_code": "...",
"company_size": 5000,
"industry": "...",
"people": [...],
"emails": [...],
"phones": [...],
...
}
]
},
{
"signal_type": "news",
"signal": {
"signal_type": "news",
"news_search_id": "...",
"news_id": "...",
"title": "...",
"summary": "...",
"published_at": "...",
"source": "...",
"category": "...",
"companies": [...],
...
},
"companies": [...],
...
},
...
]
}
```
Each signal entry contains the signal details and the associated enriched companies and people.
In `company_first` mode, the payload contains a top-level `companies` array with enriched company data and nested signals:
```json theme={null}
{
"monitor": {
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "My Company Monitor",
"detection_mode": "company_first",
"signal_types": ["jobs", "news", "advertisements"],
"signal_filters": [...],
"company_filters": {...},
"is_company_enrichment": true,
"is_people_enrichment": true,
"people_enrichment_configs": [...]
},
"metadata": {
"total_signals": 4,
"total_companies": 2,
"total_people": 8
},
"triggered_at": "2026-04-03T17:45:27.228Z",
"companies": [
{
"company_name": "Acme Corp",
"domain": "acmecorp.com",
"domain_search_id": "...",
"country_code": "US",
"logo_url": "...",
"linkedin_name": "acmecorp",
"company_size": 5200,
"industry": "Enterprise Software",
"estimated_revenue": 50000000,
"founded_year": 2010,
"company_address": "San Francisco, CA",
"specialties": ["SaaS", "Cloud Computing", ...],
"linkedin_url": "https://linkedin.com/company/...",
"locations": ["US"],
"signals": [
{
"signal_type": "news",
"signal": {
"news_id": "...",
"title": "Acme Corp Launches New AI Product",
"summary": "...",
"published_at": "2026-04-03T16:35:00.000Z",
"source": "techcrunch.com",
"category": "launches",
"news_category_name": "Product Launch",
...
}
},
{
"signal_type": "jobs",
"signal": {
"job_search_id": "...",
...
}
},
...
],
"people": [
{
"name": "Jane Smith",
"title": "VP of Engineering",
"email": "j.smith@acmecorp.com",
...
},
...
],
"emails": ["info@acmecorp.com", ...],
"phones": ["+14155551234", ...],
"contacts": [...],
...
},
...
]
}
```
Each company in the array includes the full enriched profile, all matching signals, and enriched people contacts.
Custom `body` fields from `destination_config` appear at the root level of the payload (e.g., `"pipeline": "my-webhook"` when configured in your destination).
***
## Expansion Signals
Alongside `jobs`, `news` and `advertisements`, a monitor can watch **expansion signals** — the dated evidence that a company is entering or growing in a new market. Add `expansions` to `signal_types`:
```json theme={null}
{
"name": "US market entries",
"detection_mode": "signal_first",
"signal_types": ["expansions"],
"signal_filters": [
{
"signal_type": "expansions",
"filters": {
"tos": ["US"],
"stages": ["expanding", "scaling"],
"signal_strengths": ["high", "very_high"],
"window_days": 30
}
}
],
"destination_type": "webhook",
"destination_config": {
"webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID"
}
}
```
Expansion filters use the [Expansion Search](/en/api-reference/endpoint/expansions/market_lookup) vocabulary, not the job/news/ad one — `froms` and `tos` for the corridor, plus `stages`, `scopes`, `momentum`, `freshness`, `signal_types`, `signal_subtypes`, `signal_strengths`, `source_types` and `window_days`. Resolve the valid slugs from [Expansion Reference](/en/api-reference/endpoint/expansions/types).
Expansion signals are grouped **per company and market**, not per signal. A company moving into two markets produces two entries, each carrying that market's own signal timeline.
### Cloud Footprint
`DNS` is the cloud footprint signal — a company standing up cloud or hosting infrastructure in a market. Narrow an expansion monitor to it with `signal_types` inside the expansion filters:
```json theme={null}
{
"signal_type": "expansions",
"filters": { "tos": ["DE"], "signal_types": ["DNS"], "window_days": 30 }
}
```
Every delivery carries `evidence_url`, a Pubrio page backing the signal. Raw infrastructure detail is never included in the payload.
### Expansion Signal Payload
```json theme={null}
{
"monitor": {
"monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "US market entries",
"detection_mode": "signal_first",
"signal_types": ["expansions"],
"signal_filters": [...]
},
"metadata": {
"total_signals": 2,
"total_companies": 1,
"total_people": 0
},
"triggered_at": "2026-08-14T09:12:04.551Z",
"signals": [
{
"signal_type": "expansions",
"signal": {
"signal_type": "expansions",
"expansion_signal_id": 90211,
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"country_code": "US",
"signal_type_slug": "HIRE",
"signal_type_name": "Hiring",
"signal_subtype_slug": "country_manager",
"signal_strength_slug": "high",
"polarity": "expansion",
"event_date": "2026-08-13T14:00:00.000Z",
"event_date_precision": "day",
"source_type": "linkedin",
"display_label": "Hired Country Manager",
"evidence_url": "https://linkedin.com/company/example-corp",
"metadata": {...},
"companies": [
{
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"company_name": "Example Corp",
"domain": "example.com",
"stage_name": "Expanding",
"stage_description": "...",
"home_country": "GB",
"home_country_name": "United Kingdom",
"target_country": "US",
"target_country_name": "United States",
"estimated_employees": 420,
"linkedin_url": "https://linkedin.com/company/example-corp"
}
]
},
"companies": [...]
}
]
}
```
Field-by-field meanings live in the [Expansion Field Reference](/en/knowledge-base/concepts/expansion-field-reference). To pull the same rows on demand rather than on a trigger, use [Expansion Signal Search](/en/api-reference/endpoint/expansions/signal_search).
***
## Email Destination
For teams that prefer email delivery, set `destination_type` to `"email"`:
```json theme={null}
{
"destination_type": "email",
"destination_config": {
"email": "alerts@your-company.com"
}
}
```
Pubrio supports white-label email delivery for agencies and teams. [Get in touch](https://pubrio.com/en/get-in-touch) to learn about customizing the sender domain and branding.
***
## Troubleshooting
* Verify your endpoint is publicly accessible (not behind a firewall or VPN)
* Ensure it returns a `200` status code — other codes are treated as failures
* Use the [Validate Webhook](/en/api-reference/endpoint/monitors/webhook_validate) endpoint to test connectivity
* Check [Statistic Logs](/en/api-reference/endpoint/monitors/statistics_logs) for error messages and response codes
If your webhook returns non-200 codes consistently, the monitor pauses after reaching `max_failure_trigger` consecutive failures. Fix the issue and reactivate via [Update Monitor](/en/api-reference/endpoint/monitors/update).
If a delivery fails and retries are configured, you may receive the same payload multiple times. Use `triggered_at` or the log ID to deduplicate on your end.
Reduce `max_records_per_trigger` to limit records per delivery. You can also narrow your filters to reduce matching signal volume.
# Get Started with the Pubrio API
Source: https://docs.pubrio.com/en/get-started/introduction
Build with Pubrio's REST API — market expansion intelligence: detect when companies enter new markets via typed, dated signals, plus company & people enrichment, search, and lookup across 200+ markets.
## What is Pubrio?
Pubrio is **expansion intelligence** for GTM, revenue, and AI teams. We watch 800M+ companies across 50+ local data sources and detect the moment any of them enters a new market — a hire, an office, a new entity, an ad, a funding round — then structure every move as a **typed, dated signal** across 200+ markets. A directory tells you who a company is; Pubrio tells you **where it's going, and when.**
Most data platforms only see the visible 30% of the economy — the well‑known companies a single global network already indexes. Pubrio is built for the other 70%: the long tail of real‑world businesses and local champions outside mainstream datasets. Through glocalization, we read local hiring boards, registries, marketplaces, ad networks, and press in each market's own language, then fold it all into one graph you can query.
A company never announces it's expanding — it leaves traces. Pubrio correlates that scattered evidence into one confirmed signal, often weeks before the press release, so your product reaches an account while the window is open — not a quarter after the news breaks.
## Pubrio.com REST API Integration
The Pubrio.com REST API allows developers to seamlessly interact with the platform's data and functionality. Access to the API is determined by your organization's subscription plan.
* **Detect the move — Monitors**: Get pinged the day a company makes its next move — a new market, hire, office, entity, ad, or funding round — from signal to your app by webhook, with the underlying record already enriched.
* **Read where it's going — Search & Lookup**: Pull a company's live expansion dossier — the markets it's entering, its momentum, and every dated signal that proves it — or query across sixteen signal types by company, person, job, news, technology, or LinkedIn URL.
* **Enrich the record — Enrichment**: Complete firmographic and contact data for companies and people, one record at a time or in bulk.
* **Build integrations**: Access every endpoint on behalf of your users through a simple header-authentication flow — data retrieval, redemption, and channel management included.
### Getting Started with the Pubrio API
To begin using the Pubrio API, follow these steps:
1. **Create an Account**: Sign up at [Pubrio.com](https://dashboard.pubrio.com) to obtain your API key.
2. **API Key Configuration**: Ensure your API key is properly configured for authentication in all requests.
3. **Explore Endpoints**: Familiarize yourself with available endpoints by reviewing our [API Reference](/en/api-reference/introduction) documentation.
## Knowledge Base
The Knowledge Base is your comprehensive resource hub designed to help you master Pubrio’s platform and capabilities. It features a wide range of content tailored for users at all levels—from beginners just getting started to advanced users looking to optimize their workflows.
* **Step-by-Step Tutorials**: Detailed guides walk you through common tasks such as setting up your first credential, subscribing to expansion signals, and enriching company and people data.
* **Best Practices**: Learn proven strategies for catching expansion signals early, enriching data, and timing outreach to reach accounts the moment they move.
* **Troubleshooting and FAQs**: Quickly find answers to common questions and solutions to potential issues you might encounter.
* **Use Case Examples**: Explore real-world scenarios demonstrating how GTM teams leverage Pubrio to reach companies as they enter new markets.
* **Product Updates**: Stay informed about the latest features, enhancements, and platform improvements to keep your processes up to date.
Whether you want to deepen your technical knowledge or discover new ways to leverage Pubrio’s capabilities, the Knowledge Base is your go-to destination for actionable insights and expert guidance.
## Ready to Explore
Pubrio resources empower you with comprehensive guidance on available endpoints, illustrative sample requests and responses, practical use cases, and much more!
Explore detailed API endpoints and integration guides.
Access tutorials, tips, and best practices for expansion signals and GTM workflows.
# API Pricing
Source: https://docs.pubrio.com/en/get-started/pricing
Various plans and pricing options available.
## API Access Levels
All Pubrio customers enjoy at least basic access to Pubrio's public APIs. For organizations seeking more advanced API capabilities, access levels are determined by the specific [pricing plan](https://www.pubrio.com/en/pricing) currently in use.
## How Credits Work
Every API call draws **credits** from your workspace's monthly balance. The **cost per call is the same on every plan** — plans differ only in how many credits they include each month. For the latest plan pricing and top-up rates, the [pricing plans](https://www.pubrio.com/en/pricing) page is the single source of truth.
### Monthly credits by plan
| Plan | Included credits / month |
| -------------------------------- | ------------------------ |
| Free | 100 |
| Growth | 900 |
| Business | 4,200 |
| Startup / Corporate / Enterprise | 6,000+ |
## Credit Cost per Call
### Lookups — single record
| Endpoint | Credits |
| ---------------------------------- | ------- |
| Company Lookup | 1 |
| People Lookup | 1 |
| People Contact Lookup | 1 |
| Company Job Lookup | 1 |
| Company News Lookup | 1 |
| Company Technology Lookup | 1 |
| LinkedIn Company Lookup (Realtime) | 1 |
| LinkedIn People Lookup (Realtime) | 1 |
| Data Export (per record) | 1 |
### Searches & Enrichment
| Endpoint | Credits |
| -------------------------- | ------- |
| Company Search | 1 |
| People Search | 3 |
| Company Job Search | 3 |
| Company News Search | 3 |
| Lookalike Companies Search | 3 |
| Company Enrichment | 3 |
### Market Expansion
| Endpoint | Credits |
| --------------------------------- | ------- |
| Expansion Search | 5 |
| Expansion Overview | 5 |
| Expansion Rankings | 5 |
| Company Expansion Detail | 5 |
| Company Signal Events | 5 |
| Compare Company Expansions | 5 |
| Batch Company Expansion Summaries | 5 |
| Expansion Signal Search | 5 |
### Insights — company signal aggregates
| Endpoint | Credits |
| ------------------------------ | ------- |
| Company Job Insights | 3 |
| Company News Insights | 3 |
| Company Advertisement Insights | 3 |
### Redemption & Monitoring
| Endpoint | Credits |
| ------------------- | ------- |
| Redeem Email | 5 |
| Redeem Phone Number | 10 |
| Monitor Trigger | 10 |
To track your organization's credit usage, see the Current Usage section of Settings.
# Engage & Close
Source: https://docs.pubrio.com/en/get-started/use-cases/engage-close
Everything you need to build and close pipeline.
# From Data to Deal
Building pipeline isn't just about finding the right lead; it's about executing the right workflow.
Pubrio’s **Engage & Close** module is a built-in Sequence Engine that sits directly on top of your Data Layer. Because the data and the sending infrastructure are unified, you can move from "Enrichment" to "Execution" in a single click, ensuring your outreach is always powered by the most up-to-date prospect information. And because timing is the whole game, you can launch the moment an account makes its move — a new market, a new hire — while the window is still open.
## The "Data-First" Workflow
Most sales teams lose time exporting CSVs from a database and importing them into a separate sending tool. Pubrio eliminates the friction.
**No More CSV Hell.**
Push contacts directly from "Find Leads" or "Enrich CRM" into a Sequence. All the rich data travels with them automatically.
**Flexible Personalization.**
If you have the data, you can use it. Upload any column (e.g., `Event_City`, `Previous_Job`) and map it to a **Custom Variable** in your template.
* *Usage:* "I saw you were at `{{Event_Name}}` in `{{Event_City}}` last week."
***
## Capabilities
### 1. Multi-Channel Sequences
Orchestrate a complete outreach strategy across multiple touchpoints.
* **Email:** Send automated, personalized emails.
* **LinkedIn:** Automate connection requests and messages (via supported integrations).
* **Manual Tasks:** Create "Call Tasks" for your SDRs when a high-value prospect opens an email 3 times.
### 2. The Sequence Builder
Design linear or branching workflows to nurture your prospects.
* **Steps & Delays:** "Send Email 1 -> Wait 2 Days -> Send Email 2."
* **A/B Testing:** Test different subject lines or value propositions to see what resonates with specific global markets.
* **Templates:** Save your best-performing messages to the **Templates** library and share them across your team.
### 3. Deliverability Infrastructure
We handle the technical heavy lifting to ensure your emails land in the Primary Inbox, not Spam.
* **Inbox Rotation:** Connect multiple sending accounts (e.g., `alex@`, `alex.s@`) and rotate traffic between them to keep volume safe.
* **Bounce Protection:** We verify email validity *before* sending. If a contact's data has decayed since you added them, we skip the email to protect your domain reputation.
***
## Flexible Design Editors
Choose the right canvas for your message. Whether you need a simple text email or a brand-heavy HTML newsletter, we support your workflow.
**Best for: Sales Emails & Quick Nurture.**
Use our built-in Notion-style editor to draft clean, high-converting emails.
* **Features:**
* Drag-and-drop images and text blocks.
* Insert **Custom Variables** via a simple dropdown menu.
* "Check for Spam Words" built-in analysis.
**Best for: Newsletters & Marketing Campaigns.**
Need pixel-perfect HTML? Design in **Stripo** and sync it to Pubrio.
* **Workflow:**
1. Design a responsive template in Stripo.
2. Click "Export to Pubrio."
3. The design appears instantly in your **Templates** folder, ready to use in any Sequence.
***
## Use Cases
### The "Event Follow-Up"
**Goal:** Engage attendees after a conference.
1. **Import:** Upload a CSV of attendees with a custom column: `Booth_Topic`.
2. **Sequence:** Enroll them in a "Post-Event Nurture."
3. **Content:** *"Great meeting you! You mentioned being interested in `{{Booth_Topic}}`. Here is a case study regarding that..."*
### The "Expansion Trigger"
**Goal:** Reach an account the moment it enters a new market.
1. **Enrich:** Filter your CRM for accounts with a fresh **market-move signal** — a new office, a new entity, or a localized hiring push.
2. **Sequence:** Auto-enroll them in a "New-Market Welcome" flow the day the signal fires.
3. **Content:** Use a Stripo-designed template that references their specific move and your local case studies.
***
## Ready to Close?
**Go to Platform.**
Build your first multi-channel workflow.
**Need Calendar Sync?**
We are actively building calendar booking and other CRM features. Let us know what you need next.
# Enrich CRM
Source: https://docs.pubrio.com/en/get-started/use-cases/enrich-crm
A hybrid engine: Combine global database coverage with real-time agentic research.
# Agentic CRM Enrichment
Standard enrichment fills in basic fields like "Industry" or "Employee Count" — a record of who a company *is*. But a record says who; a signal says **when.** Complex sales need to know which accounts are *moving* — entering a new market, standing up a new team — and reach them while the window is open.
Pubrio turns CRM enrichment into a **Two-Stage Intelligence Pipeline**. We combine our massive **Glocal Database** — expansion signals, tech stack, ads, hiring — with **Real-Time AI Agents** that visit a company's website or Google Maps listing to answer specific, qualitative questions on demand. The result isn't a fuller row; it's a read on where each account is going, and how soon.
## The Two-Stage Funnel
Don't just enrich data; *interrogate* it.
First, we match your CRM records against our core database to append structured, dated signals.
* **Expansion Signals:** "Are they entering a new market — a new office, a new legal entity, a localized hiring push?"
* **Ad Intelligence:** "Is this domain running active Meta/Google ads?"
* **Tech Stack:** "Do they use *Shopify Plus* or *Magento*?"
* **Hiring Signals:** "Are they hiring for 'Data Science' roles?"
* **Specialties:** "Do they self-identify as 'B2B' or 'DTC'?"
For high-value accounts, trigger a **Custom Agent Question**. The AI visits the company's live URLs to answer specific questions that aren't in any structured database.
* *Example Question:* "Look at their pricing page. Do they offer an Enterprise plan with SSO?"
* *Example Question:* "Check their 'About Us'. Do they mention sustainability goals?"
***
## Real-World "Hybrid" Examples
Here is how customers use the Database + Agent combo to qualify leads automatically.
### 1. The "Wholesale" Qualifier
**Goal:** Find e-commerce brands that also sell wholesale.
1. **Database Filter:** Find companies using **Shopify** + Running **active ads** in the US/UK.
2. **Agentic Ask:** "Visit the footer links. Is there a link labeled 'Wholesale' or 'Distributors'? Return `True/False`."
### 2. The "Remote-First" Check
**Goal:** Sell remote HR software to growing teams.
1. **Database Filter:** Find companies hiring for **>5 Engineering roles** in Germany.
2. **Agentic Ask:** "Read the job descriptions. Do they explicitly mention 'Remote-first' or 'Home office budget'? Extract the specific perk text."
***
## Google Maps Enrichment (Offline Data)
For industries like Retail, Hospitality, and Logistics, a website doesn't tell the whole story. Pubrio connects directly to live **Google Maps Data** to enrich your "Offline" reality.
**Analyze Customer Feedback.**
Don't just get the address. Get the *vibe*.
* *Agent Task:* "Analyze the last 50 reviews. Are customers complaining about 'Long wait times' or 'Broken AC'?" (Perfect for selling Operations software).
**Confirm Existence.**
Verify if a business is actually open.
* *Data Points:* Exact Lat/Long coordinates, current "Open/Closed" status, and "Busy Times" data to identify peak operating hours.
> **Use Case:** A POS provider targets coffee shops in Jakarta. They use Pubrio to filter for places with **>100 Reviews** (High Volume) but **No Website** (Offline-heavy), then send an agent to check user photos for existing competitor hardware.
***
## Integration Workflow
Link Salesforce or HubSpot via OAuth. Map your standard fields.
In the Pubrio dashboard, write the natural language prompts you want our agents to answer for every new lead (e.g., "What is their primary pricing model?").
Map the Agent's answer to a custom field in your CRM (e.g., `Salesforce Field: Pricing_Model__c`).
As new leads enter your CRM, Pubrio automatically:
1. Appends Database Signals (Tech/Ads).
2. Runs the Agentic Research.
3. Pushes the final, enriched profile back to the record.
***
## Ready to build your pipeline?
**Go to Platform.**
Connect your Salesforce or HubSpot account and start your first agentic enrichment run.
**Don't see your CRM?**
We are constantly adding new connectors. Submit a request for Pipedrive, Zoho, or your custom stack.
# Find Leads
Source: https://docs.pubrio.com/en/get-started/use-cases/find-leads
Discover the invisible 70% of the market with the world’s first glocalized search engine.
# Glocalized Discovery
Standard B2B databases are blind to the majority of the global economy. They see the "Visible 30%" — the venture-backed startups and Western-centric corporations that everyone else is already prospecting.
Pubrio is different. We built the **Glocalized Data Layer** to unlock the **Invisible 70%**. By connecting 50+ localized government registries, regional trade associations, and non-English intent signals, we help you find the high-growth "Local Champions" that simply don't exist in other datasets — and tell you which of them are *moving right now*: entering a new market, standing up a new team, spending on growth.
## The Glocalized Advantage
Why settle for "Global" numbers with "Local" blind spots?
**Escape the Red Ocean.**
While your competitors fight over the same 500 companies in San Francisco and London, Pubrio hands you the keys to the market leaders in Jakarta, São Paulo, and Munich that have zero presence on LinkedIn.
**Verified, Not Scraped.**
We prioritize "Ground Truth" sources — tax filings, business registries, and government gazettes — over social media scraping. This means accurate headcount and revenue data, even for private "offline" businesses.
***
## Precision Search Tools
Our search engine is designed to navigate the complexity of a glocalized economy.
### 1. Cross-Border Identity Resolution
Searching for global companies is messy. Is it "Samsung Electronics," "Samsung GmbH," or "三星电子"?
* **The Pubrio Engine:** We automatically map these variations to a single, unique **Global Entity ID**. You search in English (or your native language), and we find the company regardless of how they are listed locally.
### 2. Deep Signal Filtering
Filter your list by reality, not just industry codes.
* **Market Moves:** "Show me companies that opened a new office or legal entity in Southeast Asia in the last 90 days." (Powered by our **Expansion Signals** — typed and dated.)
* **Paid Media Footprint:** "Show me e-commerce companies in Thailand running **active ad campaigns**." (Powered by our **Ads Search Intelligence**, indexing paid search and display networks).
* **Local Tech Stack:** "Find manufacturing firms in Mexico using **Oracle NetSuite**."
* **Hiring Velocity:** "Companies in the DACH region hiring for 'Sales' roles in the last 30 days."
### 3. "Lookalike" Expansion
Take your best US customer and find their "Glocal Twins."
> **Example:** "I sell to mid-sized logistics firms in Ohio. Find me companies with the same tech stack, revenue model, and growth trajectory in **Vietnam** and **Indonesia**."
***
## Built for the "Real World" Economy
Pubrio shines where traditional SaaS databases fail.
| Sector | Standard Database View | The Pubrio View |
| :------------------- | :---------------------------------------------- | :----------------------------------------------------------------------- |
| **Manufacturing** | Lists only the HQ office. Misses the factories. | Maps the factories, supply chain partners, and regional distributors. |
| **Retail & Trade** | "Industry: Retail." No further detail. | Identifies import/export volume, POS technology, and physical footprint. |
| **Emerging Markets** | \< 10% coverage. Mostly stale data. | **90%+ coverage.** Real-time access to local business registries. |
***
## How to Prospect
Choose a region. Don't be afraid to go wide — our localized graph handles the nuance of different countries automatically.
Apply filters that signal buying power:
* **Verified Local Headcount:** (Often different from LinkedIn headcount).
* **Ads Search:** Are they spending money on customer acquisition?
Reveal direct contact info. We prioritize **locally compliant** contact data, distinguishing between generic `info@` emails and direct mobile numbers for decision-makers.
Send your "Blue Ocean" list directly to your CRM or Sequence tool to start the conversation.
***
## Ready to see what you're missing?
**Log in.**
Build your first list of "Invisible" leads.
**Test Us.**
Send us your ICP, and we'll show you the companies your current provider is missing.
# Founders
Source: https://docs.pubrio.com/en/get-started/user-guides/founders
Grow, hire, and analyze with one tool.
# The Founder's OS
As a founder, you don't have a "Sales Department." You *are* the Sales Department. You are also the Head of Talent, the Market Researcher, and the Chief Strategy Officer.
The old way to handle this was burning cash on three different expensive platforms: one for leads, one for recruiting, and one for market data.
Pubrio changes the math. We give you a single **Glocal Data Layer** that powers every external function of your startup. Whether you are finding your first 100 customers, headhunting a founding engineer, or sizing your TAM for a pitch deck, you do it all here. And because Pubrio is built on timing, you see which companies are *moving* — expanding into a new market, hiring, raising — so you reach them while it matters.
## 1. GROW: Founder-Led Sales
Getting to \$1M ARR is about "doing things that don't scale" — but doing them faster.
* **The Problem:** You need high-fidelity beta testers, not random spam targets.
* **The Pubrio Fix:** Use the **Tech Stack** filter to find your perfect early adopters.
* *Scenario:* You built a Shopify plugin.
* *Action:* Search for "E-commerce brands using **Shopify Plus**" + "Revenue $1M-$10M" (Big enough to pay, small enough to talk to a founder).
* *Result:* A list of 500 perfect prospects. Export them and email them yourself. "I saw you use Shopify Plus and built this for you..."
* *Even better:* Layer an **Expansion Signal** — the brands that *just* entered a new market or opened a new store. They have fresh budget and urgency, and you're the first to reach them.
## 2. HIRE: Zero-Cost Headhunting
Recruiters charge 20% of the first year's salary. In the early days, that's 2 months of runway. Pubrio allows you to source talent like a pro without the fees.
* **The Problem:** You need a "Head of Sales" who understands your specific industry (e.g., Logistics).
* **The Pubrio Fix:** Don't search for "Job Seekers." Search for **"Sales Directors"** currently working at **"Logistics Companies"** in your region.
* **The Play:** Reach out directly. "I'm the founder of \[Startup]. I see what you're doing at \[Current Co] and we are building the next generation of that..."
* *Why it works:* Passive candidates are often the best hires, and they reply to Founders.
## 3. ANALYZE: Due Diligence & TAM
Investors don't believe your "Top Down" market sizing ("If we get 1% of a \$1T market..."). They want "Bottom Up" proof.
* **The Problem:** proving your Total Addressable Market (TAM) is real.
* **The Pubrio Fix:** Build the list.
* *Action:* Run a search for your *exact* criteria (e.g., "Manufacturing companies in DACH >50 employees").
* *The Result:* "We aren't guessing. We have identified exactly **14,203** targets in our beachhead market."
* *Bonus:* Take a screenshot of the Pubrio map view for your Pitch Deck. It proves market density instantly.
***
## The "Burn Rate" Play
Consolidate your stack. In 2026, you shouldn't be paying for separate data silos.
| Function | Old Stack Cost | Pubrio Way |
| :-------------- | :--------------------------- | :---------------------------------------- |
| **Sales Data** | \$15k/yr (Enterprise DB) | **Included.** |
| **Recruiting** | \$10k/yr (Recruiter License) | **Included.** (Source via Contact Search) |
| **Email Tools** | \$5k/yr (Sending Platforms) | **Included.** (Engage & Close) |
| **Total** | **\~\$30k/yr** | **One Subscription.** |
***
## Founder Workflows
### The "Competitor Poach"
**Goal:** Hire an engineer who knows your tech stack perfectly.
1. **Search:** Find companies using **\[Your Tech Stack]** (e.g., React Native).
2. **Filter:** Filter for "Engineering" roles within those companies.
3. **Outreach:** "Hey, I see you're building with React Native at \[Company]. I'm looking for a Founding Engineer to lead our mobile team..."
### The "Investor Update"
**Goal:** Show traction in a specific vertical.
1. **Analyze:** Use Pubrio to track your penetration in a specific sector.
2. **Update:** "We have now engaged 15% of the total 'Mid-Market Retail' segment in Southeast Asia." (Backed by Pubrio's total count).
***
## Keep it Lean
**Start Selling.**
Build your first list of 100 perfect prospects.
**Steal Our Playbook.**
See exactly how we use Pubrio to run founder-led sales.
# Marketing
Source: https://docs.pubrio.com/en/get-started/user-guides/marketing
Grow your funnel with automation and maximize MQLs.
# The Demand Engine
In 2026, the era of "Growth at all costs" is over. Marketers are now measured on **Efficiency**: Lower CAC (Customer Acquisition Cost) and higher LTV (Lifetime Value).
The biggest drain on marketing budget is **Bad Targeting**. You are paying to show ads to companies that can't buy, or you are losing leads because your sign-up forms are too long.
Pubrio serves as your **Glocal Audience Engine**. We help you build hyper-segmented audiences based on real-world signals — including which companies are *entering a new market right now* — not just "Interests," shorten your forms without losing data, and score leads so Sales only talks to the winners.
## The High-Efficiency Funnel
Here is how modern growth teams use Pubrio to optimize every stage of the funnel.
**The Problem:** LinkedIn Ads are expensive (\$15+ CPC) and often miss "Offline" decision-makers.
**The Pubrio Play:** Build your audience *off-platform*.
* **Search:** Filter for "Manufacturing companies in DACH >\$50M Revenue" (or any precise ICP).
* **Timing:** Layer **Expansion Signals** — narrow to the accounts that *just* entered your market, when intent is highest.
* **Export:** Download the verified emails and mobile numbers.
* **Match:** Upload this list as a **Custom Audience** to Meta, Google, or LinkedIn.
* **Result:** You target exact decision-makers at a fraction of the cost, reaching people who don't spend all day on LinkedIn.
**The Problem:** Every extra field on your demo form drops conversion by \~10%.
**The Pubrio Play:** The "One-Field" Form.
* **Action:** Ask only for **Work Email**.
* **Enrich:** As soon as the lead hits your CRM/Marketing Automation, Pubrio’s API instantly appends **Company Size**, **Industry**, **Tech Stack**, and **Location**.
* **Result:** 2x more leads, 100% data completeness.
**The Problem:** Sending "junk" MQLs to Sales destroys trust.
**The Pubrio Play:** Score based on *reality*, not just job title.
* **Logic:** "If Title = 'Manager' AND Tech\_Stack contains 'Competitor X' -> Score +50."
* **Result:** Sales only gets alerts for leads that are technically qualified to buy.
***
## Marketing Workflows
### The "Competitor Conquest" Campaign
**Goal:** Steal market share from a rival.
1. **Audience:** Search Pubrio for companies using **\[Competitor Name]**.
2. **Ads:** Upload the list to LinkedIn/Facebook. Show them ads saying: *"Tired of \[Competitor's] price hikes?"*
3. **Nurture:** If they click but don't buy, enroll them in a Pubrio Sequence sending a "Migration Guide" (Designed in Stripo).
### The "Regional Expansion" Launch
**Goal:** Launch your product in a new region (e.g., Southeast Asia).
1. **Research:** Use Pubrio to identify the top 500 potential accounts in the region to seed your launch.
2. **ABM:** Run a "1-to-Many" campaign.
* *Email:* Send a localised announcement via Pubrio sequences.
* *Ads:* Geo-fence your ads to the cities where these 500 accounts are located.
***
## Design-Driven Growth
Marketing emails shouldn't look like Sales emails. Use our **Stripo Integration** to maintain brand consistency.
**Design Systems.**
Build your master templates in Stripo (Header, Footer, Brand Colors) and sync them to Pubrio. Ensure every automated email from your growth team looks on-brand.
**Personalization at Scale.**
Design *one* newsletter, but use Pubrio variables to change the content blocks based on the recipient's industry. (e.g., Retailers see a Retail Case Study; Manufacturers see a Supply Chain Case Study).
***
## Ready to optimize?
**Find MQLs.**
Generate your first custom audience list.
**Enrich Inbound.**
Use our API to enrich leads from your forms or app in real-time.
# Sales & Business Development
Source: https://docs.pubrio.com/en/get-started/user-guides/sales-development
Generate more opportunities with the least work possible.
# The 2026 Sales Playbook
Let's be honest: Sales is harder than it used to be.
The "Golden Era" of buying a list of 10,000 emails, blasting a generic template, and booking 50 meetings is dead. Today, buyers are overwhelmed, spam filters are ruthless, and the "easy" data (Silicon Valley startups) is so saturated that prospects ignore you by default.
If you feel like you are working harder just to stand still — sending more emails for fewer replies — you aren't alone. The problem isn't your effort; it's your **workflow**. You are spending 80% of your day doing "robot work" (copy-pasting data, verifying emails, guessing context) instead of selling.
Pubrio exists to automate that 80%. And when everyone can reach everyone, the only edge left is **timing** — knowing which accounts are moving, and being early. This guide shows you how to stop "spraying and praying" and start targeting the **Invisible Market** the moment it moves.
## The 3-Step Daily Routine
Stop jumping between 5 tabs. Here is how to run a high-performance prospecting motion without the burnout.
**The Pain:** Everyone is prospecting the same 500 tech companies in San Francisco.
**The Fix:** Use Pubrio to find "Blue Ocean" accounts — massive traditional businesses in logistics, manufacturing, or retail that have huge budgets but quiet inboxes.
* **Action:** Search for **"Manufacturing in Mexico"** or **"Retail in Vietnam"** with **>50 Employees**. These are the "Invisible Champions" your competitors miss.
**The Pain:** You waste hours opening 50 tabs just to check if a company is "active" or has a specific team.
**The Fix:** Let the Agents do the grunt work.
* **Action:** Select your new leads and click **"Enrich"**.
* **Agentic Ask:** Use a custom question like *"Is this company hiring for Sales roles right now?"* The agent returns a simple `Yes/No` for every account while you focus on high-value tasks.
**The Pain:** "Hi `{{First_Name}}`, I saw you work at `{{Company}}`..." (Prospects hate this).
**The Fix:** Use deep context to prove you did your homework.
* **Action:** Push your researched leads directly into a Sequence.
* **Result:** Your email reads: *"I noticed you're growing your engineering team in Berlin..."* (using the data found in Step 2) instead of a generic pitch.
***
## High-Converting "Plays"
Here are two strategies power users run to cut through the noise.
### Play #1: The "Expansion Move"
**Target:** Companies entering a new market *right now* — the strongest timing signal there is.
1. **Find:** Filter for companies with a fresh **market move** — a new office or legal entity abroad, or a **localized hiring push** (e.g. their first sales hire in a new country).
2. **Sequence:** Enroll them in a "Timing-Based" workflow the day the signal fires.
3. **Personalize:** Reference the specific move in your opener.
* *Subject:* "Your move into \[Market]."
* *Body:* "I saw you just opened your first office in \[Market] and started hiring locally. Teams usually hit \[Problem] right at this stage..."
### Play #2: The "Competitor Swap"
**Target:** Companies using a legacy competitor that is raising prices.
1. **Find:** Search Pubrio for companies using a specific technology (e.g., "Users of \[Competitor X]").
2. **Sequence:** Push them directly into your "Competitor Displacement" flow.
3. **Personalize:** The email automatically references the tech we found.
* *Subject:* "Question about your \[Competitor X] setup."
* *Body:* "I'm reaching out because I saw you are currently using \[Competitor X]..."
***
## Pro Tips for Efficiency
**Don't Get Blocked.**
If you send 500 emails a day from one address, Google will block you. Connect 3-5 aliases (e.g., `alex.b@`, `alex.sales@`) to Pubrio. We automatically rotate the sending volume to keep your domain safe.
**The Secret Weapon.**
You aren't limited to "Name" and "Company." Because Pubrio feeds the Sequence engine directly, you can reference *any* data point — from their city to the event they just attended — making every email feel handwritten.
***
## Ready to stop grinding?
**Find Leads.**
Launch your first Glocal search.
**Learn More.**
Read our deep-dive guides on building Agentic workflows.
# Choosing an Expansion Endpoint
Source: https://docs.pubrio.com/en/developer-guides/expansion/choosing-an-endpoint
A task-to-endpoint guide for the Expansion API — which endpoint to call for discovery, company detail, the signal feed, comparison, maps, and reference values.
The Expansion API is a small set of endpoints, each answering a different question about how companies grow into new markets. This guide maps **what you want to do** to **which endpoint to call**, so you never have to guess.
New to the concepts (stages, signals, momentum, freshness)? Start with [What Are Expansion Signals?](/en/knowledge-base/concepts/expansion-signals) — this guide assumes you know them and focuses on endpoint selection.
## Pick by task
| You want to… | Call |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| **Find companies** expanding into a market (by filters or a natural-language query) | [Expansion Search](/en/api-reference/endpoint/expansions/market_lookup) |
| See **market-level KPIs and flows** (counts per stage, top corridors) | [Expansion Overview](/en/api-reference/endpoint/expansions/dashboard) |
| Get **one company's status in a market** — stage, presence, history, and the signals behind it | [Company Expansion Detail](/en/api-reference/endpoint/expansions/company_lookup) |
| Get the **enriched, time-windowed feed** of a company's signal events | [Company Signal Events](/en/api-reference/endpoint/expansions/company_pulse_events) |
| **Compare** several companies' expansion side by side, seeded from a target company | [Compare Company Expansions](/en/api-reference/endpoint/expansions/company_compare) |
| Get **ready-to-render comparison metrics** (markets, momentum, expansion score) for a company set you already have — by domain, LinkedIn URL, or id | [Batch Company Expansion Summaries](/en/api-reference/endpoint/expansions/company_summaries) |
| Plot **ranked company/market points** on a map or heatmap | [Expansion Rankings](/en/api-reference/endpoint/expansions/company_markers) |
| Read the **raw signal rows** behind a stage — audit the evidence, or build your own scoring | [Expansion Signal Search](/en/api-reference/endpoint/expansions/signal_search) |
| Resolve **filter and enum values** (stages, signal types, freshness…) | [Expansion Reference](/en/api-reference/endpoint/expansions/types) |
## The endpoints at a glance
The discovery endpoint. Filter companies by expansion stage, freshness, market, and the full company firmographic suite — or pass a natural-language `query`. Paginated company list.
Market-level aggregates: per-stage counts, top cross-border flows, watched-company activity. No pagination — a dashboard snapshot.
One company in one market: current stage, score, presence, transition history, and the supporting signals. The per-market snapshot.
The enriched, paginated feed of a company's signal events across signal types and a date window. The activity drill-down.
Several companies side by side in one call, with weekly signal series and optional peer seeding. Built for comparison grids.
Any mix of domain\_search\_id, domain, or LinkedIn URL, resolved and returned with the same data as Compare plus a computed summary block — no target company, no peer seeding.
A lightweight, score-ranked list of company/market pairs — minimal fields, no pagination — for fast map and heatmap rendering.
Query the signal rows themselves — type, subtype, strength, polarity, dated event, source and evidence URL — across companies and markets. Paginated, filterable, no company roll-up.
## "Detail" vs "Signal Events" — which one?
This is the most common point of confusion, because **both involve signals**. The difference is *snapshot vs feed*:
| | Company Expansion Detail | Company Signal Events |
| ------------ | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **Scope** | one company × **one market** | one company, across **all its foreign markets** |
| **Markets** | a **single market** via `country_code`, or the whole company at once via `is_all_markets` | **all foreign markets** by default (home market excluded); narrow to specific ones with `country_codes` (array) |
| **Returns** | stage, score, presence, history **+ supporting signals** | **enriched signal events** (evidence URLs, hiring rosters, labels) |
| **Time** | current standing | a **date window** you choose (`window_days` — defaults to 90 — or `transitioned_dates`) |
| **Shape** | a structured snapshot object | a paginated event feed ("load more") |
| **Use when** | "What's this company's status in **one** market, and why?" | "Show me the full stream across **every** market driving this company's expansion" |
**Most integrations only need Company Expansion Detail** — it already returns the signals behind a company's stage in a market. Reach for **Company Signal Events** when you specifically want the rich, filterable, time-windowed event stream (e.g. building an activity timeline UI).
## "Compare" vs "Summaries" — which one?
Both return the same per-company expansion data side by side. The difference is *identifiers and framing*:
| | Compare Company Expansions | Batch Company Expansion Summaries |
| ------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
| **Input** | any mix of `domain_search_id`, `domain`, or `linkedin_url` | any mix of `domain_search_id`, `domain`, or `linkedin_url` |
| **Peer seeding** | optional, via `seed_target` | none — every company is independent |
| **Computed rollup** | none (compute markets/momentum/score yourself) | `summary` block included per company (active/new markets, momentum, expansion score, stage mix) |
| **Use when** | you already have resolved ids and want to seed comparable peers for one target | you're given companies by domain or LinkedIn URL and want ready-to-render comparison metrics in one call |
**Building a competitor-benchmarking grid around a target company?** Use **Compare** with `seed_target` to auto-select peers. **Already have a company set** (a watchlist, a CRM import, a list of domains) **and just want the numbers?** Use **Batch Company Expansion Summaries** — it saves you re-implementing the momentum/score math client-side.
## A typical workflow
Call **Expansion Search** with your filters (or a natural-language `query`) to get the companies expanding into your target market. Set `is_explain_match: true` for AI "why it matches" summaries.
Take a `domain_search_id` from the results and call **Company Expansion Detail** for the full read in a market — stage, presence, history, and signals.
For the rich, windowed event stream, call **Company Signal Events** with the signal types and date range you care about.
Use **Compare Company Expansions** for a side-by-side grid seeded from a target company, **Batch Company Expansion Summaries** when you already have a company set and want ready-made metrics, or **Expansion Rankings** to plot ranked points on a map.
## Shared filters
The discovery endpoints (**Expansion Search**, **Expansion Overview**, **Expansion Rankings**) accept the same filter vocabulary — expansion filters (stage, momentum, freshness, scope, signal types), the directed-geography pair (`froms` / `tos`), **and** the full company firmographic suite (industry, technologies, employee size, revenue, saved lists). Learn the filters once in the [Filters Overview](/en/developer-guides/filters/overview); the valid values live in [Expansion Reference](/en/api-reference/endpoint/expansions/types) and the [How Expansion Signals Work](/en/knowledge-base/concepts/how-expansion-signals-work) catalog.
Auth, your first calls, pagination, and reading scores.
A full market-to-signal walkthrough.
# AND / OR Operators
Source: https://docs.pubrio.com/en/developer-guides/filters/filter-conditions
Override the default AND/OR operator for any multi-value filter — full reference with copyable examples.
`filter_conditions` is a single optional array on the request body. Each entry promotes one multi-value filter from the default OR ("match any") behaviour to AND ("match all"), or vice versa. Filters you don't list keep their defaults.
## Schema
```json JSON theme={null}
{
"filter_conditions": [
{ "key": "technologies", "operator": "and" },
{ "key": "verticals", "operator": "or" }
]
}
```
```typescript TypeScript theme={null}
type FilterCondition = {
/** Filter name to override. See "Supported keys" below. */
key: string;
/** Case-insensitive: "and" | "or". Default is "or" for arrays. */
operator: "and" | "or";
};
type SearchRequest = {
// …all your other filters…
filter_conditions?: FilterCondition[];
};
```
`key` and `operator` are both required on every entry. An entry with only `operator` is silently ignored — there is no global override.
***
## Why it matters
The default operator is OR because most prospecting workflows want broad reach: "people in *any* of these countries", "companies tagged with *any* of these verticals". For high-precision targeting — "uses *all* of `Salesforce` + `HubSpot` + `Marketo`" — you need AND.
The cost of being wrong:
* **Wanted AND, got OR:** the response over-recalls — you see companies that match only one tag, not the full stack. Easy to spot, costs result-quality.
* **Wanted OR, got AND:** the response under-recalls — usually returns near-zero rows on multi-value AND filters because real-world arrays rarely contain every requested value. Easy to spot, looks like a broken query.
Under the hood, the engine compiles your operator choice to a native Postgres array operator: `&&` (overlap) for OR, `@>` (contains) for AND. Both are index-friendly, so the cost difference is in *result size*, not query latency.
***
## Supported keys
The exact key set depends on the endpoint you're calling:
| Key | `/companies/search` | `/people/search` | `/companies/advertisements/search` | Default | What `and` means |
| ---------------------------------------- | ------------------- | ---------------- | ---------------------------------- | ------- | ------------------------------------------- |
| `technologies` | yes | yes | — | OR | Has every tech in the list |
| `categories` | yes | yes | — | OR | Tagged with every category |
| `verticals` | yes | yes | — | OR | Belongs to every vertical |
| `vertical_categories` | yes | yes | — | OR | In every vertical category |
| `vertical_sub_categories` | yes | yes | — | OR | In every vertical sub-category |
| `keywords` | yes | yes | — | OR | Description contains every keyword |
| `places` | yes | yes | — | OR | Listed in every place |
| `exclude_places` | yes | yes | — | OR | Excluded from every place |
| `advertisement_target_locations` | yes | — | — | OR | Ad targets every country (company endpoint) |
| `advertisement_exclude_target_locations` | yes | — | — | OR | Ad excludes every country |
| `advertisement_search_terms` | yes | — | — | OR | Ad copy contains every term |
| `job_exclude_locations` | yes | — | — | OR | Job posting excludes every location |
| `social_media` | — | yes | — | OR | Person has all listed social-media accounts |
| `target_locations` | — | — | yes | OR | Ad targets every country (ads endpoint) |
| `exclude_target_locations` | — | — | yes | OR | Ad excludes every country |
The keys above mirror the `enum` arrays in the OpenAPI spec (`company_filter_conditions`, `people_filter_conditions`, `ads_filter_conditions`). Sending an unsupported key for an endpoint is silently ignored.
***
## Recipes
**Goal:** companies that use *all of* Python, PostgreSQL, and Kubernetes — not just one.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"technologies": [37, 152, 408],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
],
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/companies/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"technologies": [37, 152, 408],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
],
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/companies/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
technologies: [37, 152, 408],
filter_conditions: [
{ key: "technologies", operator: "and" }
],
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
Drop the `filter_conditions` entry to widen the search to *any* of the three.
**Goal:** companies in *any of* the US, Canada, or UK, but never in San Francisco.
OR is already the default for `locations`, so we leave it implicit. `exclude_places` handles the negative filter independently — no override needed.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"locations": ["US", "CA", "GB"],
"exclude_places": ["San Francisco"],
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/companies/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"locations": ["US", "CA", "GB"],
"exclude_places": ["San Francisco"],
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/companies/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
locations: ["US", "CA", "GB"],
exclude_places: ["San Francisco"],
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
**Goal:** advertisements actively targeting *both* the EU and the US (multi-region campaigns) — not single-market ads. Uses the dedicated `ads_filter_conditions` schema with the `target_locations` key.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/advertisements/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"target_locations": ["US", "DE", "FR"],
"filter_conditions": [
{ "key": "target_locations", "operator": "and" }
],
"start_dates": ["2026-01-01"],
"end_dates": ["2026-04-22"],
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/companies/advertisements/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"target_locations": ["US", "DE", "FR"],
"filter_conditions": [
{ "key": "target_locations", "operator": "and" }
],
"start_dates": ["2026-01-01"],
"end_dates": ["2026-04-22"],
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/companies/advertisements/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
target_locations: ["US", "DE", "FR"],
filter_conditions: [
{ key: "target_locations", operator: "and" }
],
start_dates: ["2026-01-01"],
end_dates: ["2026-04-22"],
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
The ads endpoint uses its own `ads_filter_conditions` schema (smaller key set: `target_locations`, `exclude_target_locations`). The keys you can override on `/companies/search` and `/people/search` do *not* apply here.
**Goal:** people working at companies that have *both* Salesforce and HubSpot installed — a classic CRM-displacement signal. Demonstrates the unified engine: same `technologies` key, same operator, but on `/people/search`.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/people/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"people_titles": ["RevOps", "Sales Operations"],
"technologies": [114, 287],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
],
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/people/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"people_titles": ["RevOps", "Sales Operations"],
"technologies": [114, 287],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
],
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/people/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
people_titles: ["RevOps", "Sales Operations"],
technologies: [114, 287],
filter_conditions: [
{ key: "technologies", operator: "and" }
],
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
***
## Common mistakes
There is no global "default operator" toggle. Every entry must name a specific filter:
```json theme={null}
// Ignored — no key
{ "filter_conditions": [{ "operator": "and" }] }
// Correct — overrides only the technologies filter
{ "filter_conditions": [{ "key": "technologies", "operator": "and" }] }
```
Entries are independent per-key overrides — they do not chain. Listing both `technologies` and `verticals` does not create a Boolean expression between them; each one just sets its own array's operator.
The combination *across* filter keys is always AND (every filter must match). You cannot OR-combine two distinct filter dimensions through `filter_conditions`. If you need a true OR-of-different-filters search, run two requests and merge results client-side.
AND is `column @> ARRAY[…]` — every value must be present. With 8+ values you almost always get zero rows because real-world tagging is sparse. Keep AND-overridden arrays at 2-4 values; use OR for exploratory or category-level filtering.
On `/people/search`, the people-API name is `company_places` / `company_locations`. But inside `filter_conditions[].key` you must use the **engine name** — `places`, `locations`. The remap happens internally before `filter_conditions` is consulted.
```json theme={null}
// Won't override — engine doesn't see "company_places" as a filter key
{ "filter_conditions": [{ "key": "company_places", "operator": "and" }] }
// Correct
{ "filter_conditions": [{ "key": "places", "operator": "and" }] }
```
Full remap table on the [People + Company Filters](/en/developer-guides/filters/people-with-company-filters#key-remap-reference) page.
When in doubt, omit `filter_conditions` first and check your result count against expectations. Add overrides only for filters where the default doesn't match your intent — this keeps the request payload smaller and easier to debug.
***
## See also
The mental model — start here if `filter_conditions` is your first stop.
How to layer company filters into `/people/search`, including the key-remap.
Full request schema for `/companies/search` (includes `company_filter_conditions`).
Full request schema for `/people/search` (includes `people_filter_conditions`).
# Filters Overview
Source: https://docs.pubrio.com/en/developer-guides/filters/overview
How Pubrio search filters work — the unified filter engine, AND/OR semantics, and when to use which.
Pubrio's search endpoints (`/companies/search`, `/people/search`, `/companies/advertisements/search`) share a single filter engine. You compose a request body once and the same rules apply across endpoints — including the way multi-value filters combine, how locations are matched, and how you override the default operator with `filter_conditions`.
## Why a unified filter engine?
Company-level filters like `technologies`, `verticals`, and `founded_dates` work identically on `/companies/search`, `/people/search`, and inside Monitor `company_filters` — you learn them once.
The default is OR (match any). Promote individual filters to AND (match all) by adding one entry to `filter_conditions` — without touching the rest of the body.
Array filters compile to native Postgres operators — `&&` (overlap) for OR, `@>` (contains) for AND. Index-friendly, no application-side post-filtering.
The `company_filters` block in [Monitors](/en/developer-guides/introduction) accepts the same shape, so a working search payload is also a working monitor payload.
***
## Anatomy of a search request
Every search request is built from three layers in the same JSON body:
| Layer | Where it lives | Examples |
| ------------------ | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| People filters | top-level keys | `people_titles`, `management_levels`, `departments`, `people_locations` |
| Company filters | nested under `company_filters: {...}` (recommended) — also accepted at top level | `technologies`, `verticals`, `founded_dates`, `employees`, `company_locations` |
| Operator overrides | `filter_conditions` array (inside `company_filters` when overriding company keys) | `[{ "key": "technologies", "operator": "and" }]` |
A minimal `/people/search` request that uses all three layers:
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/people/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"people_titles": ["VP of Engineering", "CTO"],
"company_filters": {
"technologies": ["Kubernetes", "Docker"],
"is_enable_similarity_search": true,
"company_locations": ["US"]
},
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/people/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"people_titles": ["VP of Engineering", "CTO"],
"company_filters": {
"technologies": ["Kubernetes", "Docker"],
"is_enable_similarity_search": True,
"company_locations": ["US"],
},
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/people/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
people_titles: ["VP of Engineering", "CTO"],
company_filters: {
technologies: ["Kubernetes", "Docker"],
is_enable_similarity_search: true,
company_locations: ["US"],
},
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
***
## `company_filters`: keep company-level keys grouped
The `company_filters: {...}` wrapper object is the recommended way to send company-level filters — it visually separates which keys filter the *person* from which filter the *company*, and matches the shape [Monitors](/en/developer-guides/introduction) already use, so payloads transfer cleanly between search and monitor configurations.
Both styles work; the engine flattens the wrapped form to the top level before processing, and **top-level keys win on conflict**:
```json Wrapped (recommended) theme={null}
{
"people_titles": ["VP of Engineering"],
"company_filters": {
"technologies": [37, 152],
"founded_dates": [2015, 2023],
"company_locations": ["US"]
}
}
```
```json Flat (also works) theme={null}
{
"people_titles": ["VP of Engineering"],
"technologies": [37, 152],
"founded_dates": [2015, 2023],
"company_locations": ["US"]
}
```
When you add a `filter_conditions` override for a company-level key, put it **inside** `company_filters` so it travels with the keys it overrides.
### Same shape on the `/search/similar` variants
`POST /companies/search/similar` and `POST /people/search/similar` accept the **same filter body** as their non-similar counterparts (including the `company_filters` wrapper and `filter_conditions`). Each one adds a similarity step on top:
| | What they need extra | What you get extra |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `/companies/search/similar` | A reference company — `domain_search_id`, `domain`, `linkedin_url`, or `domains` | Each result gets a `similarity_score` (float, 0-1) and rows are ordered by similarity descending |
| `/people/search/similar` | A reference person/title — one of `people_titles`, `people_search_id`, `linkedin_url`, `linkedin_urls`, or `peoples` | Same — `similarity_score` per row, ordered by similarity |
The response envelope is otherwise identical to the standard `search` endpoint. Filters narrow the candidate pool *before* similarity ranking is applied — so combining `company_locations: ["US"]` with `/people/search/similar` returns the closest US-based people to your reference titles, which is the "find more people like X within these constraints" pattern.
Unlike the standard `/search` endpoints, `/search/similar` does **not** return an exact `pagination.total_entries` — the value is capped because similar search ranks results by relevance and only surfaces the top matches. Use similar search to find the *best* matches, not to enumerate every one.
***
## AND vs OR — the one decision you make per filter
Multi-value filters (`technologies`, `verticals`, `keywords`, `categories`, …) accept an array. The operator decides what "match" means:
**Match any value.** Returns rows whose array overlaps with the input.
```json theme={null}
{
"technologies": ["Python", "PostgreSQL", "Kubernetes"],
"is_enable_similarity_search": true
}
```
A company is included if its tech stack contains **at least one** of `Python`, `PostgreSQL`, or `Kubernetes`. Compiles to Postgres `column && ARRAY[...]`.
Use when: you want broad reach — "interested in *any* of these", "located in *any* of these countries".
**Match every value.** Returns rows whose array contains every input value.
```json theme={null}
{
"technologies": [37, 152, 408],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
]
}
```
Numeric tag IDs come from `GET /technologies?search_term=python` (and similar). **Don't combine `is_enable_similarity_search: true` with AND on the same key** — similarity expands each free-text term into many tag IDs and `@>` then requires the row to contain all of them, which almost always returns zero.
A company is included only if its tech stack contains **all of** `[37, 152, 408]`. Compiles to Postgres `column @> ARRAY[...]`.
Use when: you want precision — "uses *all of* these technologies together", "tagged with *all* of these verticals".
Filters not listed in `filter_conditions` use the default operator (OR within an array, AND across distinct filter keys). You only declare the overrides — never the defaults.
***
## What you can override
Each endpoint accepts overrides for a different set of keys. The keys come from the OpenAPI enum on each `*_filter_conditions` schema:
`company_filter_conditions` keys: `keywords`, `verticals`, `vertical_categories`, `vertical_sub_categories`, `technologies`, `categories`, `advertisement_target_locations`, `advertisement_exclude_target_locations`, `advertisement_search_terms`, `places`, `exclude_places`, `job_exclude_locations`.
`people_filter_conditions` keys (delegate to the company engine): `keywords`, `verticals`, `vertical_categories`, `vertical_sub_categories`, `technologies`, `categories`, `places`, `exclude_places`, plus `social_media`.
`ads_filter_conditions` keys: `target_locations`, `exclude_target_locations`. Smaller set because ads only filter by impression country.
When using `/people/search`, the `filter_conditions[].key` for company-level locations uses the **bare** name from the company engine — `places`, `exclude_places` — not the prefixed people-API name (`company_places`). See [People + Company Filters](/en/developer-guides/filters/people-with-company-filters#key-remap-reference).
***
## Performance tips
Locations, employee buckets, and `founded_dates` are indexed and reduce the candidate set faster than free-text or vertical filters. Combine them with one or two precise filters before reaching for similarity search.
`column @> ARRAY[a, b, c, …]` requires every value to be present. Cardinality grows fast — a 10-tech AND on a category with average 3 tech tags returns near-zero rows and forces a full scan. Prefer 2-4 values per AND filter; switch to OR for exploratory queries.
If you can't supply slug IDs (verticals, technologies, categories) and only have free-text strings, set `is_enable_similarity_search: true` and `similarity_score: 0.7`. The engine resolves matches before applying the filter — much cheaper than scanning text.
`employees: [[201, 500], [501, 1000]]` (an array of buckets) and `revenues: [1000000, 5000000]` (a single min/max range) are faster and more idiomatic than long ID lists.
***
## Advertising activity filters
`/companies/search` can filter by a company's advertising footprint — how many ads they run, whether any are currently active, which platforms and formats they use, and how they rank against other advertisers in a given country. `POST /companies/advertisements/search` accepts every one of these filters too (`advertisement_active_ads`, `advertisement_running_ads`, `advertisement_total_ads`, `advertisement_platform_count`, `advertisement_format_count`, `advertisement_impressions_estimate`, `advertisement_formats`, `advertisement_country_activity`) — an ad is included if its owning company meets the bound.
| Filter | Shape | Scope |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- |
| `advertisement_active_ads`, `advertisement_running_ads`, `advertisement_total_ads` | `[min, max]` range | All countries |
| `advertisement_platform_count`, `advertisement_format_count` | `[min, max]` range | All countries |
| `advertisement_impressions_estimate` | `[min, max]` range | All countries |
| `advertisement_formats` | array — `image`, `video`, `text`, `carousel`, `dynamic_product`, `document`, `message`, `event`, `article`, `spotlight`, `follow`, `job`, `engagement` | All countries |
| `advertisement_platforms` | array — `linkedin`, `facebook`, `google`, `tiktok`, `apple` (`meta` accepted as an alias for `facebook`) | All countries |
| `advertisement_publisher_platforms`, `advertisement_exclude_publisher_platforms` | array — `facebook`, `instagram`, `messenger`, `threads`, `audience_network` | All countries |
| `advertisement_status` | array — `currently_running` (has ads on record), `active_last_30_min` (ad records changed in the last 30 minutes) | All countries |
| `advertisement_country_activity` | object, see below | One country |
Use `null` for an open-ended bound — `[1, null]` means "at least 1", `[null, 500]` means "500 or fewer".
```json theme={null}
{
"advertisement_active_ads": [1, null],
"advertisement_formats": ["video"]
}
```
### Ranking within a country
`advertisement_country_activity` scopes rank, percentile, and volume score to one country at a time — a company's ad rank in the US says nothing about its rank in Germany, so `country` is required:
```json theme={null}
{
"advertisement_country_activity": {
"country": "US",
"rank": [null, 500]
}
}
```
**`rank` counts down from the biggest spender, like a race.** `1` is the biggest advertiser in that country, and the number goes *up* as advertising volume goes *down*. To find the **biggest** spenders, filter `rank` with a **low** upper bound — `[null, 500]` is the top 500. Filtering `[500, null]` finds everyone **outside** the top 499, which is the opposite of "big spender". If you want a scale-free version that works the same regardless of how many advertisers are in that country, use `percentile` instead — it runs the other direction, so a **higher** number means a **bigger** spender: `[90, null]` is the top 10%.
Combine `advertisement_country_activity` with the all-country filters above in the same request — for example, "ranked in the top 500 in the US, and has at least 100 active ads company-wide":
```json theme={null}
{
"advertisement_country_activity": { "country": "US", "rank": [null, 500] },
"advertisement_active_ads": [100, null]
}
```
### Ranking the results
Filtering by `advertisement_country_activity` narrows *which* companies come back; it does not by itself decide the order. To get the biggest advertisers in that market first, ask for `sort_by: "advertisement_country_rank"`:
```json theme={null}
{
"advertisement_country_activity": { "country": "HK", "rank": [1, 10] },
"sort_by": "advertisement_country_rank"
}
```
Whenever `advertisement_country_activity` is present, each company also carries its standing in that country, so you can display the rank you filtered on:
| Field | Meaning |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `advertisement_country_rank` | Position in that country, 1 = biggest advertiser. Ties share a rank, so numbers can repeat and then skip. |
| `advertisement_country_percentile` | Share of advertisers in that country this company outranks. |
| `advertisement_country_active_ads` | Active ads attributed to that country — not the company-wide `advertisement_active_ads`. |
`sort_by: "advertisement_country_rank"` is ignored when `advertisement_country_activity` is absent, since a rank only exists inside a country. Pass `is_ascending_order: false` to list the smallest advertisers in the market first.
### Finding new entrants to a market
`advertisement_country_activity` also accepts two date windows, so you can ask who *started* advertising in a market rather than who is already big there:
| Key | Meaning |
| ------------ | ------------------------------------------------------------------------------------------------------------------ |
| `first_seen` | `[from, to]` — when the company's earliest ad in that country ran. This is the "newly entered this market" filter. |
| `last_seen` | `[from, to]` — when its most recent ad in that country ran. Useful for the opposite question: who has gone quiet. |
Companies that entered Japan since the start of July:
```json theme={null}
{
"advertisement_country_activity": { "country": "JP", "first_seen": ["2026-07-01", null] }
}
```
Either bound may be `null` for an open-ended window. Dates are interpreted in the request's timezone. A company whose ads carry no start date has no first-seen value and is treated as unknown — it is never reported as new. Combine with the ranked keys in the same object to narrow further, for example new entrants that are already spending heavily.
***
## Next steps
Reference page — every supported key, every default, and copyable AND/OR recipes.
Use any company filter inside `/people/search`. The headline new feature of the unified engine.
Full request/response schema for `/companies/search`.
Full request/response schema for `/people/search`.
Looking for the dashboard-side filtering walkthrough? See [Filtering & Exporting Contacts](/en/knowledge-base/concepts/search-filters) in the Knowledge Base.
# People + Company Filters
Source: https://docs.pubrio.com/en/developer-guides/filters/people-with-company-filters
Combine people-level and company-level filters in a single /people/search call — same filter engine as /companies/search.
`POST /people/search` accepts every company filter that `POST /companies/search` accepts. You no longer need to pre-fetch companies, collect their IDs, and feed them into a second people query — one request does both layers.
## Two parameter families, one body
A `/people/search` request body is split conceptually into two filter families. They live at the same level in the JSON, and you mix them freely.
Filter on attributes of the *person*:
| Parameter | Description |
| ---------------------- | ---------------------------------------------------- |
| `people_titles` | Job titles (free text or slug) |
| `management_levels` | `founder`, `c_suite`, `vp`, `director`, `manager`, … |
| `departments` | `master_engineering`, `master_sales`, … |
| `department_functions` | Sub-department / function slugs |
| `people_locations` | Country codes for the person's location |
| `people_groups` | Saved group IDs |
| `peoples` | Specific `people_search_id` values |
| `linkedin_urls` | Person LinkedIn URLs |
| `social_media` | Per-network social-media handles |
Filter on attributes of the *company* the person works at — same names as `/companies/search`, with a small set of `company_`-prefixed location keys:
| Parameter | Description |
| --------------------------- | ---------------------------------------------------------- |
| `technologies` | Technology slug IDs the company uses |
| `categories` | Category slug IDs |
| `verticals` | Vertical slug IDs |
| `vertical_categories` | Vertical category slug IDs |
| `vertical_sub_categories` | Vertical sub-category slug IDs |
| `keywords` | Free-text keywords matched against the company description |
| `founded_dates` | Founded-year range, e.g. `[2015, 2023]` |
| `employees` | Employee buckets, e.g. `[[100, 500], [501, 1000]]` |
| `revenues` | Revenue buckets in USD |
| `company_locations` | Country codes for the company HQ |
| `company_exclude_locations` | Country codes to exclude |
| `company_places` | City / region names to include |
| `company_exclude_places` | City / region names to exclude |
| `companies` | Specific `domain_search_id` values |
| `domains` | Specific company domains |
| `company_linkedin_urls` | Company LinkedIn URLs |
The `company_` prefix exists only on the location/place filters because the bare `places` / `locations` names are already used for the *person's* address. Everything else uses the bare company name (`technologies`, not `company_technologies`).
***
## Build a query in four steps
Who, exactly? Title, seniority, department, country. Keep this layer at the **top level** of the body — the company predicate usually does the precision work.
Which companies do they need to work at? Industry, size, founded year, HQ country, technology stack. Group these under a **`company_filters: {...}`** object so it's obvious which layer each key belongs to.
For any multi-value filter that needs precision (e.g., "uses *all* of these techs"), add an entry to `filter_conditions` *inside* `company_filters`. Defaults are OR.
`POST /people/search`. Both styles are accepted, but `company_filters: {...}` reads cleaner and matches the [Monitors](/en/developer-guides/introduction) payload shape.
### Complete example
The query: VPs of Engineering or CTOs at US-based mid-market companies founded between 2015 and 2023, employing 100-5,000 people, that use *both* Kubernetes and Docker, but excluding companies HQ'd in San Francisco.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/people/search \
-H "Content-Type: application/json" \
-H "pubrio-api-key: YOUR_API_KEY" \
-d '{
"people_titles": ["VP of Engineering", "CTO"],
"company_filters": {
"company_locations": ["US"],
"company_exclude_places": ["San Francisco"],
"founded_dates": [2010, 2024],
"employees": [[100, 500], [501, 1000], [1001, 5000]],
"technologies": ["Kubernetes", "Docker"],
"is_enable_similarity_search": true
},
"per_page": 25,
"page": 1
}'
```
```python Python theme={null}
import requests
response = requests.post(
"https://api.pubrio.com/people/search",
headers={
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
json={
"people_titles": ["VP of Engineering", "CTO"],
"company_filters": {
"company_locations": ["US"],
"company_exclude_places": ["San Francisco"],
"founded_dates": [2010, 2024],
"employees": [[100, 500], [501, 1000], [1001, 5000]],
"technologies": ["Kubernetes", "Docker"],
"is_enable_similarity_search": True,
},
"per_page": 25,
"page": 1,
},
)
print(response.json())
```
```javascript Node.js theme={null}
const response = await fetch("https://api.pubrio.com/people/search", {
method: "POST",
headers: {
"Content-Type": "application/json",
"pubrio-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
people_titles: ["VP of Engineering", "CTO"],
company_filters: {
company_locations: ["US"],
company_exclude_places: ["San Francisco"],
founded_dates: [2010, 2024],
employees: [[100, 500], [501, 1000], [1001, 5000]],
technologies: ["Kubernetes", "Docker"],
is_enable_similarity_search: true,
},
per_page: 25,
page: 1,
}),
});
console.log(await response.json());
```
***
## Key remap reference
When `/people/search` hands company filters to the shared engine, the location/place keys are renamed to their bare forms. The bare names are what the engine — and `filter_conditions[].key` — actually see:
| You send (people-API name) | Engine sees (company-API name) |
| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
| `company_locations` | `locations` |
| `company_exclude_locations` | `exclude_locations` |
| `company_places` | `places` |
| `company_exclude_places` | `exclude_places` |
| `technologies`, `verticals`, `vertical_categories`, `vertical_sub_categories`, `categories`, `keywords`, `founded_dates`, `employees`, `revenues` | passed through unchanged |
This is why `filter_conditions[].key` for company-level locations uses the bare names:
```json theme={null}
{
"company_places": ["New York", "Boston"],
"filter_conditions": [
{ "key": "places", "operator": "and" }
]
}
```
`{ "key": "company_places", "operator": "and" }` is silently ignored — the engine doesn't recognise the prefixed name. Always reference the engine name in `filter_conditions`.
***
## Joins behind the scenes
Adding *any* company-level filter switches the people-to-company join from `LEFT JOIN` to `INNER JOIN`. People without a recognised company on file are excluded from the result, even when they match every people-level filter.
If your search drops to zero rows the moment you add `company_locations` or `technologies`, check whether your dataset has companies linked to the people you expect. The engine prefers correctness over recall here — it never invents companies to satisfy the filter.
You'll see this same join behaviour reflected in the response: every returned person includes a populated `company` object whenever any company filter was applied.
***
## Common patterns
Target a fixed list of companies (`companies` or `domains`), then layer on people-level filters to find the right buyers inside each one.
```json theme={null}
{
"people_titles": ["VP Marketing", "CMO"],
"management_levels": ["vp", "c_suite"],
"company_filters": {
"companies": ["67c4696b-…", "f1e2d3c4-…", "0a9b8c7d-…"]
}
}
```
Describe the company shape, not specific accounts. Use ranges and verticals — the engine returns the people that fit.
```json theme={null}
{
"people_titles": ["Head of Engineering"],
"company_filters": {
"verticals": [12, 47],
"company_locations": ["US", "CA"],
"founded_dates": [2015, 2023],
"employees": [[51, 200], [201, 500]],
"filter_conditions": [
{ "key": "verticals", "operator": "and" }
]
}
}
```
Find buyers at companies running a specific stack. AND on `technologies` is the typical override.
```json theme={null}
{
"people_titles": ["RevOps", "Sales Operations"],
"departments": ["master_sales"],
"company_filters": {
"technologies": [114, 287, 452],
"filter_conditions": [
{ "key": "technologies", "operator": "and" }
]
}
}
```
Find decision-makers at companies that use a competitor's product (one tech) but not yours (excluded via `categories` or a separate filter pass).
```json theme={null}
{
"people_titles": ["VP Sales"],
"management_levels": ["vp"],
"company_filters": {
"technologies": [287]
}
}
```
Then re-run with `technologies: [114]` (your product's tag ID) and diff client-side.
***
## Next steps
Full reference — every key, every default, copyable AND/OR recipes.
The mental model behind the unified filter engine.
Full request/response schema for `/people/search`.
Full request/response schema for `/companies/search`.
# People Contact Lookup
Source: https://docs.pubrio.com/en/developer-guides/people-contact-lookup
Reverse-lookup a person from an email, phone, or first/last name + company — no people_search_id required. 1 credit per billable match.
The People Contact Lookup API answers the question **"who does this email/phone/name belong to?"** Hand it an identifier, get back a `people_search_id` and the matched person's profile — without having to run a search first.
```bash theme={null}
curl -X POST https://api.pubrio.com/redeem/people/contact/lookup \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "king.lai@pubrio.com" }'
```
## When to use Contact Lookup
Use Contact Lookup when **you have an identifier and want to find the person**:
* An email landed in your inbox — who sent it, what company, what title?
* A phone number rang on your sales line — match it to a known contact
* A CSV of leads with names and companies but no Pubrio IDs — resolve them all to `people_search_id`s
* Form submission with `email + name` — enrich into a full contact record
If instead you have a `people_search_id` (or LinkedIn URL) and want the **email + phone for that person**, use [People Redeem](/en/developer-guides/people-redeem) — it's the forward direction.
## Two flavors
| Endpoint | Use when |
| ------------------------------------------ | -------------------------------------------------------------------------------------------- |
| `POST /redeem/people/contact/lookup` | Single lookup — one identifier per request. |
| `POST /redeem/people/contact/lookup/batch` | Batch lookup — up to your subscription's bulk size limit per request, processed in parallel. |
Both endpoints return the same `match` metadata per record (see [Match metadata](#match-metadata) below).
## Quick start
```bash curl theme={null}
curl -X POST https://api.pubrio.com/redeem/people/contact/lookup \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "king.lai@pubrio.com" }'
```
```js JavaScript theme={null}
const res = await fetch("https://api.pubrio.com/redeem/people/contact/lookup", {
method: "POST",
headers: {
"pubrio-api-key": process.env.PUBRIO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "king.lai@pubrio.com" }),
});
const { data } = await res.json();
```
```python Python theme={null}
import os, requests
res = requests.post(
"https://api.pubrio.com/redeem/people/contact/lookup",
headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"]},
json={"email": "king.lai@pubrio.com"},
)
data = res.json()["data"]
```
**Response:**
```json theme={null}
{
"data": {
"profile": {
"credit": 450375,
"topup_credit": 235236,
"total_credit_cost": 1
},
"peoples": [
{
"people_search_id": "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
"first_name": "King",
"last_name": "Lai",
"people_name": "King Lai",
"company_name": "Pubrio",
"domain": "pubrio.com",
"match": {
"confidence": "exact",
"input": { "value": "king.lai@pubrio.com", "type": "email-work" },
"is_duplicate_input": false
}
}
]
}
}
```
## Lookup modes
You can match a person in two ways:
### Exact match — by email or phone
The default. Pass `email` or `phone`; Pubrio matches on the normalized contact value. This always returns `match.confidence: "exact"` when it hits.
```json theme={null}
{ "email": "king.lai@pubrio.com" }
```
```json theme={null}
{ "phone": "+15551234567" }
```
### Similarity match — by name + domain or company
If you don't have a deterministic identifier, you can fall back to similarity matching. Pass `first_name`, `last_name`, plus either `domain` or `company`, and set `is_enable_similarity_search: true`.
```json theme={null}
{
"first_name": "King",
"last_name": "Lai",
"domain": "pubrio.com",
"is_enable_similarity_search": true
}
```
Pubrio first tries to find an exact email/phone hit; if none exists and similarity is enabled, it ranks candidates by name proximity within the company domain (or, if `domain` is omitted, the company match). Returned matches carry `match.confidence: "similarity_domain"` or `"similarity_company"` so you can filter by certainty.
You can combine both: pass an email **and** a name + domain. The exact email match wins; the name fields become a fallback only if the email doesn't resolve.
## Match metadata
Every returned record includes a `match` object describing how the hit was made:
| Field | Values | Meaning |
| -------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `match.confidence` | `exact` | Direct email/phone match. Highest confidence. |
| | `similarity_domain` | Name-based match anchored to a known company domain. |
| | `similarity_company` | Name-based match anchored to a company name (no domain). |
| `match.input` | `{ value, type }` | Echoes the identifier that produced the hit, so you can show "matched on `king.lai@pubrio.com`" in your UI. |
| `match.is_duplicate_input` | boolean | `true` when the same identifier appeared earlier in a batch — the lookup is performed only once and the duplicate isn't charged. |
Use `match.confidence` to gate downstream actions: e.g., auto-enroll only `exact` matches into a sequence; route `similarity_*` matches to manual review.
## Batch lookup
Submit up to your subscription's bulk size limit in one request. Each entry takes the same identifiers as the single-lookup body.
```bash theme={null}
curl -X POST https://api.pubrio.com/redeem/people/contact/lookup/batch \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"peoples": [
{ "email": "king.lai@pubrio.com" },
{ "first_name": "John", "last_name": "Smith", "domain": "example.com" }
],
"is_enable_similarity_search": true
}'
```
The batch is synchronous — the response contains all resolved records in the same order as the input. Unmatched inputs are dropped from the response (they don't appear at all and aren't charged).
## Credit cost
**1 credit per billable match.** Specifically:
* A successful match (exact or similarity) → 1 credit
* No match → 0 credits
* Duplicate input within a batch → 0 credits (resolved once, charged once)
This makes Contact Lookup an order of magnitude cheaper than [Redeem](/en/developer-guides/people-redeem) — you're paying to **identify** a person, not to **unlock** their contacts. If after looking up you also need their email/phone, redeem the returned `people_search_id`.
## Common patterns
On every inbound email, look up the sender. Surface their company, title, and `people_search_id` in your CRM or helpdesk view.
Resolve a CSV of `name + company` rows to canonical `people_search_id`s. Ones that don't match exact get a similarity attempt automatically.
Hand off `{ email }` from your marketing form. Get back the company, title, and a Pubrio ID you can route through scoring rules.
Two-step flow: cheap lookup (1 credit) to identify the person, then full redeem (5–10 credits) only for matches above a confidence threshold.
## FAQ
No — Contact Lookup returns the person's profile (`people_search_id`, name, company, domain, title, etc.) plus match metadata. To get the verified contacts themselves, pass the returned `people_search_id` to [Redeem](/en/developer-guides/people-redeem).
`similarity_domain` means we anchored the name match to a known company domain — strongest of the similarity tiers. `similarity_company` means we anchored to a company name with no canonical domain — slightly less reliable, since multiple unrelated companies can share a name.
No. Unmatched inputs are silently dropped from the response and not billed.
The duplicate is detected server-side, the lookup runs once, and you're charged once. The duplicate entry is flagged with `match.is_duplicate_input: true` in the response.
The cap is set on your subscription as `people_contact_enrichment_bulk_size`. Most plans allow 100+ per call; reach out if you need a higher ceiling.
Not on Contact Lookup. Use [Redeem](/en/developer-guides/people-redeem) with `linkedin_url` if you have a LinkedIn profile and want both the resolution and the contacts in one call.
Phone is matched on a normalized form. International (E.164) is the most reliable input. Domestic-format numbers may match if the country can be inferred, but E.164 (`+15551234567`) avoids ambiguity.
## Related
Forward direction: spend credits to unlock email + phone for a known `people_search_id` or LinkedIn URL.
Find people who match a job/company/location filter.
Resolve a single person's full profile from a known identifier.
Credit costs across all endpoints, by plan tier.
# People Redeem
Source: https://docs.pubrio.com/en/developer-guides/people-redeem
Spend credits to unlock verified work email, personal email, and phone number for a person you have already identified — single, bulk, and async-bulk patterns.
The Redeem People API turns a `people_search_id` (or LinkedIn URL) into the full set of verified contacts — work email, personal email, phone — for that person. You only spend credits when contact data is actually returned.
```bash theme={null}
curl -X POST https://api.pubrio.com/redeem/people \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"people_search_id": "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
"people_contact_types": ["email-work", "phone"]
}'
```
## When to use Redeem
Use Redeem when **you already know who the person is** and you need their contact details:
* You ran [People Search](/en/api-reference/endpoint/people/search) and want to unlock contacts for the matches
* You have a LinkedIn profile URL and want to reach out to the person
* You have a `people_search_id` from a previous Pubrio response
If instead you have an **email or phone and want to find the matching person**, use [People Contact Lookup](/en/developer-guides/people-contact-lookup) — it's the reverse direction and 1 credit per match.
## Three flavors
| Endpoint | Use when | Behavior |
| --------------------------------- | ------------------------- | ------------------------------------------------------ |
| `POST /redeem/people` | One person at a time | Synchronous. Returns contacts in the response. |
| `POST /redeem/people/batch` | 2–N people in one shot | Asynchronous. Returns a `redeem_query_id` immediately. |
| `POST /redeem/people/batch/query` | Polling for batch results | Returns the full result set when the batch completes. |
The batch flow is the right pattern for any list-driven workflow — CSV uploads, sequence enrollment, CRM sync — because it parallelizes the contact-resolution work server-side.
## Quick start — single redeem
```bash curl theme={null}
curl -X POST https://api.pubrio.com/redeem/people \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"people_search_id": "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
"people_contact_types": ["email-work", "phone"]
}'
```
```js JavaScript theme={null}
const res = await fetch("https://api.pubrio.com/redeem/people", {
method: "POST",
headers: {
"pubrio-api-key": process.env.PUBRIO_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
people_search_id: "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
people_contact_types: ["email-work", "phone"],
}),
});
const { data } = await res.json();
```
```python Python theme={null}
import os, requests
res = requests.post(
"https://api.pubrio.com/redeem/people",
headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"]},
json={
"people_search_id": "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
"people_contact_types": ["email-work", "phone"],
},
)
data = res.json()["data"]
```
**Response:**
```json theme={null}
{
"data": {
"profile": {
"credit": 450376,
"topup_credit": 235237,
"total_credit_cost": 15
},
"peoples": [
{
"people_search_id": "e37ccf38-ea8f-422e-9874-cb23b15e8fe4",
"emails": [
{ "value": "king.lai@pubrio.com", "type": "email-work", "status": "Verified" }
],
"phones": [
{ "value": "+15551234567", "type": "phone", "status": null }
]
}
]
}
}
```
`profile` echoes your post-charge balance and the credits this call cost, so you can update an in-app meter without a separate `/profile/usage` round-trip.
## Identifiers
You can identify the person to redeem in two ways:
| Identifier | Description |
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `people_search_id` | UUID returned by any Pubrio search/lookup endpoint. Cheapest and most reliable — no resolution step. |
| `linkedin_url` | A LinkedIn profile URL (e.g., `https://www.linkedin.com/in/jane-doe-123`). Pubrio resolves it to a `people_search_id` first; if the profile is new, this can include a one-time external enrichment step. |
`people_contact_types` is the contract for what you want back. Mix any of `email-work`, `email-personal`, `phone` — you're charged per type returned, not per type requested. Asking for `["email-work", "phone"]` and getting only `email-work` back charges only for the email.
## Bulk redeem (async pattern)
For more than one person, use the batch flow. It runs each redeem in parallel server-side and avoids the per-request roundtrip cost.
**Step 1 — submit:**
```bash theme={null}
curl -X POST https://api.pubrio.com/redeem/people/batch \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"peoples": [
"540574d1-ff74-475b-aea2-f8ae643b806d",
"e37ccf38-ea8f-422e-9874-cb23b15e8fe4"
],
"people_contact_types": ["email-work", "phone"]
}'
```
```json theme={null}
{
"data": {
"redeem_query_id": "a046c1da-b3d4-4ca1-aca6-1dd8c8055701",
"is_completed": false,
"estimated_time": 6,
"estimated_time_type": "second"
}
}
```
**Step 2 — poll:**
```bash theme={null}
curl -X POST https://api.pubrio.com/redeem/people/batch/query \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "redeem_query_id": "a046c1da-b3d4-4ca1-aca6-1dd8c8055701" }'
```
When `is_completed` is `true`, the response contains the full `peoples` array with resolved contacts and the total credit cost for the batch.
Poll at the cadence reported by `estimated_time`. Polling tighter than the estimate just wastes round-trips — the work isn't done yet.
## Credit costs
Credits are deducted **per contact returned**, not per request. Pricing per record:
| Contact type | Credits per record |
| ------------------------------- | ------------------ |
| `email-work` / `email-personal` | 5 |
| `phone` | 10 |
If a person has no work email and you only requested `email-work`, you're charged nothing for that record. If you requested both an email and a phone and Pubrio returns both, you're charged for both. See the full [pricing table](/en/get-started/pricing) for plan-specific rates.
## Common patterns
Run [People Search](/en/api-reference/endpoint/people/search), let the user pick rows in your UI, then send the selected `people_search_id`s through `/redeem/people/batch`. Charge only for what's used.
Accept a list of LinkedIn URLs from a CRM export or browser extension. Submit them via `/redeem/people` (single) or build a small batch wrapper.
Before adding contacts to an outbound cadence, redeem `email-work` only — keeps cost predictable while feeding deliverable addresses to your sender.
Map existing CRM records to `people_search_id` (via [People Lookup](/en/api-reference/endpoint/people/lookup)), then redeem in batch on a schedule.
## FAQ
No. Credits are deducted per record returned. If a person has no work email available, you pay nothing for that contact slot — even if you asked for it.
Duplicates are deduplicated server-side. You're charged once.
Pubrio attempts a one-time external resolution. If the profile resolves, normal redeem pricing applies. If it doesn't, no credits are charged.
Pubrio re-verifies email and phone records on a rolling basis. Each contact comes with a `status` field (`Verified`, `null`, etc.) so you can filter to only verified records on your end.
Yes — `people_contact_types` is an array. Pass exactly the types you want; you're only billed on what's returned.
Above \~3 records, batch wins on latency and on per-record reliability. The batch endpoint runs fan-out internally and parallelizes any external enrichment hops, so a 50-record batch is closer to a 5-second wall-clock than 50 × per-request RTT.
## Related
Reverse-lookup: find a person from an email, phone, or name + domain. 1 credit per match.
Find people who match a profile (title, location, company size, technologies, etc.).
Resolve a single person's full profile from an identifier — no contact unlock.
Credit costs across all endpoints, by plan tier.
# Advertisement Search
Source: https://docs.pubrio.com/en/developer-guides/search/advertisement-search
Find the ads a company is running across LinkedIn, Meta, Google, TikTok and Apple — by source, format, target country, reach and active window — and read the creative, landing page and impression data on each.
[Advertisement Search](/en/api-reference/endpoint/companies/advertisements_search) returns individual ads Pubrio has captured, one row per ad. Each row carries the creative (headline, image or video, landing page), where it was shown, when it ran, and the impression range the source reports.
```bash theme={null}
curl -X POST https://api.pubrio.com/companies/advertisements/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com"],
"source_types": ["linkedin", "facebook"],
"active_dates": ["2026-08-01", "2026-08-31"],
"per_page": 25
}'
```
## When to use it
* **Competitive creative research** — what a competitor is saying, in which countries, in which format.
* **Intent** — a company that just started advertising in a new market is expanding into it. Combine with `target_locations`.
* **Spend proxies** — `reach_tiers` and the `advertisement_*` metric filters rank companies by advertising volume without a spend figure.
For totals and trends use [Advertisement Insights](/en/api-reference/endpoint/companies/advertisements_insights). To find *companies* by their advertising rather than the ads themselves, use the `advertisement_*` filters on [Company Search](/en/api-reference/endpoint/companies/search).
## Sources
| `source_type` | Notes |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `linkedin` | Rich format labels (`Single Image Ad`, `Document Ad`, …) |
| `facebook` | Spans Facebook, Instagram, Messenger, Threads and Audience Network; narrow with `publisher_platforms`. `meta` is accepted as an alias. |
| `google` | Mostly `text` |
| `tiktok` | |
| `apple` | |
`total_impressions` is `null` on ads whose source publishes no estimate, and such ads never match `reach_tiers`.
## Scope to a company
| Key | Value |
| --------------- | --------------------------------------------- |
| `domains` | `["stripe.com"]` |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` |
| `companies` | `["5378845d-…"]` — `domain_search_id` values |
A search without a company is allowed, for example `{"target_locations": ["SG"], "source_types": ["linkedin"]}`. Only ads already linked to a Pubrio company are returned unless you set `is_include_unlinked_companies: true`.
## Filters
### Source and format
| Key | Type | Matches |
| ----------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `source_types` | `string[]` | `linkedin`, `facebook`, `google`, `tiktok`, `apple`. Any listed. Unknown values match nothing and are echoed in `metadata.unsupported_source_types`. |
| `exclude_source_types` | `string[]` | Same vocabulary, excluded. |
| `advertisement_formats` | `string[]` | Canonical formats: `image`, `video`, `text`, `carousel`, `dynamic_product`, `document`, `message`, `event`, `article`, `spotlight`, `follow`, `job`, `engagement`. See [Formats](/en/api-reference/enums#formats). |
| `publisher_platforms` / `exclude_publisher_platforms` | `string[]` | `facebook`, `instagram`, `messenger`, `threads`, `audience_network`. Meta ads only. |
### Text
| Key | Type | Matches |
| ------------------------------ | --------------------- | -------------------------- |
| `headlines` | `string[]` | Headline text, any listed. |
| `search_term` / `search_terms` | `string` / `string[]` | Headline and description. |
### Dates
| Key | Type | Matches |
| -------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `active_dates` | `[from, to]` | Ads **running at any point** in the window, including ads that started earlier and are still live. This is the window Advertisement Insights uses. Ads with no `started_at` count from `created_at`. Both dates required; UTC day boundaries. |
| `start_dates` | `[from, to]` | `started_at` inside the window — ads that *launched* then. Workspace-timezone day boundaries. |
| `end_dates` | `[from, to]` | `ended_at` inside the window. Workspace-timezone day boundaries. |
| `created_at` | date or ISO timestamp | Captured by Pubrio at or after this instant (UTC), for incremental sync. |
`start_dates` hides most of a company's running campaigns, because a campaign that launched in March is still running in August. Reach for `active_dates` unless you specifically want launches.
### Where it was shown
| Key | Type | Matches |
| -------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `target_locations` | `string[]` | Countries the ad was delivered in. OR by default; add `{"key": "target_locations", "operator": "and"}` to `filter_conditions` to require every country. |
| `exclude_target_locations` | `string[]` | Countries to leave out. |
| `company_locations` | `string[]` | Headquarters country of the advertiser. |
### Reach and volume
| Key | Type | Matches |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `reach_tiers` | `string[]` | Impression band of the ad: `lt_1k`, `1k_10k`, `10k_50k`, `50k_100k`, `100k_500k`, `500k_1m`, `1m_plus`. Ads without a `total_impressions` value never match. |
| `advertisement_active_ads`, `advertisement_running_ads`, `advertisement_total_ads`, `advertisement_platform_count`, `advertisement_format_count`, `advertisement_impressions_estimate` | `[min, max]` | Filter ads by the **advertiser's** totals, e.g. `advertisement_active_ads: [10, null]` returns ads from companies with at least ten live ads. |
| `advertisement_country_activity` | object | `{ "country": "US", "rank": [null, 100] }` — ads from the top 100 advertisers in that country. |
### Enrichment
| Key | Type | Notes |
| ------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------- |
| `is_realtime_enrichment` | `boolean` | If the search returns nothing, scrape the sources now and search again. Company-scoped searches only. |
| `enrichment_mode` | `default` / `latest` | `latest` re-scrapes on every call regardless of cache. |
| `is_include_unlinked_companies` | `boolean` | Also return ads Pubrio could not link to a company record (`is_company_matched: false`). |
### Paging and order
`per_page`, `page` and `is_ascending_order` behave as on every search. Rows are ordered by `created_at` (capture time), newest first.
## What a row looks like
```json theme={null}
{
"advertisement_id": "58fa840e-08aa-4ac8-a204-8b185fd62f8e",
"advertisement_search_id": "58fa840e-08aa-4ac8-a204-8b185fd62f8e",
"created_at": "2026-09-01T02:00:07.068Z",
"last_modified": "2026-09-01T02:00:07.068Z",
"started_at": "2026-08-24T00:00:00.000Z",
"ended_at": "2026-08-31T00:00:00.000Z",
"title": "Your 2026 peak season prep checklist is here",
"source_type": "linkedin",
"advertisement_format": "Single Image Ad",
"advertisement_format_normalized": "image",
"is_company_matched": true,
"advertiser": "Stripe",
"advertiser_url": "https://www.linkedin.com/company/2135371",
"advertisement_url": "https://www.linkedin.com/ad-library/detail/1518455034",
"total_impressions": "< 1k",
"total_impressions_lower": null,
"total_impressions_upper": 1000,
"image_url": "https://buckets.pubrio.com/images/public/….jpg",
"video_url": null,
"carousel_images": null,
"destination_url": "https://stripe.com/industries/retail?trk=…",
"raw_link_url": null,
"target_country_codes": ["US"],
"publisher_platforms": null,
"companies": {
"domain_search_id": "5378845d-7726-4817-aba9-ced8c5f41dee",
"company_name": "Stripe",
"domain": "stripe.com",
"country_code": "US",
"…": "…"
}
}
```
* `ended_at` is `null` while the ad is still running.
* `advertisement_format` is the source's own label; `advertisement_format_normalized` is the slug you can filter on.
* `destination_url` is the unwrapped landing page; `raw_link_url` keeps the click-tracker exactly as captured.
* `total_impressions` is the source's text; the `_lower` / `_upper` pair is the parsed range.
### `metadata` on this endpoint
```json theme={null}
"metadata": {
"profile": null,
"filters": { "domains": ["stripe.com"], "source_types": ["tiktok", "bogus"], "per_page": 25, "language": "en" },
"ignored_fields": [],
"applied_source_types": ["tiktok"],
"unsupported_source_types": ["bogus"],
"coverage_notes": [{ "source_type": "tiktok", "scope": "eea_uk_ch" }]
}
```
| Key | When present | Meaning |
| -------------------------- | ------------------- | ------------------------------------------------------------------------------------------ |
| `ignored_fields` | Always | Body keys the endpoint dropped |
| `applied_source_types` | `source_types` sent | Values that were recognised |
| `unsupported_source_types` | Unknown value sent | Those values matched nothing |
| `coverage_notes` | When applicable | Coverage notes for the requested sources |
| `skipped_source_types` | When applicable | `[{ "source_type", "reason" }]` — sources not applied for the requested `target_locations` |
## Recipes
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/advertisements/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["adyen.com", "checkout.com"],
"target_locations": ["SG", "AU"],
"advertisement_formats": ["video", "carousel"],
"active_dates": ["2026-08-01", "2026-09-04"],
"per_page": 25
}'
```
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/advertisements/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_locations": ["US"],
"source_types": ["linkedin"],
"reach_tiers": ["100k_500k", "500k_1m", "1m_plus"],
"active_dates": ["2026-08-01", "2026-09-04"],
"per_page": 25
}'
```
Each row's `companies.domain_search_id` is a company spending heavily on LinkedIn in the US this month.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/advertisements/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["nike.com"],
"source_types": ["facebook"],
"publisher_platforms": ["instagram"],
"exclude_publisher_platforms": ["facebook"],
"per_page": 25
}'
```
## Related
Every parameter and response field.
Totals, reach tiers and creatives for one company over a window.
Find companies by their advertising on Company Search.
Sources, formats, platforms and reach tiers.
# Cloud Footprint Search
Source: https://docs.pubrio.com/en/developer-guides/search/cloud-footprint-search
See which cloud and hosting providers a company runs on, in which countries and regions, and spot the markets it has just moved into.
[Cloud Footprint Search](/en/api-reference/endpoint/companies/cloud_footprints_search) returns one row per company per provider per country. A company on AWS in Germany and on Cloudflare in Singapore is two rows. Each row carries how much the company runs there, which cloud regions and cities it touches, and when that presence was first and last observed.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/cloud_footprints/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_locations": ["DE"],
"providers": ["AWS"],
"first_seen_dates": ["2026-07-01", null],
"host_count": [100, null],
"per_page": 25
}'
```
## When to use it
* **First entry.** A company's first row in a country is the moment it showed up there. `first_seen_dates` inside your window plus `is_cross_border_only` isolates exactly that.
* **Pilot or production.** A handful of hosts reads as a proof of concept; hundreds reads as a live deployment. `host_count` and `server_count` tell them apart, and a company crossing from one to the other is committing to the market.
* **New competitors.** Point `target_locations` at your own market with a recent `first_seen_dates` to see who has just arrived in it.
* **Segment by stack.** `providers` and `cloud_regions` find everyone on a given platform or in a given region.
## Scope to a company
| Key | Value |
| ------------------ | --------------------------------------------- |
| `domains` | `["stripe.com"]` |
| `domain` | `"stripe.com"` |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` |
| `companies` | `["db26de04-…"]` — `domain_search_id` values |
| `domain_search_id` | `"db26de04-…"` |
A search without a company is allowed, and is the usual way to build a list — for example `{"target_locations": ["DE"], "providers": ["AWS"]}`.
## Filters
### Provider, region and city
| Key | Example |
| --------------- | -------------------------------- |
| `providers` | `["AWS", "Cloudflare"]` |
| `cloud_regions` | `["eu-central-1", "westeurope"]` |
| `cities` | `["Frankfurt", "Ashburn"]` |
Every key takes a list and has an `exclude_` twin. `cloud_regions` and `cities` are arrays on the row, so they also accept `filter_conditions` to switch from OR (any) to AND (all).
### Where the infrastructure sits
| Key | Example |
| ------------------- | -------------- |
| `target_locations` | `["DE", "SG"]` |
| `company_locations` | `["US"]` |
`target_locations` is where the infrastructure runs. `company_locations` is where the company is headquartered. The two differ on exactly the rows worth looking at.
### Size
| Key | Meaning |
| --------------------- | ----------------------------------- |
| `host_count` | Hosts on this row |
| `server_count` | Distinct IP addresses |
| `shared_server_count` | Servers shared with other companies |
| `region_count` | Cloud regions |
| `city_count` | Cities |
All five take `[min, max]`, and `null` leaves a bound open. They describe this row alone — one provider in one country.
### When it appeared
| Key | Example |
| ------------------ | ---------------------- |
| `first_seen_dates` | `["2026-07-01", null]` |
| `last_seen_dates` | `[null, "2026-06-30"]` |
Both take `[from, to]` as ISO dates, and `null` opens either end. `first_seen_dates` is the market-entry filter; `last_seen_dates` answers the opposite question.
### Cross-border only
Set `is_cross_border_only: true` to keep only presence outside the company's home market. Companies with no known headquarters are excluded rather than guessed at.
### The whole company
| Key | Meaning |
| -------------------------------------------- | --------------------------------- |
| `cloud_footprint_host_count` | Hosts everywhere |
| `cloud_footprint_provider_count` | Distinct providers used |
| `cloud_footprint_country_count` | Countries hosted in |
| `cloud_footprint_cross_border_country_count` | Countries outside the home market |
| `cloud_footprint_providers` | Uses any of these providers |
| `cloud_footprint_primary_provider` | Largest provider is one of these |
Keys prefixed `cloud_footprint_` describe the company across every row it has, not the row in front of you. Use them to qualify the company while still seeing all of its rows.
### Paging and order
`per_page`, `page` and `is_ascending_order` behave as on every search. Rows are ordered by `last_seen_at`, most recently observed first.
## What a row looks like
```json theme={null}
{
"cloud_footprint_id": "b8fcf5c3-a309-4052-ae8f-fe5706051617",
"domain_search_id": "db26de04-4131-493a-904b-2c7fda2873ee",
"provider": "Azure",
"country_code": "NL",
"company_country_code": "DK",
"is_home_market": false,
"host_count": 437,
"server_count": 8,
"shared_server_count": 0,
"region_count": 1,
"city_count": 0,
"cloud_regions": ["westeurope"],
"cities": null,
"first_seen_at": "2026-07-27T06:59:38.260Z",
"last_seen_at": "2026-09-04T12:43:28.724Z",
"evidence_url": "https://www.pubrio.com/evidence/e458a89952ed1e39e977794327939397",
"companies": {
"domain_search_id": "db26de04-4131-493a-904b-2c7fda2873ee",
"company_name": "Wonderful Sound for All - WSA",
"domain": "wsa.com",
"country_code": "DK",
"logo_url": "https://buckets.pubrio.com/company-logo/…"
}
}
```
This is a Danish company running Azure in the Netherlands: `company_country_code` is `DK`, `country_code` is `NL`, so `is_home_market` is `false`. `evidence_url` is a Pubrio page backing the row; it is `null` for a home market, which raises no expansion signal.
## Recipes
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/cloud_footprints/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_locations": ["DE"],
"first_seen_dates": ["2026-08-01", null],
"is_cross_border_only": true,
"host_count": [50, null],
"per_page": 25
}'
```
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/cloud_footprints/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"providers": ["AWS"],
"target_locations": ["SG", "JP", "IN"],
"server_count": [10, null],
"per_page": 25
}'
```
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/cloud_footprints/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"cloud_footprint_country_count": [5, null],
"target_locations": ["DE"],
"host_count": [100, null],
"per_page": 25
}'
```
Each row's `domain_search_id` is a company running in at least five countries with a real deployment in this one.
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/cloud_footprints/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_cross_border_only": true,
"first_seen_dates": ["2026-08-01", null],
"host_count": [1, 25],
"per_page": 25
}'
```
A small, brand-new footprint in a market the company is not headquartered in — the shape of a proof of concept before it becomes a deployment.
## Per-company view
[Cloud Footprint Insights](/en/api-reference/endpoint/companies/cloud_footprints_insights) takes one `domain_search_id` and returns the whole picture for that company: totals, its leading providers, countries and regions, a weekly series of newly observed infrastructure, and the most recent additions. Use it for a company detail page; use search to build a list.
## Watch for changes
Cloud footprint changes surface as expansion signals, so a monitor can push them to a webhook or an email as they happen. `DNS` is the cloud footprint signal type:
```json theme={null}
{
"signal_types": ["expansions"],
"signal_filters": [
{ "signal_type": "expansions", "filters": { "tos": ["DE"], "signal_types": ["DNS"], "window_days": 30 } }
]
}
```
Every delivery carries `evidence_url`. Raw infrastructure detail is never included. See [Setting up webhooks](/en/developer-guides/setting-up-webhooks).
## Things worth knowing
* A company that runs in two countries counts in both country breakdowns, so the breakdowns can sum to more than the totals. That is per-market truth, not double counting.
* `is_cross_border` is `null` when the company has no known headquarters — that is unknown, not domestic.
* Ranges take `[min, max]` and accept `null` on either side for an open bound.
* From company search, `cloud_footprint_country_activity` scopes bounds to one country (`{"country":"DE","host_count":[100,null]}`); the flat `cloud_footprint_host_count` is the company total and cannot express that.
## Related
Every parameter and response field.
Totals, providers, regions and weekly change for one company.
Find companies by their cloud footprint on Company Search.
Push cloud footprint changes to a webhook or email.
# Job Search
Source: https://docs.pubrio.com/en/developer-guides/search/job-search
Find open job postings by company, title, function, seniority, country and launch date — and read the classification Pubrio adds to every posting.
[Job Search](/en/api-reference/endpoint/companies/job_search) returns open job postings Pubrio has captured, one row per posting, each linked to the company that published it. Every row carries the raw posting (title, location, URL, publisher date) plus three fields Pubrio derives from the title: `functions`, `seniority_rank` and `location_id`.
```bash theme={null}
curl -X POST https://api.pubrio.com/companies/jobs/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com"],
"seniority_ranks": [4, 5],
"launch_dates": ["2026-08-01", "2026-08-31"],
"per_page": 25
}'
```
## When to use it
* **Hiring signals for one account** — pass the company and read what they are hiring for, where, and at what level.
* **Prospecting by role** — search a country for companies opening senior engineering or sales roles, then jump to [People Search](/en/api-reference/endpoint/people/search) with the `domain_search_id` from each row.
* **Incremental sync** — poll with `created_at` set to the newest ingestion time you have stored.
If you want a running tally rather than rows, use [Job Insights](/en/api-reference/endpoint/companies/job_insights). If you want to be told when a company posts, create a [Monitor](/en/developer-guides/examples/tracking-job-postings) with `signal_types: ["jobs"]`.
## Scope to a company
The fastest searches name the company. All three identifiers resolve to the same record and can be mixed:
| Key | Value | Notes |
| --------------- | --------------------------------------------- | ----------------------------------------------------------------------- |
| `domains` | `["stripe.com"]` | URLs such as `https://www.stripe.com/jobs` are normalised to the domain |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` | Company pages only |
| `companies` | `["5378845d-7726-4817-aba9-ced8c5f41dee"]` | `domain_search_id` from any earlier response |
Searches without a company are allowed — `{"locations": ["SG"], "seniority_ranks": [5]}` works — but they count against the whole index. `total_entries` is then an estimate and `is_timeout` may be `true` on very broad filters.
## Filters
### Text
| Key | Type | Matches |
| -------------- | ---------- | ---------------------------------------------------------------------------------------------------------- |
| `titles` | `string[]` | Job titles. Word-level match, so `["engineer"]` also returns `Senior Software Engineer`. Any listed title. |
| `search_term` | `string` | Free text against the posting title. |
| `search_terms` | `string[]` | Several free-text terms, any of which may match. |
### Classification
| Key | Type | Matches |
| ----------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `functions` | `string[]` | Function slugs derived from the title: `engineering`, `sales`, `marketing`, `finance`, `product_management`, … Any listed slug. See [Job functions](/en/api-reference/enums#job-functions). |
| `seniority_ranks` | `integer[]` | `1` junior · `2` senior · `3` manager · `4` director · `5` executive. See [Seniority ranks](/en/api-reference/enums#seniority-ranks). |
The two behave differently on bad input. An unknown `functions` slug returns **zero** rows. A `seniority_ranks` value outside 1–5 is **ignored** and returns every row. Neither raises an error.
### Dates
| Key | Type | Matches |
| -------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `launch_dates` | `[from, to]` | The posting's launch date — `posting_date` when the publisher gives one, otherwise the day Pubrio first saw it. UTC day boundaries; reconciles with Job Insights, so **use this by default.** |
| `posted_dates` | `[from, to]` | `posting_date` only. Day boundaries follow your workspace timezone. |
| `created_at` | date or ISO timestamp | Ingested at or after this instant (UTC). Pass the exact `created_at` of your newest stored row for incremental polling. |
Both windows are inclusive. `launch_dates` with one element matches that single day.
### Location
| Key | Type | Matches |
| ------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `locations` | `string[]` | Posting country, ISO alpha-2. |
| `exclude_locations` | `string[]` | Posting country to leave out. |
| `location_ids` | `integer[]` | Posting country by Pubrio `location_id`, the same numbers the [Locations](/en/api-reference/endpoint/locations/locations) endpoint and every row's `location_id` carry. |
| `company_locations` | `string[]` | Country of the **company headquarters**, which can differ from where the job is. |
### Paging and order
| Key | Default | Notes |
| -------------------- | ------- | ---------------------------------------------------------------------------------------- |
| `per_page` | 25 | Capped by your plan's `max_search_per_page`. |
| `page` | 1 | Capped by `max_search_page`; the response's `total_display_pages` tells you the ceiling. |
| `is_ascending_order` | `false` | Rows are ordered by `created_at`, newest first. `true` flips to oldest first. |
## What a row looks like
```json theme={null}
{
"job_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
"job_search_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
"created_at": "2026-08-30T00:02:52.531Z",
"last_modified": "2026-09-01T16:08:09.324Z",
"title": "Finance and Strategy Partner",
"job_url": "https://www.linkedin.com/jobs/view/4460586030",
"location": "United States",
"location_id": 357,
"country": "United States",
"country_code": "US",
"posting_date": "2026-08-29",
"source_type": "linkedin",
"functions": ["consulting"],
"seniority_rank": 5,
"base_salary": null,
"experience_requirement": null,
"education_requirement": null,
"employment_type": null,
"companies": {
"domain_search_id": "5378845d-7726-4817-aba9-ced8c5f41dee",
"company_name": "Stripe",
"linkedin_name": "stripe",
"country_code": "US",
"company_url": "https://stripe.com/",
"domain": "stripe.com",
"logo_url": "https://buckets.pubrio.com/company-logo/....jpg"
}
}
```
* `functions` is `null` and `seniority_rank` is `0` when the title could not be classified. Filter on them anyway — unclassified rows simply do not match.
* `posting_date` is the publisher's date; `created_at` is when Pubrio first saw the posting and is the default sort key.
* `job_id` and `job_search_id` are the same value; pass either to [Job Lookup](/en/api-reference/endpoint/companies/job_lookup).
### Read `metadata` before trusting a result
```json theme={null}
"metadata": {
"profile": null,
"filters": { "domains": ["stripe.com"], "seniority_ranks": [4, 5], "per_page": 25, "language": "en" },
"ignored_fields": []
}
```
`ignored_fields` lists any body key the endpoint did not recognise. A typo such as `"seniorty_ranks"` does not fail the request — it silently widens it. Check this array is empty in anything automated.
## Recipes
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/jobs/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com", "adyen.com", "checkout.com"],
"functions": ["engineering", "data_science"],
"seniority_ranks": [3, 4, 5],
"launch_dates": ["2026-08-05", "2026-09-04"],
"per_page": 25
}'
```
```python Python theme={null}
import os, requests
r = requests.post(
"https://api.pubrio.com/companies/jobs/search",
headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"], "Content-Type": "application/json"},
json={
"domains": ["stripe.com", "adyen.com", "checkout.com"],
"functions": ["engineering", "data_science"],
"seniority_ranks": [3, 4, 5],
"launch_dates": ["2026-08-05", "2026-09-04"],
"per_page": 25,
},
)
body = r.json()
assert body["metadata"]["ignored_fields"] == []
for job in body["data"]["jobs"]:
print(job["companies"]["company_name"], "-", job["title"], job["seniority_rank"])
```
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/jobs/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"locations": ["SG"],
"functions": ["sales", "business_development"],
"seniority_ranks": [4, 5],
"launch_dates": ["2026-08-01", "2026-09-04"],
"per_page": 25
}'
```
Group the rows by `companies.domain_search_id` — each distinct company is a prospect, and the id goes straight into `companies` on [People Search](/en/api-reference/endpoint/people/search).
```python Python theme={null}
import os, requests
API = "https://api.pubrio.com/companies/jobs/search"
HEADERS = {"pubrio-api-key": os.environ["PUBRIO_API_KEY"]}
def sync(domains, since):
"""Fetch every posting ingested at or after `since` (ISO timestamp). Returns the new cursor."""
newest = since
page = 1
while True:
body = requests.post(API, headers=HEADERS, json={
"domains": domains, "created_at": since, "page": page, "per_page": 25,
}).json()
rows = body["data"]["jobs"]
if not rows:
break
for job in rows: # newest first
newest = max(newest, job["created_at"])
print(job["job_id"], job["title"]) # upsert into your store here
if page >= body["data"]["pagination"]["total_display_pages"]:
break
page += 1
return newest
cursor = sync(["stripe.com"], "2026-09-01T00:00:00Z")
# persist `cursor` and pass it as `since` on the next run
```
The cursor is the full `created_at` of the newest row you stored, so only that one row is re-delivered on the next run. Upsert on `job_id`. Rows arrive newest-first, so a busy day never pushes the cursor past your plan's page cap.
## Related
Every parameter and response field.
Counts by function, seniority, country and week for one company.
Seniority ranks and the full job-function vocabulary.
Get a webhook instead of polling.
# News Search
Source: https://docs.pubrio.com/en/developer-guides/search/news-search
Find news about companies by category, country, language and date, with every article linked to the companies it mentions — and optionally to the expansion signals it produced.
[News Search](/en/api-reference/endpoint/companies/news_search) returns news articles Pubrio has classified, one row per article. Each row links to **every** company the article mentions, carries a category slug (`acquires`, `partners_with`, `receives_financing`, …) and, on request, the expansion signals the article produced.
```bash theme={null}
curl -X POST https://api.pubrio.com/companies/news/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com"],
"categories": ["partners_with", "launches"],
"published_dates": ["2026-08-01", "2026-09-04"],
"per_page": 25
}'
```
## When to use it
* **Account intelligence** — what happened to a company this month, categorised.
* **Trigger-based prospecting** — every company that announced funding or an acquisition in a country and language you sell in.
* **Signal evidence** — with `is_expansion_signal_available: true`, see which articles produced which [expansion signals](/en/knowledge-base/concepts/expansion-signals).
For counts and category breakdowns use [News Insights](/en/api-reference/endpoint/companies/news_insights). To be notified as articles arrive, create a Monitor with `signal_types: ["news"]`.
## Scope to a company
| Key | Value | Notes |
| --------------- | --------------------------------------------- | --------------------------------------------------------------------- |
| `domains` | `["stripe.com"]` | Matches articles that mention the company, not only articles about it |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` | Company pages only |
| `companies` | `["5378845d-…"]` | `domain_search_id` values |
A search without a company works — `{"categories": ["acquires"], "locations": ["SG"]}` — and returns the whole index for that category, newest first.
## Filters
### Category and gallery
| Key | Type | Matches |
| ------------------ | ---------- | --------------------------------------------------------------------------------------------------- |
| `categories` | `string[]` | Category slugs from [News Categories](/en/api-reference/endpoint/news/categories). Any listed slug. |
| `news_galleries` | `string[]` | Gallery slugs from [News Galleries](/en/api-reference/endpoint/news/galleries). |
| `news_gallery_ids` | `uuid[]` | The same galleries by id. |
| `news_languages` | `string[]` | ISO 639-1 codes from [News Languages](/en/api-reference/endpoint/news/languages). |
### Text
| Key | Type | Matches |
| -------------- | ---------- | --------------------------------------------------------------- |
| `search_term` | `string` | Free text against title and summary, in any supported language. |
| `search_terms` | `string[]` | Several terms, any of which may match. |
### Dates
| Key | Type | Matches |
| ----------------- | --------------------- | ---------------------------------------------------------------------------------- |
| `published_dates` | `[from, to]` | Publication date window, inclusive. Day boundaries follow your workspace timezone. |
| `published_at` | date or ISO timestamp | Published at or after this instant, compared in UTC. |
### Location
| Key | Type | Matches |
| ------------------- | ---------- | ---------------------------------------------------------------- |
| `locations` | `string[]` | Countries the article is **about** (`country_codes` on the row). |
| `company_locations` | `string[]` | Headquarters country of a mentioned company. |
### Expansion signals
| Key | Type | Matches |
| ------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- |
| `is_expansion_signal_available` | `boolean` | Attach `expansion_signals` to each row and enable the two filters below. Leave off for the fastest search. |
| `expansion_signal_types` | `string[]` | `HIRE`, `PARTNER`, `PRODUCT`, `SCALE`, … Requires the flag above. |
| `expansion_signal_polarities` | `string[]` | `expansion`, `contraction_leading`, `contraction_confirming`, `contraction_lagging`. |
### Paging and order
| Key | Default | Notes |
| -------------------- | ------- | ----------------------------------------------------------------------------------------------------- |
| `per_page` / `page` | 25 / 1 | Plan-capped; see `total_display_pages`. |
| `is_ascending_order` | `false` | Rows are ordered by `published_at` newest first, undated articles last. `true` flips to oldest first. |
## What a row looks like
```json theme={null}
{
"news_id": "76886b56-3418-476a-a531-fff18deb29db",
"news_search_id": "4d950aea-e2bb-4367-869b-c34e834a82ec",
"title": "PayPal Rejects Takeover, Rated Buy",
"summary": "…",
"url": "https://seekingalpha.com/article/4942660-…",
"source": "seekingalpha.com",
"image_url": "https://static.seekingalpha.com/…",
"language": "en",
"published_at": "2026-09-03T08:54:21.000000Z",
"last_modified": "2026-09-03T09:20:55.189Z",
"category": "receives_financing",
"news_category_name": "Funding Announcements",
"news_galleries": [{ "news_gallery_id": "342f2eb1-…", "slug": "general-business", "name": "General Business" }],
"country_codes": null,
"company_country_codes": ["US"],
"locations": null,
"domains": ["paypal.com", "stripe.com"],
"companies": [
{ "domain_search_id": "5378845d-…", "company_name": "Stripe", "domain": "stripe.com", "country_code": "US", "…": "…" },
{ "domain_search_id": "b03b312a-…", "company_name": "PayPal", "domain": "paypal.com", "country_code": "US", "…": "…" }
]
}
```
* `companies` and `domains` are parallel arrays and list **every** mentioned company, so a search scoped to `stripe.com` can return an article whose main subject is PayPal. Filter client-side on `domains` if you need articles where your company is the subject.
* `country_codes` is what the article is about; `company_country_codes` is where the mentioned companies are based. `locations` filters the first.
* `news_category_name` is localised to the request `language`; `category` is the stable slug.
* With `is_expansion_signal_available: true` each row gains `expansion_signals: [{ signal_type_slug, signal_strength_slug, polarity, country_code, domain_search_id, event_date }]`.
### `metadata.ignored_fields`
Any body key the endpoint does not recognise is dropped and listed here. `"categorys"` returns the whole index with `ignored_fields: ["categorys"]`, not an error.
## Recipes
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/news/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"categories": ["receives_financing"],
"news_languages": ["ja"],
"published_dates": ["2026-08-01", "2026-09-04"],
"per_page": 25
}'
```
```bash cURL theme={null}
curl -X POST https://api.pubrio.com/companies/news/search \
-H "pubrio-api-key: $PUBRIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com"],
"is_expansion_signal_available": true,
"expansion_signal_types": ["HIRE", "PARTNER", "PRODUCT", "OFFICE"],
"expansion_signal_polarities": ["expansion"],
"per_page": 25
}'
```
Every row now explains a signal you would otherwise only see as a stage on [Company expansion detail](/en/api-reference/endpoint/expansions/company_lookup).
```python Python theme={null}
import os, requests
from datetime import datetime, timedelta, timezone
since = (datetime.now(timezone.utc) - timedelta(days=1)).strftime("%Y-%m-%dT%H:%M:%SZ")
body = requests.post(
"https://api.pubrio.com/companies/news/search",
headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"]},
json={"domains": ["stripe.com", "adyen.com"], "published_at": since, "per_page": 25},
).json()
for a in body["data"]["news"]:
subjects = ", ".join(c["company_name"] for c in a["companies"])
print(f'[{a["category"]}] {a["title"]} — {subjects}')
```
`published_at` is compared in UTC, so a rolling 24-hour timestamp is safer than a calendar date.
## Related
Every parameter and response field.
Mentions, topics and sources for one company over a window.
The category slugs you can filter on.
What a signal type and polarity mean.
# Clay Integration
Source: https://docs.pubrio.com/en/knowledge-base/case-studies/clay-integration
Enrich global leads and uncover the hidden 70% of the market by combining Clay with Pubrio.
# Clay x Pubrio: The Glocal Data Engine
Combine the orchestration power of **Clay** with the global depth of **Pubrio**. While standard data providers focus on the "visible 30%" of the economy (mostly well-known tech companies and US-centric networks), the Clay x Pubrio integration allows you to tap into the **invisible 70%**.
This is the long tail of real-world businesses, regional champions, and local powerhouses that sit outside mainstream datasets - whether they are in Europe, Latin America, or anywhere else in the global market.
## Partners in Coverage
**The Workflow Orchestrator.**
Clay enables you to build automated outbound campaigns by connecting 50+ data providers. It is the engine that drives your Go-To-Market logic.
**The Global Data Layer.**
Pubrio connects localized business, people, and intent signals into a single global graph. We provide the "ground truth" data for the markets that standard providers miss.
## Why add Pubrio to your stack?
Top revenue teams use Pubrio alongside their existing providers to maximize their Total Addressable Market (TAM).
### 1. Complete Market Coverage
No single provider sees the whole economy. By adding Pubrio to your Clay waterfall, you ensure comprehensive coverage.
* **Standard Providers:** Best for Venture-backed startups, SaaS, and North American markets.
* **Pubrio:** Best for "Real World" industries (Logistics, Manufacturing, Retail) and global markets (e.g. LATAM, EMEA, APAC).
* **Result:** You get the best of both worlds, ensuring high match rates regardless of where your prospect is located.
### 2. High-Fidelity AI Context
Clay’s AI Agent thrives on specific details. Pubrio provides structured, localized context—such as verified local headcount, regional technology usage, and native-language intent signals. This allows your AI to draft messages that feel "native" to the prospect, increasing trust and reply rates.
***
## Integration Guide
You can access Pubrio directly within Clay. Choose the setup that matches your plan.
Best for teams who want to get started immediately without a separate Pubrio contract.
Open your Clay table and click the **"Add Enrichment"** button.
Search for **"Pubrio"** in the list and select the integration card.
Select your action (e.g., **Enrich Company**), map your **Domain** column, and run.
*Note: This will deduct credits from your Clay balance.*
Best for high-volume users who have a direct enterprise plan with Pubrio.
Navigate to your Pubrio dashboard, go to **Settings > API**, and copy your secret key.
In your Clay table, click **"Add Enrichment"** and search for **"Pubrio"**.
Inside the Pubrio integration panel, click on the account dropdown and select **"Manage Accounts"** or **"Add New Account"**.
Paste your Pubrio API key into the field. You can now run enrichments using your direct Pubrio quota instead of Clay credits.
**Mapping Tip:** For both methods, you only need to map the **Company Domain** or **LinkedIn URL**. Pubrio automatically handles identity resolution across global markets.
***
## Example Use Cases
How are teams using this integration to drive revenue?
### 1. The "Global Waterfall"
**Objective:** Ensure maximum enrichment rates for inbound leads.
* **Workflow:** When a lead enters Clay, first check your standard provider. If the result is low confidence or missing data (common for non-US leads), automatically trigger Pubrio via the waterfall logic.
* **Benefit:** You maintain speed and cost-efficiency while ensuring you never miss a valid opportunity from an international market or offline industry.
### 2. Localized Outreach at Scale
**Objective:** Personalize outbound to non-English speaking regions.
* **Workflow:** Use Pubrio to identify a company's local technology stack and hiring trends.
* **Action:** Pass this data to Clay's AI Agent with a prompt to *"Draft an intro email in \[Local Language] referencing their recent hiring of \[Role] and use of \[Tech Stack]."*
* **Benefit:** Demonstrates deep research and local relevance, significantly outperforming generic English blasts.
***
## Join the Ecosystem
Clay is one example of what’s possible when you build on top of the Pubrio Data Layer. Whether you are a brand looking to expand globally or a platform looking to empower your users, we are built to integrate.
**Start using Pubrio x Clay.**
Log in to Clay today to start finding your "Blue Ocean" opportunities in the global market.
**Build with Pubrio.**
Building an AI agent, CRM, or data platform? Integrate our API to give your users access to the "Invisible 70%" of the global economy.
# Databar Integration
Source: https://docs.pubrio.com/en/knowledge-base/case-studies/databar-integration
Enrich your Databar spreadsheets with glocal intelligence from Pubrio.
# Pubrio x Databar: No-Code Global Intelligence
Combine the accessibility of **Databar** with the depth of **Pubrio**.
Databar makes it easy to connect to thousands of APIs without code. By integrating Pubrio, you turn your Databar spreadsheets into powerful global research engines, capable of uncovering the **"Invisible 70%"** of the economy - the local champions and real-world businesses that standard API providers often overlook.
## The Power Pair
**The API Hub.**
Databar allows you to query external APIs directly within a spreadsheet interface. It removes the technical barrier to accessing data.
**The Global Source.**
Pubrio provides the specialized "Glocal" data—covering 50+ local sources across NA, LATAM, APAC, and EMEA - that powers your research.
## Why add Pubrio to your table?
Databar gives you access to many standard data providers. Pubrio is the layer you add when you need to go deeper or wider.
### 1. Research Without Borders
Standard enrichment APIs often return empty cells (`N/A`) when queried with non-US domains.
* **The Fix:** Connect Pubrio to your Databar table to fill in the blanks. We aggregate local registries and regional signals, ensuring your market research includes the high-growth companies in emerging markets that others miss.
### 2. High-Fidelity Signal Discovery
If you are using Databar for investment research or competitive analysis, generic industry tags aren't enough.
* **The Fix:** Pubrio delivers granular, localized signals. Instead of just "Software," see "Fintech Payment Gateway in Jakarta." Instead of generic "Hiring," see "Expanding Sales Team in Brazil."
***
## Integration Guide
You can connect Pubrio to Databar using our pre-configured connector or via a custom API connection.
The fastest way to enrich. Use the official Pubrio provider listed in the Databar library.
In your Databar table, click on **"Enrich"** or **"Add Column"**.
Search the provider library for **"Pubrio"** and select it.
Enter your Pubrio API Key.
*(Get this from your Pubrio Dashboard > Settings > API).*
Select the **"Enrich Company"** endpoint. Map your table's **Domain** column to the Pubrio input and click **Run**.
Use this if you need to hit a specific Pubrio endpoint not listed in the standard library.
Click **"Add Source"** and select **"Custom API"**.
* **Method:** `POST`
* **URL:** `https://api.pubrio.com/companies/lookup/enrich`
* **Auth:** Select "API Key" and paste your Pubrio API Key.
In the JSON body, insert dynamic references to your table columns:
```json theme={null}
{
"domain": ""
}
```
Run a test request. Databar will display the JSON response. Select the fields you want to save (e.g., `revenue_range`, `tech_stack`) as new columns.
***
## Use Cases
### 1. Emerging Market Deal Sourcing
**User:** VC Associates & PE Analysts.
**Goal:** Find "Hidden Champions"—companies in Southeast Asia or LATAM that are significant in size but under the radar.
* **Workflow:**
1. Upload a list of local conference attendees or regional award winners to Databar.
2. Use Pubrio to enrich these obscure domains with **Verified Local Headcount** and **Tech Stack**.
3. Filter the table to identify high-value targets (e.g., Companies with >50 employees using sophisticated tech like Salesforce or AWS) and export to your CRM.
### 2. Cleaning "Messy" Global Lists
**User:** RevOps & Marketing Managers.
**Goal:** Fix a CRM export full of missing fields for international leads.
* **Workflow:**
1. Import a CSV of leads with only "Company Name" and "Country."
2. Run Pubrio's **"Enrich"** endpoint.
3. Pubrio uses the country hint to correctly identify the local entity and populates missing data like **Decision Maker Emails** and **Local Business IDs**.
***
## Join the Data Ecosystem
Whether you are building a one-off research report or a recurring automated workflow, Pubrio ensures you have the global context to make the right decisions.
**Open Databar.**
Connect Pubrio and start enriching your spreadsheets today.
**Get Pubrio Access.**
Sign up to get your API key and unlock the invisible 70% of the market.
# Ottokit Integration
Source: https://docs.pubrio.com/en/knowledge-base/case-studies/ottokit-integration
Fuel your autonomous agents with the ground-truth data they need to navigate the global economy.
# Ottokit x Pubrio: The Intelligent Agent Stack
Combine the autonomous execution of **Ottokit** with the glocal intelligence of **Pubrio**.
AI Agents are only as good as the data that guides them. While Ottokit provides the "hands" to execute complex outreach and workflows, Pubrio provides the "eyes" - giving your agents visibility into the **invisible 70%** of the global market that standard datasets miss.
## Partners in Autonomy
**The Execution Engine.**
Ottokit orchestrates autonomous workflows, handling everything from lead routing to complex multi-channel engagement. It is the "Agent" that does the work.
**The Intelligence Layer.**
Pubrio feeds the agent with structured, verified data from 50+ global sources. We ensure the agent knows *who* to contact and *what* to say, even in hard-to-reach markets.
## Why integrate Pubrio?
Autonomous agents often fail when they hit the "Coverage Cliff" - the moment they step outside well-known US tech companies. Pubrio solves this.
### 1. Eliminate "Agent Hallucinations"
When an AI agent lacks data, it guesses. This is dangerous in B2B sales.
* **Without Pubrio:** An agent might assume a Brazilian manufacturing firm is "inactive" because they aren't on LinkedIn.
* **With Pubrio:** The agent sees the "Ground Truth" - verified local tax id, active hiring signals, and real-time revenue data—allowing it to engage with confidence.
### 2. The "Polyglot" Advantage
Ottokit is powerful enough to engage globally, but it needs local context to be effective. Pubrio enables true **Glocalization**:
* **Context:** We provide local intent signals (e.g., "Expanding to Vietnam") translated into structured formats.
* **Action:** Your Ottokit agent can use this data to switch languages, reference local competitors, and respect regional business norms automatically.
***
## Integration Guide
Connect Pubrio to Ottokit to start enriching your agent's memory bank.
Ottokit has built-in support for Pubrio's data layer.
In your Ottokit dashboard, navigate to **Settings > Integrations**.
Find the **Pubrio** card under "Data Providers" and click **Connect**.
Enter your Pubrio API Key.
*You can find this in your Pubrio Dashboard under **Settings > API**.*
Set when Ottokit should call Pubrio.
* **Example:** "Enrich new lead" or "Verify account before outreach."
For advanced agent workflows, call Pubrio directly within an Ottokit custom step.
In your Ottokit workflow builder, add a **"HTTP Request"** node.
* **Method:** `POST`
* **URL:** `https://api.pubrio.com/companies/lookup/enrich`
* `pubrio-api-key`: `YOUR_PUBRIO_API_KEY`
* `Content-Type`: `application/json`
Map the agent's current target to the payload:
```json theme={null}
{
"domain": "{{agent.current_lead.domain}}"
}
```
***
## Use Cases
### 1. The "Self-Correcting" Outbound Agent
**Goal:** Prevent wasted emails to invalid or low-fit accounts.
* **Scenario:** Ottokit identifies a list of 1,000 potential leads.
* **The Check:** Before sending, the agent pings Pubrio.
* **The Pivot:**
* *If Pubrio indicates "High Intent" & "Growing":* Ottokit enters "Aggressive Pursuit" mode.
* *If Pubrio indicates "Downsizing" or "Inactive":* Ottokit moves the lead to "Nurture" and saves your domain reputation.
### 2. Global Territory Expansion
**Goal:** Let your AI agent work regions where your sales team doesn't speak the language.
* **Workflow:** You assign Ottokit to prospect in the DACH region (Germany/Austria/Switzerland).
* **Enrichment:** Pubrio supplies the *local* employee count (often higher than LinkedIn) and the *local* tech stack.
* **Execution:** Ottokit drafts the email in German, referencing the specific local ERP system Pubrio detected, significantly increasing credibility.
***
## Build the Future of Work
**Deploy the stack.**
Connect Pubrio to Ottokit today and watch your agents start closing deals in markets you didn't know existed.
**Extend the integration.**
Want to build deeper workflows? Check out the full Pubrio API documentation to see what else you can feed your agents.
# Stripo Integration
Source: https://docs.pubrio.com/en/knowledge-base/case-studies/stripo-integration
Push responsive templates from Stripo directly into your Pubrio Sequences.
# Stripo x Pubrio: The Design-to-Sequence Pipeline
Bridge the gap between **Stripo's** creative studio and **Pubrio's** execution infrastructure.
This integration allows you to operationalize your design assets instantly. Instead of manually moving HTML files, you can push templates directly from Stripo into your Pubrio **Sequences**, ensuring your automated flows always utilize the most up-to-date, responsive designs.
## The Tech Stack
**The Design Layer.**
Stripo enables the creation of complex, responsive HTML email modules without code. It is where the visual asset is born.
**The Sequence Engine.**
Pubrio acts as the delivery infrastructure. We ingest the template and orchestrate the localized delivery based on your Sequence logic and data triggers.
## Why connect the two?
Treat email design as part of your automated CI/CD pipeline.
### 1. Zero-Friction Handoffs
Eliminate the manual download-and-upload cycle that slows down operations.
* **The Manual Way:** Export ZIP -> Extract -> Copy HTML -> Paste into Editor.
* **The Automated Way:** Click "Export to Pubrio" in Stripo. The template is instantly available as a resource in your Pubrio **Sequence Library**, ready for activation.
### 2. Data-Driven Rendering
Pubrio’s engine allows for "Headless" personalization within the visual design.
* **Dynamic Injection:** Embed Pubrio variables (e.g., `{{company.tech_stack}}`, `{{person.location}}`) directly into Stripo text blocks.
* **Execution:** When the Sequence triggers, Pubrio resolves these variables in real-time using our global data graph, ensuring the rendered email is contextually accurate for every recipient.
***
## Configuration Guide
Set up the pipeline once to enable continuous template syncing.
In your Pubrio workspace, navigate to **Settings > API & Integrations**. Generate a new key specifically for the Stripo connector.
Open any template in the Stripo editor and click **Export**.
1. Select **"Pubrio"** from the integration list.
2. Input your **API Key**.
3. Label the connection (e.g., "Prod Sequences").
Click **Export**. The system will transfer the HTML code and hosted images to Pubrio’s asset manager.
Inside Pubrio, open your **Sequences**. When defining an email step, select **"Load from Library"** and choose the template you just synced.
**Pro Tip:** If you update a design in Stripo, simply re-export it. You can choose to overwrite the existing asset in Pubrio, instantly updating any live Sequences using that template.
***
## Operational Use Cases
### 1. Automated Customer Onboarding
**Goal:** Deliver high-fidelity welcome emails triggered by app usage.
* **Design:** Product team builds a visual "Getting Started" guide in Stripo.
* **Logic:** A Pubrio Sequence triggers when a new user signs up.
* **Execution:** Pubrio grabs the latest Stripo design, injects the user's specific account details, and executes the delivery step.
### 2. Dynamic Platform Notifications
**Goal:** Send localized alerts based on business signals.
* **Design:** Marketing builds a modular alert template in Stripo.
* **Logic:** Pubrio detects a "Buying Signal" (e.g., a prospect installs a competitor's tech).
* **Execution:** The Sequence automatically dispatches the alert email to the account owner, using the Stripo template to present the data in a clean, branded format.
***
## Build Your Pipeline
**Create Asset.**
Design your template and push it to the engine.
**Open Pubrio.**
Map your new template to a Sequence step and go live.
# What a Company Profile Contains
Source: https://docs.pubrio.com/en/knowledge-base/concepts/company-intelligence
The five real-time layers Pubrio builds around every company — hiring, tech stack, ad activity, news, and people — and which endpoint returns each one.
A company record in Pubrio is more than a firmographic card. Alongside its expansion stage, five live activity layers build up a working picture of what a company is actually doing right now — who it's hiring, what it runs, where it's advertising, what's being written about it, and who works there.
Each layer answers a different question, and each is backed by its own endpoint — so you can pull just the layer you need, or read them together for full context on an account.
## Hiring Activity
Open roles, by function, location, and seniority — plus the pace of hiring versus the prior period. A sudden spike in one location is often the earliest sign of a market move.
Pull this with [Company Job Search](/en/api-reference/endpoint/companies/job_search) or [Company Job Insights](/en/api-reference/endpoint/companies/job_insights) for the aggregate view.
## Technology Stack
The tools a company runs — advertising platforms, analytics, and more — each with the date it was first and most recently detected, so you can tell an active tool from an abandoned one.
Pull this with [Company Technology Lookup](/en/api-reference/endpoint/companies/technology_lookup).
## Ad Activity
Active campaigns, the markets they target, and the channels and formats a company is spending on — with the creatives themselves.
Pull this with [Company Advertisement Search](/en/api-reference/endpoint/companies/advertisements_search) or [Company Advertisement Insights](/en/api-reference/endpoint/companies/advertisements_insights) for the aggregate view.
## News Coverage
Press mentions, by topic and by market — funding, launches, hires, and more — so you can see what's being said about a company without reading every article yourself.
Pull this with [Company News Search](/en/api-reference/endpoint/companies/news_search) or [Company News Insights](/en/api-reference/endpoint/companies/news_insights) for the aggregate view.
## People
Everyone Pubrio has found at the company, with title, location, and direct contact channels — the layer that turns "this account is moving" into an actual person to reach.
Pull this with [People Search](/en/api-reference/endpoint/people/search), scoped to a company.
## Reading it together
None of these layers is the full picture alone. A hiring spike plus a fresh ad push in the same market is a stronger signal than either on its own — and that combined read is exactly what powers a company's [expansion stage](/en/knowledge-base/concepts/how-expansion-signals-work). Start there for the "is this company moving" question; come back to these five layers for the "what does that look like in detail" answer.
How these activity layers roll up into a stage, a momentum, and a score.
Get the full firmographic record for a company in one call.
# Creating and Managing Sequences
Source: https://docs.pubrio.com/en/knowledge-base/concepts/create-sequence
Learn how to create, customize, and manage outreach sequences to engage your prospects effectively.
A **Sequence** in Pubrio is a planned series of outreach steps—such as emails, SMS, and LinkedIn actions—delivered over time to engage your prospects consistently and efficiently. Sequences help you automate follow-ups, nurture leads, and increase your chances of meaningful conversations and conversions.
## Why Use Sequences?
Sequences eliminate guesswork by scheduling your outreach activities at the right intervals, ensuring no prospect is missed or forgotten. They help standardize best practices across your team and provide clear visibility into campaign performance for continuous optimization.
## How to Create a Sequence
1. Navigate to the **Sequences** section from the main menu.
2. Click **Create Sequence** to start a new sequence.
3. Add steps to your sequence. You can combine various step types such as emails, SMS, and LinkedIn actions.
4. **Remember to add a trigger** — this defines how and when your sequence starts for each contact. Without a trigger, the sequence won’t begin automatically.
5. Configure timing for each step using two types of controls:
Delay controls how long to wait after a contact enters the sequence before executing the step. This ensures a paced outreach cadence.
Monitor waits until specific conditions are met before moving to the next step, allowing the sequence to adapt based on prospect behavior or other triggers.
6. Review and save your sequence.
***
## Setting Conditions
Conditions make your sequences smarter by controlling when steps execute based on prospect behavior or other criteria.
### Monitoring Preferences
After performing certain actions, you often want to monitor the prospect’s behavior before moving on. For example, if you send an email and want to follow up only if the prospect hasn’t replied yet, you configure monitoring preferences accordingly.
> **Example:**\
> To send a follow-up only if the target has **not replied** to the previous email, set the monitoring preference to wait for a reply.\\
>
>
>
> ⚠️ Be careful with logical conditions: If you want to monitor "opened email but no reply," you must ensure the monitoring preference and node condition align correctly. Since "opened email = true" and "no reply" is also true, the system might interpret this as already satisfied.
>
To fix this, either set monitoring preference to false or adjust the condition logic to explicitly check for "replied = true".
>
>
### Exception Handling
Sometimes, actions fail due to reasons like expired credentials or system errors. Instead of stopping the entire sequence, you can configure exception handling to decide what happens next when an action errors out.
* Specify which condition should apply if the previous step fails.
* This ensures the sequence continues smoothly, avoiding interruptions in your outreach.
## Versioning in Sequences
Pubrio supports multiple versions of a sequence, enabling:
* Testing different messaging or step orders.
* Running A/B tests to optimize outreach.
* Managing and switching between versions easily.
Each version can have its own steps and timing, giving you flexibility to refine your approach.
Default Version & New Targets
Sequence version has an option called **Set as Default**. This setting controls how new targets are added and how the sequence behaves:
* When a sequence version is set as **default**, any newly added target will automatically enter this version of the sequence.
* Targets who were added to earlier versions before the default change will continue executing their original version based on when they joined.
* This allows you to update your outreach strategy without disrupting ongoing sequences for existing contacts.
Setting the default version ensures smooth transitions when you update or improve your sequence, while preserving the experience of contacts already in progress.
## Managing Your Sequences
* **Activate/Deactivate**: Launch your sequence when ready; pause or stop as needed.
* **Clone Sequences**: Duplicate existing sequences to reuse successful outreach workflows.
# Using the Expansion API
Source: https://docs.pubrio.com/en/knowledge-base/concepts/expansion-api-quickstart
Authenticate, make your first Expansion API calls, paginate results, and read expansion scores.
This quickstart gets you from zero to reading live expansion signals in a few calls. It assumes you already have a Pubrio API key — see [Authentication](/en/api-reference/authentication) to create one.
## Prerequisites
* A Pubrio API key (see [Authentication](/en/api-reference/authentication)).
* A company's `domain_search_id`. You can get one from the [Company Search](/en/api-reference/endpoint/companies/search) endpoint.
All Expansion endpoints are `POST` and accept a JSON body. Include your credentials on every request as described in [Authentication](/en/api-reference/authentication).
## Step 1 — Look up a company's expansion
Start with a single company and list every market it is expanding into.
```bash theme={null}
POST /expansions/companies/lookup
{ "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "is_all_markets": true }
```
```json theme={null}
{
"metadata": { "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "home_country_code": "US" },
"data": { "market_count": 2, "dominant_stage_slug": "expanding", "total_signal_count": 194 },
"markets_summary": [
{ "country_code": "GB", "stage_slug": "expanding", "is_home_market": false, "signal_count": 140, "distinct_type_count": 6, "latest_signal_at": "2026-07-08T02:42:23.544Z", "rank_now": 1 },
{ "country_code": "DE", "stage_slug": "committing", "is_home_market": false, "signal_count": 54, "distinct_type_count": 3, "latest_signal_at": "2026-06-20T00:00:00.000Z", "rank_now": 2 }
]
}
```
## Step 2 — Read the result
Each entry in `markets_summary` describes one market the company is active in:
* **`stage_slug`** — how far the company has progressed there (`exploring` → `scaling`).
* **`signal_count`** / **`distinct_type_count`** — how much evidence backs the market, across how many signal types.
* **`latest_signal_at`** — recency of the newest signal.
* **`signal_velocity_30d`** / **`signal_velocity_90d`** — how fast activity is picking up.
* **`rank_now`** — the market's current rank for this company (`1` = strongest).
* **`is_home_market`** — whether this is the company's HQ country.
To surface the freshest movers or filter by trajectory, use the discovery endpoints (`freshness`, `momentum`) shown next.
## Step 3 — Explore a whole market
To work market-first instead of company-first, use [Expansion Market Detail](/en/api-reference/endpoint/expansions/market_lookup). It is paginated with the standard `page` / `per_page` parameters.
Geography is a directed **from → to** relationship, expressed with two lists: `froms` (origin / HQ markets) and `tos` (target markets). Pick the pattern that matches your question:
```bash Inbound (into GB) theme={null}
POST /expansions/search
{
"tos": ["GB"],
"freshness": ["fresh", "cooling"],
"page": 1,
"per_page": 25
}
```
```bash Outbound (from CN) theme={null}
POST /expansions/search
{
"froms": ["CN"],
"freshness": ["fresh", "cooling"],
"page": 1,
"per_page": 25
}
```
```bash Corridor (CN → GB) theme={null}
POST /expansions/search
{
"froms": ["CN"],
"tos": ["GB"],
"page": 1,
"per_page": 25
}
```
Read `metadata.pagination` to page through results:
```json theme={null}
{
"metadata": {
"filters": { "tos": ["GB"], "freshness": ["fresh", "cooling"] }
},
"data": {
"pagination": { "page": 1, "per_page": 25, "total_entries": 64, "total_pages": 3 },
"companies": [ /* ... */ ]
}
}
```
Request the next page by incrementing `page`. `per_page` is capped by your plan — explicitly requesting more than your cap returns an error rather than silently truncating.
Two defaults worth knowing:
* **Ordering** — results come back in relevance order (companies corroborated by multiple signal types first, then most recent). Pass `sort_by: "recent"` for pure recency, or `expansion_score` / `signal_count` / `company_ranking`.
* **Lean responses** — API-key responses omit the market rollup (`metadata.aggregate`, top origins/destinations, timeline) and model detail by default. Pass `is_include_metadata: true` when you want them.
## Step 4 — Drill into the evidence
When you want the individual signals behind a company's move, call [Company Signal Events](/en/api-reference/endpoint/expansions/company_pulse_events).
```bash theme={null}
POST /expansions/companies/pulse_events
{
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"signal_types": ["HIRE", "EXEC", "NEWS"],
"window_days": 90,
"page": 1
}
```
This endpoint returns `total_entries` and `total_pages` — request pages `1` through `total_pages` (i.e. keep going while `page` \< `total_pages`).
## Filtering reference
Most expansion endpoints accept these filters. Their valid values are listed in [How Expansion Signals Work](/en/knowledge-base/concepts/how-expansion-signals-work):
| Filter | Purpose |
| -------------- | --------------------------------------------------------------------------- |
| `stages` | Limit to one or more expansion stages. |
| `freshness` | Limit by evidence recency. |
| `momentum` | Limit by trajectory (`advancing`/`steady`/`pulling_back`). |
| `scopes` | Limit by market-entry scope. |
| `signal_types` | Limit to specific signal types. |
| `froms` | Origin / HQ markets (expanding **from**). |
| `tos` | Target markets (expanding **into**). |
| `companies` | Scope to specific companies by `domain_search_id`, domain, or LinkedIn URL. |
The `companies` filter accepts any mix of identifier types — no need to resolve to IDs first:
```bash By domain theme={null}
POST /expansions/search
{ "companies": ["stripe.com", "airbnb.com"] }
```
```bash By LinkedIn URL theme={null}
POST /expansions/search
{ "companies": ["https://www.linkedin.com/company/stripe"] }
```
```bash By domain_search_id theme={null}
POST /expansions/search
{ "companies": ["550e8400-e29b-41d4-a716-446655440002"] }
```
Don't confuse **flow** with **trajectory**. Flow (the direction of the move between markets) is set by `froms` / `tos` — there is no `direction` request filter. Trajectory (how the move is progressing) is the `momentum` filter, and it surfaces in responses as the `direction` field.
## Next steps
The full market-to-signal walkthrough.
Browse every Expansion API endpoint.
# Expansion Field Reference
Source: https://docs.pubrio.com/en/knowledge-base/concepts/expansion-field-reference
A field-by-field dictionary for the Expansion API — every request filter and response field, its type, allowed values, and meaning.
This is the **field dictionary** for the Expansion API: what each request filter does and what each response field means. For the *why* behind the model, see [How Expansion Signals Work](/en/knowledge-base/concepts/how-expansion-signals-work) and the value catalog in [How Expansion Signals Work](/en/knowledge-base/concepts/how-expansion-signals-work). For an always-current list of allowed values, call the [Expansion Taxonomy](/en/api-reference/endpoint/expansions/types) endpoint.
## Core dimensions
Every expansion is described along a few independent axes. Don't confuse them:
| Field | What it captures | Example values |
| ----------------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| `stage` | How far a company has progressed in a market | `exploring`, `committing`, `expanding`, `scaling` |
| `presence.level` | How settled the company's **footprint** already is, independent of stage | `established`, `emerging`, `none`, `no_data` |
| `momentum` | The **trajectory** of the move right now | `advancing`, `steady`, `pulling_back` |
| flow | The **direction** of the move between markets, expressed with `froms` / `tos` | outbound (`froms`), inbound (`tos`), corridor (`froms`→`tos`) |
| `freshness` | How **recent** the evidence is | `fresh`, `cooling`, `stale`, `cold` |
| `scope` | Whether it's a new market or growth within an existing presence | `entering_new_market`, `expanding_within_presence`, `established_only` |
| `expansion_score` | A sortable 0–1 rank of how significant the expansion is | `0.72` |
The stage slugs are `exploring`, `committing`, `expanding`, and `scaling` — Exploring, Committing, Expanding, Scaling. `established` is **not** a stage; it is a `presence.level`, so filtering `stages: ["established"]` matches nothing and silently returns unfiltered results.
**Flow** (the direction of the move) and `momentum` (the trajectory) are different things. Filtering by "companies advancing" is `momentum: ["advancing"]`; filtering by "companies expanding *into* the US" is `tos: ["US"]`. There is no separate `direction` request field — flow is set entirely by `froms` / `tos`.
## Request filters
### Markets (`froms` / `tos`)
Geography is a directed relationship: companies expand **from** an origin **to** a target. Two lists express every case — no separate direction flag.
| Param | Type | Meaning |
| --------------- | ----------------------- | ------------------------------------------------------------------------- |
| `froms` | string\[] (ISO alpha-2) | **Origin** markets — where the company is expanding FROM (its home / HQ). |
| `tos` | string\[] (ISO alpha-2) | **Target** markets — where the company is expanding TO. |
| `exclude_froms` | string\[] (ISO alpha-2) | Origin markets to exclude. |
| `exclude_tos` | string\[] (ISO alpha-2) | Target markets to exclude. |
| You send | You get |
| ------------------------------ | ---------------------------------------------------- |
| `tos: ["US"]` | Everyone expanding **into** the US (inbound). |
| `froms: ["CN"]` | Chinese companies expanding **anywhere** (outbound). |
| `froms: ["CN"]`, `tos: ["US"]` | The **CN → US corridor** only. |
| neither | All expansions, worldwide. |
### Expansion signal filters
| Param | Type | Meaning |
| ------------------ | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stages` | string\[] | Filter to one or more expansion stages. |
| `momentum` | string\[] | Filter by trajectory (`advancing`/`steady`/`pulling_back`). |
| `freshness` | string\[] | Filter by evidence recency (`fresh`/`cooling`/`stale`/`cold`). |
| `scopes` | string\[] | Filter by `entering_new_market` / `expanding_within_presence` / `established_only`. |
| `signal_types` | string\[] | Restrict to specific signal types (`HIRE`, `OFFICE`, `AD`, `NEWS`, `DNS`, …). |
| `signal_strengths` | string\[] | Filter by evidence-confidence bucket: `low`, `medium`, or `high`. (Distinct from the per-signal `signal_strength_slug`, which ranges up to `very_high`.) |
| `min_signal_count` | integer | Minimum number of expansion signals — surfaces heavy-footprint movers. |
| `ahead_of_pace` | boolean | Only companies moving faster than that market's typical pace. |
| `only_contraction` | boolean | Only at-risk / shrinking markets. |
| `min_markets` | integer | Minimum distinct new markets a company has entered in the window. |
### Firmographics
| Param | Type | Meaning |
| --------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `verticals`, `technologies` | string\[] | Company industry / tech-stack filters. |
| `employees` | number\[]\[] | Head-count ranges, e.g. `[[50, 200]]`. |
| `founded_dates` | number\[] | Founded-year range `[from, to]`. |
| `revenues` | number\[] | Revenue range in USD `[from, to]`. |
| `keywords` | string\[] | Free-text theme scoping. |
| `companies` | string\[] | Scope to specific companies by any mix of `domain_search_id`, domain, or LinkedIn URL (domains / URLs resolve to their best-ranked company). |
### Time window & search
| Param | Type | Meaning |
| -------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transitioned_dates` | string\[] | Signal/transition window as an ISO `[from, to]` range. |
| `window_days` | integer | Rolling window in days, used when `transitioned_dates` is not supplied. |
| `query` | string | Natural-language search — Pubrio interprets it into filters (echoed back in `filters`). |
| `is_explain_match` | boolean | Add an AI `match_summary` per company, grounded in its real signals. Cited signal count and batch size scale with `per_page`; high-volume sources (job postings, ad campaigns) are summarized as a count rather than listed individually. |
| `sort_by` | string | Result ordering: `recent`, `expansion_score`, `signal_count`, or `company_ranking`. Omit for the default relevance order — corroborated pairs (2+ distinct signal types) first, then repeated-evidence pairs (3+ signals), most recent first within each tier. Use `recent` for pure recency. |
## Response fields
### Per-company / per-market `stage`
| Field | Meaning |
| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `stage.slug` | The current stage (`exploring` … `scaling`). |
| `stage.expansion_score` | Sortable 0–1 significance rank. |
| `stage.scope` | New-market vs within-presence. |
| `stage.direction` | Trajectory of the stage: `advancing`, `steady`, `retreating`, or `new`. This is the response-side view of the same **trajectory** axis you filter on with the `momentum` request param — the two use different value sets, so map accordingly. |
| `stage.freshness` | Recency bucket of the latest evidence. |
| `stage.signal_count` | Number of active expansion signals in this market. |
| `stage.first_signal_at` / `latest_signal_at` / `last_transition_at` | Key timestamps. |
### Signals, presence & explanation
| Field | Meaning |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `signals[]` | The underlying evidence: `signal_type`, `signal_subtype`, `signal_strength`, `polarity`, `event_date`, `source_type`, `display_label`, `evidence_url`. |
| `presence[]` | Known in-market footprint (offices/entities): `presence_type`, `presence_strength`, `address`, `known_since`. |
| `timeline[]` | Stage-transition history: `stage_slug`, `transitioned_at`, `transition_kind`. |
| `other_markets[]` | The company's other active markets, each with its stage + counts. |
| `match_summary` | *(when `is_explain_match: true`)* `{ text, citations }` — an AI "why it matches", cited to that company's real signals. Each citation carries a `count` field: `null` for a real individual signal, or an integer when the citation is a window-scoped volume count (job postings, ad campaigns) rather than a single event. |
`expansion_score` is a **sortable rank** (comparable across companies). It is distinct from the model confidence, which API-key responses include only when `is_include_metadata: true` is set.
# What Are Expansion Signals?
Source: https://docs.pubrio.com/en/knowledge-base/concepts/expansion-signals
Learn how Pubrio Expansion Signals reveal when and where a company is growing into new markets—so you can reach buyers at the moment expansion begins.
Expansion Signals show you which companies are moving into new markets, what stage that move is in, and how fast it is happening. Pubrio reads public activity—hiring, news, advertising, and on-the-ground presence—and turns it into a clear picture of a company's market expansion, so your sales and marketing teams can engage at the moment the opportunity opens.
## What Is an Expansion Signal?
An Expansion Signal is evidence that a company is growing into a new market—usually a new country or region. Instead of waiting for a press release or a cold tip, Pubrio continuously watches the public footprint a company leaves as it expands and surfaces it as a structured, queryable signal.
Each signal answers three practical questions:
The target market the company is moving into.
How far the move has progressed—from Exploring to Scaling.
The strength of the evidence and how fresh it is.
This lets you find companies that are entering a market *right now*, not ones that finished expanding a year ago.
## Where Signals Come From
Pubrio derives Expansion Signals from the activity a company generates as it grows. No single data point proves expansion—Pubrio combines these sources so a signal reflects a real pattern, not a one-off event.
New roles posted in a market—often the earliest sign of intent, and a clue to *which* function is expanding (sales, engineering, operations).
Funding, partnerships, office openings, and launch announcements tied to a region.
Campaigns targeted at a new market's audience, indicating go-to-market activity.
Public indicators that a company is operating in a market over time.
## Why Expansion Signals Matter
Reaching a company *while* it is expanding is far more valuable than reaching it before it has a need or after it has chosen a vendor.
A company opening its first office in a new country needs local vendors, partners, payroll, legal, logistics, and software—fast. Catching that moment means you arrive while budgets are forming and decisions are still open.
> Buyers are most receptive when a triggering event creates a new need. Expansion into a market is one of the clearest triggering events there is: it predictably generates demand across dozens of categories at once.
Most account lists treat every company the same. Expansion Signals let you sort by momentum—who is moving, into which markets, and how decisively—so your team spends its time on accounts where the timing is right.
Because signals carry a market and a direction, you can see expansion *flows*: which companies are entering your region, and where companies from your region are heading. That turns territory planning and partner sourcing into a data-driven exercise.
## How Pubrio Turns Activity Into a Signal
Pubrio continuously monitors hiring, news, advertising, and presence indicators across companies and markets.
Each piece of activity is tied to a specific target market, so signals are organized by *where* the expansion is happening.
Pubrio classifies how far along the expansion is—from early exploration to an established presence—and which way it is moving.
Each signal carries a strength and a recency, so you can tell a strong, current move from weak or stale evidence.
The result is available through the Expansion API and across Pubrio—ready to filter, rank, and act on.
## Key Terms
The country or region a signal is about.
How far along the expansion is, from early intent to an established presence.
Whether a company is expanding *into* your market of interest, or *out* toward another.
How strong the underlying evidence is.
How recent the evidence is.
A ranking value that sorts companies by how significant and active their expansion is.
## Next Steps
Go deeper on stages, scoring, direction, and freshness.
Every request filter and response field, with types and values.
Follow one company's expansion from market view to signal drill-down.
Make your first call and read the results.
# Expansion Signals: A Worked Example
Source: https://docs.pubrio.com/en/knowledge-base/concepts/expansion-signals-example
Follow one company from a market view down to the individual signals, using the Expansion API end to end.
This walkthrough follows a single question — *"Which companies are expanding into the United Kingdom right now, and why?"* — from the market dashboard down to the individual signals behind one company's move. Every request and response below uses the live Expansion API shapes.
## The scenario
You sell to companies setting up operations in the **United Kingdom**. You want the freshest inbound movers, then you want to understand *why* one of them is expanding so you can time your outreach.
## Step 1 — Find fresh inbound movers into the UK
Set `tos: ["GB"]` to find every company expanding **into** the UK, plus a freshness filter so you only see companies actively arriving.
```bash theme={null}
POST /expansions/search
{
"tos": ["GB"],
"freshness": ["fresh", "cooling"],
"page": 1,
"per_page": 25
}
```
The response summarizes the market and lists the companies expanding into it:
```json theme={null}
{
"metadata": {
"filters": { "tos": ["GB"], "freshness": ["fresh", "cooling"] },
"aggregate": { "total_companies_with_signals": 64, "committing_count": 22, "expanding_count": 15 },
"top_origins": [{ "home_country_code": "CN", "company_count": 18 }],
"top_industries": [{ "industry": "Consumer Electronics", "count": 9 }]
},
"data": {
"pagination": { "page": 1, "per_page": 25, "total_entries": 64, "total_pages": 3 },
"companies": [
{
"expansion_id": "6845525",
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"company_name": "Example Corp",
"domain": "example.com",
"home_country_code": "CN",
"country_code": "GB",
"industry": "Consumer Electronics",
"stage": { "slug": "expanding", "expansion_score": 0.72, "scope": "entering_new_market", "direction": "advancing", "freshness": "fresh", "signal_count": 7 }
}
]
}
}
```
Sort by `expansion_score` to put the most decisive movers first. Here, a China-based company (`home_country_code: "CN"`) is at the **Expanding** stage (`expanding`) in GB with an **advancing** trajectory — a strong, fresh inbound move.
## Step 2 — See the company's full market map
Take the `domain_search_id` and list every market that company is expanding into.
```bash theme={null}
POST /expansions/companies/lookup
{ "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "is_all_markets": true }
```
```json theme={null}
{
"metadata": { "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "home_country_code": "US" },
"data": { "market_count": 2, "dominant_stage_slug": "expanding", "total_signal_count": 194 },
"markets_summary": [
{ "country_code": "GB", "stage_slug": "expanding", "is_home_market": false, "signal_count": 140, "distinct_type_count": 6, "latest_signal_at": "2026-07-08T02:42:23.544Z", "rank_now": 1 },
{ "country_code": "DE", "stage_slug": "committing", "is_home_market": false, "signal_count": 54, "distinct_type_count": 3, "latest_signal_at": "2026-06-20T00:00:00.000Z", "rank_now": 2 }
]
}
```
The company is expanding into the UK and committing resources in Germany — useful context for prioritizing the right region.
## Step 3 — Understand the UK move in depth
Drill into the company-and-market detail to see the current stage, the underlying signals, known presence, and the transition timeline.
```bash theme={null}
POST /expansions/companies/lookup
{ "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "country_code": "GB" }
```
```json theme={null}
{
"metadata": { "domain_search_id": "550e8400-e29b-41d4-a716-446655440002", "country_code": "GB" },
"data": {
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"country_code": "GB",
"country_name": "United Kingdom",
"stage_rank": 3,
"stage_name": "Expanding",
"stage": { "slug": "expanding", "expansion_score": 0.72, "scope": "entering_new_market", "direction": "advancing", "freshness": "fresh", "signal_count": 27 }
},
"signals": [
{
"signal_type_slug": "EXEC",
"display_label": "Hired Regional VP for UK & Ireland",
"polarity": "expansion",
"event_date": "2026-06-20T14:00:00.000Z"
}
],
"presence": [
{ "presence_type": "office", "address": "London, UK", "known_since": "2026-03-15T00:00:00.000Z" }
]
}
```
The Expanding stage is backed by a senior UK hire and a London office — concrete evidence, not a guess.
## Step 4 — Read the individual events
For the full, paginated list of events driving the move, call the signal-event endpoint with the signal types you care about.
```bash theme={null}
POST /expansions/companies/pulse_events
{
"domain_search_id": "550e8400-e29b-41d4-a716-446655440002",
"signal_types": ["HIRE", "EXEC"],
"window_days": 90,
"page": 1
}
```
```json theme={null}
{
"metadata": { "domain_search_id": "550e8400-e29b-41d4-a716-446655440002" },
"data": {
"pagination": { "page": 1, "per_page": 25, "total_entries": 42, "total_pages": 2, "total_display_pages": 2, "is_timeout": false },
"events": [
{
"signal_type_slug": "EXEC",
"country_code": "GB",
"display_label": "Hired Regional VP for UK & Ireland",
"evidence_url": "https://www.linkedin.com/company/example-corp",
"event_date": "2026-06-20T14:00:00.000Z"
}
]
}
}
```
Use `total_pages` to drive a "load more" control by incrementing `page` until it reaches `total_pages`.
## What you just did
You went from *a market* → *a ranked list of movers* → *one company's full footprint* → *the exact signals behind its UK expansion*. That is the core loop of the Expansion API: start broad, narrow to a company, then read the evidence.
Authentication, pagination, and your first calls.
The full catalog of values used above.
# Targeting People via Companies
Source: https://docs.pubrio.com/en/knowledge-base/concepts/find-people
How to leverage company insights to find the right people in Pubrio.
Companies provide essential context and filtering power. Signals like technology adoption, funding rounds, or job openings reveal intent and growth patterns that individual contact data alone can’t capture.
## Why focus on companies first?
Effective prospecting starts with understanding your target market at the company level. In Pubrio, companies are rich with signals—such as technologies they use, recent news, hiring trends, and market activity—that help you identify the right segment to focus on. By zeroing in on these companies first, you set a strong foundation for finding the most relevant contacts within them.
This approach reduces noise and increases the precision of your outreach, ensuring you spend time engaging with decision-makers who matter.
## How It Works
1. **Search & Select Companies**\
Use Pubrio’s filters—industry, size, location, technology stack, recent news, hiring activity—to build a highly targeted list of companies that fit your Ideal Customer Profile (ICP).
2. **Click “Find People”**\
Select multiple companies (up to **100** maximum). The **Find People** button lets you instantly move from your company list to a people search scoped to those companies.
3. **Refine Your People Search**\
Apply additional filters like department, role, seniority, or function to identify the exact contacts you want to engage.
Even if you select more than 100 companies, Pubrio will only consider the first 100 when jumping to people search.
## Best Practices
* Prioritize companies showing strong intent signals (e.g., recent funding, hiring spikes).
* Use saved company lists to quickly run people searches without rebuilding filters.
* Combine company-level insights with people filters for higher-quality leads.
Start broad at the company level → Use rich signals to narrow your target → Dive into people search for precise outreach.
# How Expansion Signals Work
Source: https://docs.pubrio.com/en/knowledge-base/concepts/how-expansion-signals-work
The model behind Pubrio Expansion Signals — stages, the signal-type catalog, local presence, scoring, momentum, freshness, and flow — with the exact values the Expansion API returns.
Pubrio reads every expansion along a few independent axes: the **stage** a company has reached, the **signals** behind it, the **local presence** it already has, and the **momentum**, **freshness**, and **flow direction** of the move. The **API value** columns below are exactly what you'll see in responses and can filter on. For an always-current list, call the [Expansion Taxonomy](/en/api-reference/endpoint/expansions/types) endpoint.
## The Expansion Stages
Every company-and-market pair sits at a stage. The stages form a ladder from first interest to a fully established operation.
`exploring` — early interest: advertising or news activity aimed at the region, before any commitment.
`committing` — resources going in: partnerships, infrastructure, and other groundwork.
`expanding` — a foothold forms: local hiring, in-region leadership, or a physical office.
`scaling` — actively running: scaling the team and launching products locally.
A single piece of activity does not move a company up a stage — Pubrio looks for a corroborated pattern first.
## Two axes: expansion signals vs. local presence
Pubrio reads a company's position on **two independent axes**, and the API surfaces both — which is why the same company can show an active expansion stage *and* an established local footprint at the same time.
Derived from active expansion **signals** — hiring, ads, news, a new office. Answers *"what is the company doing to enter this market right now?"* (`exploring` → `scaling`).
Derived from the company's actual **footprint** — the size of its detected in-market team and any known office. Answers *"what does the company already have on the ground?"*
They don't always agree, and that's intentional:
* A company can be **`committing` or `expanding` by signals** while already showing a sizeable **local team** — it has a foothold and is actively deepening it, not entering cold. The in-market presence overlay reads this as *scaling* / *deepening* rather than a fresh entry.
* A market with a real local presence but **no active expansion signals** surfaces with a **`presence.level` of `established`** — a long-standing operator that isn't making new moves right now. These are excluded from new-expansion views by default; include them (`is_include_established`) when you want the full footprint.
`exploring` / `committing` / `expanding` / `scaling` describe the **motion**; `established` and the presence overlay describe the **footprint**. Read them together to tell whether a company is breaking in, deepening, or simply settled.
## Signal Types
Each signal type points to the stage it most strongly indicates. Premier signal types are higher-prominence indicators.
`AD` · Exploring · Standard
Campaigns targeted at the market's audience.
`NEWS` · Exploring · Standard
Funding, partnerships, and launch coverage tied to the region.
`INFRA` · Committing · **Premier**
Capital committed to the market through investments and acquisitions.
`DNS` · Committing · **Premier**
Cloud infrastructure detected in the market.
`PARTNER` · Committing · Standard
Local partnerships and channel relationships.
`EVENT_PLUS` · Committing · **Premier**
Speaking or exhibiting at an event in the target market.
`EXEC` · Expanding · Standard
Leadership roles based in the market.
`OFFICE` · Expanding · Standard
A physical office or registered presence.
`HIRE` · Expanding · Standard
Operational roles posted in the market.
`SCALE` · Scaling · Standard
Growing the local team and operations.
`PRODUCT` · Scaling · Standard
Products or services launched locally.
Hiring signals (`HIRE`, `EXEC`) are often the earliest concrete evidence of a market move and frequently tell you *which function* is expanding — sales, engineering, or operations — via the underlying job data.
## Expansion Score and Confidence
How significant and active the expansion is. Sort by it so the most decisive movers rise to the top of a market.
How much corroborating evidence exists — a company with several independent signals reads more confidently than one resting on a single source.
## Momentum, freshness, and flow
Beyond the stage, each expansion carries a momentum, a freshness, and a flow direction. These are independent filters you combine to express exactly the query you want.
The trajectory of the move through the stages.
| Momentum | API value | Meaning |
| ---------- | ------------ | ----------------------------------------------- |
| New | `new` | Just appeared. |
| Advancing | `advancing` | Moving up the stages — accelerating in. |
| Steady | `steady` | Continuing at a consistent level. |
| Retreating | `retreating` | Weakening or reversing — possibly pulling back. |
How recent the evidence is, so a strong-but-old signal is never mistaken for a current one.
| Freshness | API value | Age of evidence |
| --------- | --------- | -------------------- |
| Fresh | `fresh` | Within \~30 days |
| Cooling | `cooling` | \~30–60 days |
| Stale | `stale` | \~60–90 days |
| Cold | `cold` | Older than \~90 days |
Which side of the expansion to look at, relative to the markets you care about.
| Flow | API value | Selects |
| -------- | ---------- | ------------------------------------------------------ |
| Inbound | `inbound` | Companies expanding **into** the selected markets. |
| Outbound | `outbound` | Companies expanding **out from** the selected markets. |
| All | `all` | Both directions. |
How strong an individual piece of evidence is.
| Strength | API value | Meaning |
| --------- | ----------- | --------------------- |
| Low | `low` | Weak evidence. |
| Medium | `medium` | Moderate evidence. |
| High | `high` | Strong evidence. |
| Very high | `very_high` | Very strong evidence. |
Flow direction (`inbound` / `outbound`) is **not** the same as momentum (`advancing` / `retreating`). Flow is about *which side of the border* you're looking at; momentum is about *whether the move is speeding up or slowing down*.
## Polarity: expansion vs. contraction
Most signals indicate growth, but Pubrio also detects **contraction** — evidence that a company is scaling back. Each signal carries a **polarity**, so you can spot retreats as clearly as advances (useful for churn-risk monitoring).
| Polarity | API value | Meaning |
| ----------- | ---------------------------------------------------------------------- | ------------------------------------------------------------ |
| Expansion | `expansion` | Evidence of growth into the market. |
| Contraction | `contraction_leading`, `contraction_confirming`, `contraction_lagging` | Scaling back, from earliest indication to confirmed retreat. |
## Putting it together
A high-value lead is typically a **fresh**, **advancing**, **high-strength** signal in the **stage** that matches your offer, flowing in the **direction** that fits your territory — cross-checked against local presence to see whether it's a cold entry or an existing team deepening. The Expansion API exposes every one of these as a filter and a field.
Every request filter and response field, with types and values.
Walk one company's expansion end to end.
# Pubrio Data Overview
Source: https://docs.pubrio.com/en/knowledge-base/concepts/pubrio-data-overview
Learn how Pubrio sources, verifies, and maintains its data with transparency and compliance.
Pubrio synchronizes data points from over 1 billion websites across 130+ countries and regions daily, turning fragmented local signals into structured market expansion intelligence for GTM and revenue teams.
## How Is Pubrio Data Sourced and Collected?
Pubrio collects and verifies data from multiple sources to ensure accuracy and reliability. The main methods include:
* **Data contributor network**: Pubrio benefits from a large network of contributors who share business contact information while using Pubrio services, enabling verification against connected inboxes and CRMs.
* **Engagement tools**: Pubrio tracks email interactions such as replies and bounces to verify valid email addresses.
* **Public data crawling**: Proprietary algorithms crawl and parse public websites to build a comprehensive index of people and company data.
* **Third-party data providers**: Pubrio processes millions of records monthly from vetted third-party providers, enhancing its database with high-quality verified data.
At Pubrio, data is never single-sourced. The combination of multiple sources, proprietary technology, and a broad contributor network ensures best-in-class data coverage and quality.
## How Does Pubrio Ensure Data Accuracy?
Pubrio’s data accuracy is achieved through a multi-layered approach combining proprietary technology, data science, and human validation:
* Contact information undergoes **multi-step verification**, including syntax checks, email deliverability tests, and phone number validation against telecom databases to maintain **over 90% contact accuracy**.
* AI-powered anomaly detection flags outdated or inconsistent records for review or removal.
* Human-in-the-loop processes supplement automated checks, with data specialists reviewing critical segments and high-value accounts to ensure precision.
Pubrio uses machine learning algorithms for entity resolution, matching multiple data points (e.g., company name variants, domain names, IP addresses) to consolidate duplicates and maintain unique, clean records. This reduces false positives and ensures consistent company and contact profiles across datasets.
## How Often Does Pubrio Update Its Data?
Pubrio updates its data frequently to maintain accuracy:
* **Continuous Real-Time Updates:** Pubrio ingests and processes data streams 24/7 from multiple sources such as web crawlers, company websites, public filings, job boards, funding announcements, and technology usage trackers. This ensures that changes in company details, funding status, or technology adoption are reflected promptly.
* **Daily Refresh Cycles for Key Data:** Core attributes like contact information (emails, phone numbers), job titles, and company size are refreshed daily to maintain accuracy and reduce bounce rates.
* **Weekly Enrichment and Validation:** More complex data points such as firmographics, funding rounds, and intent signals undergo weekly enrichment cycles using AI-driven algorithms combined with human verification to ensure data integrity.
* **Intent Data Updates in Near Real-Time:** Pubrio Intent tracks website visitor behavior and engagement metrics continuously, updating intent scores and visitor profiles in near real-time (within minutes to hours), enabling timely prioritization of high-potential leads.
## How Can Users Manage Their Data in Pubrio?
Pubrio complies with global privacy regulations and provides mechanisms for data control:
* Users can submit opt-out requests, which are processed within **72 hours**.
* Data filters are available to exclude contacts by region or compliance requirements.
* Opt-out status is preserved to prevent re-inclusion in future updates.
## Contact and Support
For more information or assistance, please contact Pubrio support.
# Filtering & Exporting Contacts
Source: https://docs.pubrio.com/en/knowledge-base/concepts/search-filters
Best practices for applying filters efficiently and exporting contacts to CSV in Pubrio.
## Filtering Contacts Efficiently
Pubrio processes billions of data points to deliver accurate results. Complex or broad filter combinations may sometimes cause longer processing times or timeouts.
Applying location filters early in your search reduces the dataset size significantly. This helps the system process your query faster and enables deeper filtering on other attributes.
* If your search takes too long or times out, try removing some filters and then adding them back one at a time.
* Repeating this process 1-2 times signals the system to prioritize your request.
* Keeping your filter set focused improves performance and search accuracy.
## Exporting Contacts to CSV
After refining your search and selecting contacts, you can export them to CSV for use in your CRM, marketing tools, or outreach campaigns.
1. Apply your desired filters and select the contacts you want to export.
2. Click the **Export** button.
3. Choose whether to export all selected contacts or only those with verified emails.
4. (Optional) Customize the CSV columns by clicking **Edit export CSV settings** to include the fields you need.
5. Click **Export records** to start the process.
* Large exports (over 1,000 contacts) may take several minutes to complete.
* Exported data respects your account’s permissions and subscription limits.
# Managing Credentials
Source: https://docs.pubrio.com/en/knowledge-base/concepts/sequence-credentials
How to connect and manage multiple channel credentials for effective multi-channel outreach in Pubrio sequences.
To engage your targets effectively, Pubrio sequences support multiple outreach channels such as email and LinkedIn. Connecting the right credentials for these channels is essential to execute your campaigns smoothly and within platform limits.
## Connecting Credentials
* In your sequence settings, click the **+** button to add a new credential.
* Select the relevant channel you want to connect, such as Email or LinkedIn.
* Follow the guided steps to authenticate and grant necessary permissions. These permissions allow Pubrio to represent your identity securely and send outreach on your behalf.
* It’s important to carefully follow the permission guidelines to ensure proper connection and avoid errors.
## Understanding Rate Limits and Credential Usage
* Each credential has its own rate limits that control how many outreach actions can be performed within a given time period.
* When multiple sequences use the same credential, Pubrio prioritizes engagement based on the earliest added targets.
* Targets added later will be queued and their actions delayed until the rate limit resets.
* This rate limiting mechanism prevents overactive engagement that could harm deliverability or trigger platform restrictions.
* Managing multiple credentials or aliases allows you to distribute outreach volume, maintain consistent engagement, and avoid hitting limits.
Imagine you add 100 targets to a sequence and send outreach messages to all at once. Sending too many emails simultaneously signals email providers and may cause your messages to bounce or be marked as spam. To prevent this, Pubrio enforces rate limits per credential.
* By default, Pubrio delays each email by 10 minutes (600 seconds) between sends.
* We recommend sending between 50 and 100 emails per day per credential to maintain healthy deliverability.
This mechanism helps avoid overactive engagement and protects your sender reputation.
## Best Practices
* Connect all relevant channel credentials before launching sequences to ensure smooth multi-channel engagement.
* Monitor credential usage and add aliases if needed to increase throughput without risking rate limit blocks.
* Regularly review permissions and re-authenticate credentials as required to maintain uninterrupted outreach.
Proper credential management is a foundational step to maximize the power of Pubrio’s multi-channel sequences while respecting platform limits and maintaining high deliverability.
# Personalizing Your Sequences
Source: https://docs.pubrio.com/en/knowledge-base/concepts/sequence-personalisation
Deep dive into personalization features in Pubrio sequences to maximize engagement and relevance.
Personalization is the cornerstone of successful outreach. Pubrio sequences offer multiple powerful controls to tailor your messages and engagement to each prospect’s unique data and context.
## Variables Based on Target Data
Variables are dynamic placeholders that pull information directly from the target record. Common examples include name, company name, position, or custom fields.
* When composing messages in your sequence steps, you can insert these variables from a comprehensive variable list.
* This allows each message to feel personal and relevant without manual editing.
* For example, using `{{attributes.first_name}}` will automatically insert the recipient’s first name.
* Variables update in real-time based on the most current contact data, ensuring accuracy.
## Contact Selection Type
Contact selection controls which contact information is used to send your outreach, and it varies by channel:
* **Email:**\
You can select from multiple email categories:
* **Business Email:** The professional email tied to the contact’s work.
* **Personal Email:** The contact’s personal email address.
* **Company Generic Email:** A general company address (e.g., [info@company.com](mailto:info@company.com)) used as a fallback.
* **SMS and Other Channels:**\
Similar logic applies to phone numbers or LinkedIn profiles, where you specify which contact field to use.
Pubrio follows the order you set to find the best available contact info. If the primary email is missing or unverified, it will try the next option.
> **Important:** Redeeming contact information before adding targets to sequences is highly recommended. This ensures you have verified, up-to-date contact data and can maximize multi-channel engagement.
## Sequence Credentials
Credentials define which sending account or identity will be used for your outreach:
* You can add multiple credentials or aliases under a single account.
* This allows you to manage sending limits, distribute outreach volume, and tailor sender identities per use case.
* For example, you might use different credentials for different regions or product lines.
* Managing credentials properly helps maintain deliverability and avoid spam filters.
## Sequence Signature
Email signatures help maintain brand consistency and professionalism in your outreach:
* Pubrio lets you add customizable signatures to your email actions.
* These signatures behave like those in standard email clients, including images, links, and formatted text.
* Consistent signatures build trust and reinforce your brand identity.
## Code Editor for Advanced Personalization
For users who want rich, custom-designed content:
* Pubrio supports pasting HTML or code snippets exported from third-party design tools.
* The portal renders these in a pixel-perfect format, preserving your design fidelity.
* This feature enables advanced layouts, custom fonts, images, and interactive elements.
> **Note:** Ensure your HTML code is clean and tested for compatibility across clients.
## Testing Your Personalization Setup
Before launching your sequence, testing is critical to ensure personalization works as expected:
* Use the **Run Test** feature to preview how your message renders with real contact data.
* Select a target contact to simulate variable replacement and content rendering.
* You can also specify a destination channel to see the final output.
Running a test does not send an actual message to the sequence target; it is purely for previewing the personalization and delivery to your destination channel.
* Testing helps catch errors, missing variables, or formatting issues before live outreach.
By mastering these personalization controls—variables, contact selection, credentials, signatures, and testing—you can create highly relevant, professional, and effective outreach sequences that resonate with your prospects.
# Sequence Sending Schedules
Source: https://docs.pubrio.com/en/knowledge-base/concepts/sequence-settings
Comprehensive guide to integrating with the Pubrio platform.
Sequence sending schedules control the days and times your outreach messages are sent, helping you engage your audience at the most effective moments. Proper scheduling improves open rates, response rates, and overall campaign success.
## What is a Sending Schedule?
A sending schedule defines the specific time blocks during which your sequence actions are delivered. You can create multiple schedules tailored to different audience preferences, ensuring your messages reach contacts at appropriate times.
## How Sending Schedules Affect Your Outreach
* All sequence steps subject to sending schedules, including automatic emails and action items.
* Wait times between steps are honored within the schedule windows.
* Scheduling based on the profile user's time zone increases the chances of your message being seen at a convenient time.
* Skipping holidays or off-hours prevents outreach fatigue and respects recipient availability.
## Applying a Sending Schedule to a Sequence
Once created, you can apply a sending schedule to any sequence:
1. Go to **Sequences** and select the sequence you want to configure.
2. Click **Settings**.
3. Under the **Schedule** section, select the sending schedule you want to use.
4. Click **Save Changes**.
Your sequence will now send messages only during the defined time blocks, respecting wait times between steps and optimizing engagement.
# Understanding Pubrio Intent
Source: https://docs.pubrio.com/en/knowledge-base/concepts/understanding-intent
Learn how Pubrio Intent uses website visitor identification to reveal anonymous prospects and boost your lead generation.
Pubrio Intent helps you unlock the hidden potential of your website visitors by identifying companies visiting your site—even if visitors don’t fill out any forms. By inserting a small tracking code on your website, Pubrio captures anonymous visitor data and matches it to company profiles, giving you actionable insights to prioritize and engage high-potential leads.
## What Is Pubrio Intent?
Pubrio Intent is a web identification technology that tracks visitor behavior on your website in real time. Unlike traditional lead capture methods that rely on form submissions, Pubrio Intent reveals the companies behind anonymous visits by analyzing online signals and matching IP addresses to company data.
This means you can discover which organizations are actively researching your solutions—even if they don’t contact you directly.
## Why Identify Anonymous Visitors?
Most website visitors remain anonymous, browsing your site without filling forms or directly engaging. Identifying these visitors reveals valuable insights that can transform your marketing and sales efforts.
### Improve Personalization and Relevance
Knowing who your visitors are—even anonymously—allows you to tailor content, offers, and messaging to their specific needs and interests. Personalized experiences build trust and increase engagement.
> According to a [McKinsey survey](https://www.mckinsey.com/capabilities/growth-marketing-and-sales/our-insights/the-value-of-getting-personalization-right-or-wrong-is-multiplying), 71% of consumers expect personalized interactions from businesses. By leveraging visitor intent and behavior data, you can deliver content that resonates and nurtures leads more effectively.
### Enhance the Customer Journey
Anonymous visitor identification lets you track user behavior and preferences across your website. This insight helps you design seamless, relevant experiences that guide prospects through the funnel.
For example, if a visitor browses pricing and case studies but leaves without converting, you can re-engage them with targeted follow-ups or tailored content that addresses their concerns and questions.
## How Does Pubrio Intent Work?
Add Pubrio’s lightweight JavaScript snippet to your website pages.
The code anonymously monitors visitor activity such as pages viewed, time spent, and engagement levels.
Using IP intelligence and extensive company databases, Pubrio matches visitors to their organizations.
View detailed analytics on which companies are visiting, what content interests them, and how engaged they are.
Use this data to prioritize outreach, tailor messaging, and convert anonymous visitors into qualified leads.
# What Are Credits in Pubrio
Source: https://docs.pubrio.com/en/knowledge-base/concepts/what-are-credits
Understand how credits work in Pubrio, what activities consume credits, and how to manage your credit balance.
Credits are the unit of currency used within Pubrio to perform various data-related activities such as accessing contact information, enriching data, and using AI-powered features.
Pubrio offers two types of credits:
* **Credits:** Allocated monthly or annually based on your subscription plan. These credits expire at the end of each billing cycle if unused.
* **Top-Up Credits:** Purchased separately and do **not expire**. These credits can be used anytime and accumulate until fully consumed.
Managing your credits effectively helps optimize your usage and control costs.
## Example That Require Credits
| Activity | Description |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Accessing Verified Contact Info** | Unlock validated email addresses and phone numbers while prospecting in Pubrio or via the Pubrio Chrome extension. |
| **Data Enrichment** | Refresh and enrich stale or incomplete contact and account data to maintain accuracy. Available on select plans. |
| **AI Insights & Power-Ups** | Apply AI-powered filters, generate prospect insights, and personalize outreach campaigns. |
| **API Usage** | Retrieve or enrich data programmatically through Pubrio’s API endpoints. |
When you perform an activity that consumes credits, Pubrio will use your **Credits** first. Once those are exhausted, it will automatically draw from your **Top-Up Credits**.
## Frequently Asked Questions
The number of credits depends on your team’s volume of data usage and outreach goals. Your subscription plan includes a set number of credits that renew each billing cycle. If you need additional credits, you can purchase additional credits or upgrade your plan through your billing settings.
Admins can monitor credit usage and remaining balance in the Pubrio dashboard under:
**Settings** > **[Credit Usage](https://dashboard.pubrio.com/#/settings/current-usage)**
Credits renew at the start of each billing cycle—monthly or annually depending on your plan. Top-Up Credits do **not** expire and remain available until fully used.
Credits **do not** roll over and expire at the end of each billing cycle. Top-Up Credits **never expire** and accumulate until used.
For more detailed information about credit usage, billing, and management, please visit the Pubrio support center or contact your account manager.
# Free Trial & Rewards
Source: https://docs.pubrio.com/en/knowledge-base/free-trial
Overview of your free trial usage limits, invite & earn rewards, and onboarding resources.
## Welcome to Your Pubrio Free Trial!
You’re already on the path to supercharging your sales and marketing with Pubrio’s powerful tools. Your free trial gives you a great head start with:
* Access to the first **4 pages** of search results per query.
* **150 credits** to explore prospecting, enrichment, and engagement features.
* Core functionalities to help you discover and connect with your ideal customers.
Remember, your credits reset monthly during the trial, so make the most of every opportunity!
## Invite & Earn Rewards
Amplify your impact by inviting your network to join Pubrio — and get rewarded for it!
* Share your unique referral link with colleagues and friends.
* Earn bonus credits for every successful signup and trial activation.
* There’s no cap on how many rewards you can earn — the more you invite, the more you benefit.
* Track your invites and rewards easily in the **Referral** section of your dashboard.
Referral credits are added automatically, never expire, and can be used alongside your regular credits to unlock more features.
## Onboarding Kit & Rewards
Accelerate your success with our Onboarding Kit — and earn bonus credits as you go!
* Follow step-by-step guides, watch video tutorials, and join live webinars.
* Complete key onboarding milestones like setting up your first search or creating your first sequence.
* Earn bonus credits for each milestone completed, extending your trial’s power.
* Monitor your progress and rewards in the **Onboarding** section of your account.
Rewards are granted automatically as you complete onboarding tasks. Use these credits to unlock more of Pubrio’s capabilities during your trial.
## Need Help?
Our support team is here for you! Reach out anytime via the Help menu or email [support@pubrio.com](mailto:support@pubrio.com). Thank you for choosing Pubrio — let’s make this trial your launchpad to success!
# Cold Outreach Basics: Identify Leads & Launch Sequences
Source: https://docs.pubrio.com/en/knowledge-base/guides/cold-outreach-basics
A practical guide to cold outreach — from defining your ideal customer profile to crafting sequences and sample emails.
An Ideal Customer Profile (ICP) is a detailed description of the perfect company or customer that would benefit most from your product or service—and in turn, provide significant value to your business. Defining your ICP is the foundation of effective B2B sales and marketing strategies.
## Practical Example: How a Chatbot Company Finds Their ICP
Imagine you sell a chatbot solution and want to target ecommerce stores. You might not initially know how to find these stores specifically. Here’s how you can leverage Pubrio’s platform and data to identify your ICP:
1. **Use Technology Filters to Find Ecommerce Stores:**\
Apply the **Technology** filter and search for companies using **Shopify** (a popular ecommerce platform). This instantly narrows your list to online retailers who are more likely to need chatbots for customer engagement.
2. **Refine by Company Size and Location:**\
Further filter by **employee size** (e.g., 100+ employees) and **location** (e.g., United States, United Kingdom) to match your ideal market.
3. **Add Buyer Role Filters:**\
Use **job title** or **department** filters to find decision-makers like Marketing Managers, Customer Experience Heads, or IT Managers within these companies.
To learn more about how to target people effectively, refer to **[Targeting People via Companies](/en/knowledge-base/concepts/find-people)** in Pubrio’s resources. This guide explains how to find and filter contacts within your target companies to reach the right decision-makers.
## Add Leads to a Sequence
When you add leads to a sequence in Pubrio, you can automate personalized outreach across multiple channels like email, SMS, and LinkedIn. This helps keep your prospects engaged through timely, relevant touchpoints.
Not all interactions require email or phone contact information. For example, if your outreach stays entirely within LinkedIn, you might not need emails or phone numbers for those targets.
However, if your sequence involves channels that require contact details (like email or SMS), you can redeem contact emails individually or in bulk before adding leads to the sequence. Simply click the **email redemption** button to fetch validated email addresses.
Redeeming contacts beforehand ensures you can fully leverage multi-channel outreach and avoid missing opportunities due to incomplete contact data.
## Cold Outreach Sequence
A cold outreach sequence is a series of planned touchpoints designed to engage potential leads over time. It typically includes an introduction, value-driven follow-ups, and a clear call-to-action (CTA).
1. **Day 1 – LinkedIn Connection Request:**\
Send a personalized connection request mentioning their ecommerce platform or recent activity. Example message:
```mdx wrap theme={null}
Hi {{attributes.first_name}},
I noticed {{attributes.company.company_name}} uses Shopify and thought it’d be great to connect — I help ecommerce teams improve customer engagement with chatbots. Looking forward to connecting!
Best,
```
2. **Day 3 – LinkedIn Follow-Up Message:**\
After they accept, send a brief message to start a conversation without pitching. Example message:
```mdx wrap theme={null}
Thanks for connecting, {{attributes.first_name}}!
Curious — how are you currently handling customer questions on your Shopify store?
```
3. **Day 7 – First Email Touch:**\
If no reply on LinkedIn, send a personalized email referencing the LinkedIn interaction and highlighting value. Email body:
```mdx wrap theme={null}
Hi {{attributes.first_name}},
I reached out on LinkedIn earlier and wanted to share how we helped another Shopify store increase sales by 20% using our chatbot solution.
Would you be open to a quick call next week to explore if this could help {{attributes.company.company_name}} too?
Best,
```
4. **Day 10 – Second Email Follow-Up:**\
Send a polite follow-up email with social proof or a case study link. Example message:
```mdx wrap theme={null}
Hi {{attributes.first_name}},
Just checking in — we recently helped a Shopify ecommerce client boost conversions by automating customer support with chatbots.
Let me know if you’d like to see a quick demo or case study.
Thanks,
```
5. **Day 14 – Final Email Touch:**\
A last email with a clear call-to-action and a low-pressure close. Example message:
```mdx wrap theme={null}
Hi {{attributes.first_name}},
I don’t want to clutter your inbox, so this will be my last message. If improving customer engagement on {{attributes.company.company_name}}’s Shopify store is a priority, I’d love to help.
Feel free to reach out anytime!
Best regards,
```
This is just one example of a cold outreach sequence. Feel free to get creative and customize the flow, timing, and messaging to best fit your audience and product!
## Activate and Monitor Your Sequence
* Add a default trigger for automatic enrollment.
* Configure delays between steps (e.g., 2 days between emails).
* Use monitors to wait for replies before proceeding.
* Connect sending credentials and verify schedule settings.
* Monitor open, reply, and click metrics regularly.
Cold outreach is a marathon, not a sprint. Use Pubrio’s automation and personalization tools to build meaningful connections at scale.
# Pubrio Knowledge Base
Source: https://docs.pubrio.com/en/knowledge-base/introduction
Guides, concepts, and best practices for B2B data enrichment, prospecting, and outreach automation with Pubrio.
Need help? Use the search bar above or explore the sections below to find detailed guides, FAQs, and tutorials.
## Explore Topics
If you can’t find what you’re looking for, contact Pubrio Support anytime via the Help menu or email [support@pubrio.com](mailto:support@pubrio.com).
# Feedback & Support
Source: https://docs.pubrio.com/en/knowledge-base/reach-out-support
How to provide feedback and contact Pubrio support for assistance.
## How to Provide Feedback
At Pubrio, your feedback is invaluable in helping us improve our products and services. Whether you want to report an issue, suggest a feature, or need support, this page guides you on how to get in touch with us effectively.
We welcome your ideas and suggestions! To submit feedback:
* Log in to your Pubrio account.
* Click the **Help** or **?** icon in the top-right corner.
* Select **Feedback**.
* Fill out the feedback form with:
* A clear description of your suggestion or issue.
* Any relevant screenshots or examples.
* Your contact information (optional).
Your feedback is reviewed by our product team and helps shape future updates.
## Additional Contact Options
* Email: [support@pubrio.com](mailto:support@pubrio.com) for support inquiries.
* For general inquiries or account management, email [info@pubrio.com](mailto:info@pubrio.com).
# Affiliate Program
Source: https://docs.pubrio.com/en/resources/affiliate-program
Partner with Pubrio and earn 20% commission on every referral.
# Become a Pubrio Partner
Monetize your influence by introducing your audience to the Glocal Data Layer.
The B2B data market is crowded with tools that only work in the US. Pubrio offers something different: a solution for the global economy. By partnering with us, you aren't just selling another database; you are solving a massive pain point for international sales teams.
## The Offer
We believe in sharing the upside with the people who help us grow.
**Earn on every deal.**
Receive **20%** of the revenue for every paid customer you refer. These commissions apply for the **first 12 months** of the referral's subscription.
***
## Why Partner with Pubrio?
Stop promoting the same tools as everyone else. Here is why Pubrio is the smartest bet for your revenue.
### 1. Sell to the "Ignored" 90%
Every other affiliate is fighting to sell data tools that only work in the US. Pubrio owns the rest of the world. You can sell to companies in **Asia, LatAm, and Europe** who are desperate for data but have no good options. It is an untapped "Blue Ocean" for you.
### 2. "Sticky" Infrastructure
Pubrio isn't a disposable plugin; it is the foundation of a sales team's workflow. Once a customer integrates our API or Data Layer, they rarely churn. This means your monthly commission check is stable, predictable, and compounding.
### 3. You Look Like a Genius
Your audience is tired of generic software recommendations. By introducing them to Pubrio, you are solving their hardest problem—finding "invisible" international leads—which builds massive trust and authority for your brand.
***
## We Go To Market Together
We don't just give you a tracking link and wish you luck. We treat our top partners as an extension of our own growth team.
**Webinars & Content.**
Have a large audience? Let's host a joint webinar on "Global Expansion" or co-author a "State of Sales" report. We bring the data; you bring the voice.
**Exclusive Deals.**
Need a special discount code for your community or an extended trial for your agency clients? We can create custom landing pages just for you.
**SEO Authority.**
Write for the Pubrio blog or have our founders write for yours. We cross-promote content to drive traffic to both our domains.
**Direct Line.**
Skip the support queue. Our top partners get a direct Slack channel with our Partnership Manager to resolve issues instantly.
***
## Who is this for?
**Lead Gen & Marketing Agencies.**
Use Pubrio to deliver better results for your clients, or refer them directly to us and take a cut of the software spend.
**B2B Influencers.**
Create tutorials on "How to find leads in Vietnam" or "Automating Sales Research" and put your affiliate link in the description.
**GTM Strategists.**
When you advise a company on their expansion into new markets, recommend Pubrio as the data engine to power it.
**Sales Communities.**
Offer your members an exclusive perk while generating revenue for your community management.
***
## How it Works
Fill out a simple form to join the program. We vet partners to ensure high-quality content alignment.
Access your personal Partner Dashboard. Get your unique referral link and marketing assets (logos, banners, screenshots).
Share Pubrio in your newsletters, LinkedIn posts, or client proposals.
Track clicks and conversions in real-time. Payouts are processed monthly via PayPal or Stripe.
***
## Join the Program
Ready to turn your audience into revenue?
**Apply Now.**
Join the Pubrio Partner Network and start earning today.
# Careers
Source: https://docs.pubrio.com/en/resources/careers
Help us map the invisible 70% of the global economy.
# Build the World's Data Layer
Most B2B data companies are boring. They scrape the same 30% of the internet — LinkedIn, Crunchbase, and US corporate registries — and resell it.
At Pubrio, we are doing something harder. We are building the **Glocal Data Layer** for the AI era.
We are mapping the **"Invisible 70%"** — the factories in Vietnam, the logistics giants in Brazil, and the wholesale traders in Germany that drive the real global economy but have zero digital footprint. We are building the infrastructure that allows AI Agents to understand the world, not just the internet.
## Our Vision
AI is only as good as the data you feed it.
* If you ask an AI "Who are the top software companies in San Francisco?", it knows.
* If you ask "Who are the top textile manufacturers in Bandung?", it hallucinates.
**We are fixing that hallucination.** We are aggregating local, offline, and government data sources from 50+ countries to create the ground truth for the global economy.
***
## How We Work
We are a team of engineers, data scientists, and builders who believe that talent is global, just like our data.
**Respect the Nuance.**
We don't force a "US Standard" on the world. We build systems that understand the difference between a `GmbH` in Germany and a `PT` in Indonesia.
**Automate the Boring.**
We don't just sell AI agents; we use them. If a task is repetitive, we build a bot to do it so we can focus on high-leverage creative work.
**Velocity is Quality.**
We deploy code daily. We believe the fastest way to learn is to put a feature in the hands of a user and see if it survives.
**Own Your Stack.**
We don't have layers of middle management. You own your roadmap, your code, and your results.
***
## We Hire Builders, Not Titles
We don't keep a traditional "Job Board." We believe that exceptional talent creates its own role.
Whether you are a Systems Engineer obsessed with distributed databases, a GTM Strategist who hates spam, or a Product Designer who loves complex interfaces — **we want to talk to you.**
Don't wait for a job description. If you see the vision, pitch us on how you can help us build it.
***
## Pitch Your Role
We hire based on ability, not keywords on a resume.
**Send us an email.**
Tell us who you are, what you've built, and what you want to do at Pubrio.
*Email:* **[careers@pubrio.com](mailto:careers@pubrio.com)**
> "The future is already here – it's just not very evenly distributed." — *William Gibson*
>
> **Help us distribute it.**
# Changelog
Source: https://docs.pubrio.com/en/resources/changelog
Latest updates and release history for the Pubrio platform.
Keep track of the evolution of the Pubrio Data Layer.
## 2026 Releases
* **New:** Docs now ship in Russian, Arabic, Spanish, German, French, and Portuguese, alongside existing English, Chinese, Japanese, and Korean — 10 languages total.
* **New:** [What a Company Profile Contains](/en/knowledge-base/concepts/company-intelligence) — hiring, tech stack, ad activity, news, and people, each with a real screenshot and its endpoint, in every language.
* **Improved:** The Expansion guides now show real product screenshots (the market map, company list, signal feed, competitor comparison) next to the explanations, replacing an outdated hero image and abstract-only diagrams.
* **New:** [Enums & Constants](/en/api-reference/enums) — every fixed value the API accepts or returns on one page: seniority ranks, job functions, ad sources and formats, reach tiers, publisher platforms, signal types, management levels.
* **New:** Search guides for [Job Search](/en/developer-guides/search/job-search), [News Search](/en/developer-guides/search/news-search) and [Advertisement Search](/en/developer-guides/search/advertisement-search) — filter tables, response walkthroughs and copy-paste recipes.
* **API:** Job Search documents `functions`, `seniority_ranks`, `launch_dates`, `location_ids`, `created_at` and `is_ascending_order`. Response rows now declare `functions`, `seniority_rank`, `source_type`, `base_salary`, `experience_requirement`, `education_requirement` and `employment_type`.
* **API:** Advertisement Search documents `active_dates`, `reach_tiers`, `exclude_source_types`, `created_at`, `advertisement_search_id` and `is_ascending_order`. `source_types` is corrected — it filters results (not only enrichment) and accepts `tiktok` and `apple`. Rows now declare `advertisement_format_normalized`, `advertiser`, `advertisement_url`, `is_company_matched` and the `total_impressions` triple; `metadata` documents `applied_source_types`, `unsupported_source_types`, `coverage_notes` and `skipped_source_types`.
* **API:** News Search documents `published_at`, `news_search_id` and `is_ascending_order`, and declares every row field including `expansion_signals` (returned when `is_expansion_signal_available` is set — this reverses the v2.3.1 removal, which was made before the flag shipped).
* **API:** People Search documents `exclude_people_titles`, `exclude_people_locations`, `exclude_departments`, `exclude_department_functions` and `company_exclude_locations`.
* **API:** Company Search documents `social_media` and `advertisement_status`.
* **API:** Every search endpoint now documents `metadata.ignored_fields` — unrecognised body keys are dropped, not rejected, and listed there. Job, News and Advertisement Search also declare `pagination` and a typed `metadata` block instead of a free-form object.
* **Docs:** Four schemas (`job_exclude_locations`, `advertisement_target_locations`, `advertisement_exclude_target_locations` and `domain_search_ids` on Expansion Rankings) wrote a description next to a `$ref`, which OpenAPI 3.0 silently discards. They now render.
* **API:** **Expansion Signal Search** (`POST /expansions/signals/search`) is now documented — query the raw, dated signal rows behind a company's stage instead of the companies they roll up into.
* **API:** **Expansion Lookup** (`POST /expansions/lookup`) is now documented — the deterministic sibling of Expansion Search that never auto-relaxes your filters, for dashboards and scheduled jobs that need reproducible results.
* **API:** Monitors watching `expansions` now have a documented filter vocabulary and webhook payload. [See Setting up Webhooks](/en/developer-guides/setting-up-webhooks).
* **API:** `is_include_metadata` is documented on Company Expansion Detail, Compare, Summaries and Rankings. API-key traffic is lean by default — set it to `true` to receive `confidence_score` and the full model detail.
* **API:** Expansion error codes (`40043`, `40360`, `40435`, `40436`) added to [Status Codes](/en/api-reference/status-codes).
* **Removed:** The `/companies/{jobs,news,advertisements}/export` reference pages. Export returns a CSV attachment against a separate `data_export_credit` balance and returns nothing that the corresponding Search endpoint does not already return as JSON — use Search with pagination instead.
* **Removed:** The `/people/enrichment` reference page, which documented an endpoint that was never released. To enrich a person, call [People Lookup](/en/api-reference/endpoint/people/lookup) with `is_enrichment_available: true`.
* **Docs:** `profile_id` removed from every request body. Your API key already identifies your workspace, and the parameter was ignored on API-key requests.
* **API:** Similar-company and similar-people search now document the reference identifier they require. Previously `/companies/search/similar` returned `41847 Missing parameter` for every documented parameter combination.
* **API:** [Company Enrichment](/en/api-reference/endpoint/companies/enrichment) documents the `jobs`, `news`, `advertisements` and `similar_companies` arrays it returns alongside the company record, and warns that the call routinely takes 30–60 seconds.
* **API:** Eight endpoints now declare the top-level `metadata` they return, including the `profile` block with `credit`, `topup_credit` and `total_credit_cost`.
* **API:** Company identifier endpoints document all nine accepted identifiers, adding `tiktok_url`, `wantedly_url`, `tw104_url`, `rocketpunch_url`, `remember_url` and `youtrust_url`.
* **Docs:** `41847 Missing parameter` — the API's most common error — added to [Status Codes](/en/api-reference/status-codes).
* **Docs:** [Authentication](/en/api-reference/authentication) now covers the `User-Agent` requirement. Clients with a generic user agent are blocked at the edge with `HTTP 403` and `error code: 1010`, which is easily mistaken for a bad API key.
* **Docs:** [Rate limit](/en/api-reference/rate-limits) documents the usage and quota fields returned by Profile Usage, including how `total_max_*` applies the licence multiplier.
* **API:** Expansion filters (`stages`, `signal_types`, `signal_strengths`, `freshness`, `momentum`, `polarity`) now list their allowed values, and each warns that an unrecognised value is silently discarded rather than rejected — dropping the filter on some parameters and matching nothing on others.
* **API:** `momentum` accepts `advancing`, `steady` and `pulling_back`. The `directions` values in Expansion Reference (`retreating`, `new`) are response values on `stage.direction` and were never valid as a filter.
* **API:** News Insights corrected — `mentions`, `topics`, `sources` and `top_source` are integer/string fields inside `data.totals`, not top-level arrays. `topics` and `sources` are counts of distinct values; the per-item lists are `category_breakdown` and `market_breakdown`.
* **API:** Advertisement Insights corrected — `postings[]` uses the abbreviated keys `r`, `m`, `ch`, `fo`, `n`; `reach_tiers[]` is a `{slug, label}` catalog with no counts; `creatives[]` documents all ten fields including `image_url`, `cta` and `has_video`.
* **API:** Channel template `parameters` keys vary by `channel_type_slug` — email, LinkedIn and Twilio templates each carry a different set.
* **Docs:** Removed response fields the API does not return: `referral_code` from User, `similarity_score` from Similar People, `funding_status` and `crunchbase_url` from LinkedIn Company Lookup, `expansion_signals` from News Search, and `occurs_at` / `occurs_until` from Expansion Signal Search.
* **Docs:** The status-code table has been rebuilt from the API's error table. Nine codes were wrong: `40075`, `40076`, `40091`, `40092` and `40095` were documented for pagination and quota failures but are really `41675`, `41676`, `41691`, `41692` and `41695` at **HTTP 416** — and each documented number is a live code for something unrelated. `40003`, `40602` and `40603` are really `40303`, `40632` and `40633`; `40099` does not exist.
* **Docs:** **HTTP 416** is now documented. Pagination and quota overflows return 416 with a `416xx` code, never a clamped result set.
* **Docs:** Added the monitor error family (`40020`–`40035`), including `40021` — `detection_mode` cannot be changed after a monitor is created.
* **API:** `per_page` caps at your plan's `max_search_per_page` (25 on most plans); `26` returns HTTP 416. `page` caps at `max_search_page`. Both limits, and every other plan ceiling, are returned by [Profile](/en/api-reference/endpoint/profile/profile) and are now listed on [Rate limit](/en/api-reference/rate-limits).
* **API:** `people_contact_types` accepts exactly `email-work`, `email-personal` and `phone`. An unrecognised value is **not** rejected — it returns HTTP 200 with `emails: null` and zero credit cost, which is indistinguishable from a person having no contact data.
* **API:** Redemption responses return `null`, not `[]`, for `emails` and `phones` when nothing is found.
* **API:** Channel template `create` parameters are now documented — `channel_node_id` is a UUID from Channel Template Types, and it determines which `parameters` keys are valid. `delete` takes numeric `channel_template_id` values and removes one version at a time.
* **API:** Monitor webhook validation performs a real signed delivery; a URL that only answers `GET` still fails, and `details` returns the upstream response body.
* **New Feature:** **Market Expansion API.** Track which companies are entering which markets, and how far along they are — a four-stage ladder (Exploring → Committing → Expanding → Scaling) built from real hiring, news, advertising, cloud-infrastructure, and event signals. Search by corridor with `froms` / `tos`, drill into a single company's market entry, and compare peers. [Start with the quickstart](/en/knowledge-base/concepts/expansion-api-quickstart).
* **New Feature:** **Natural-language search.** Pass a plain-English `query` to Expansion Search ("fintech companies expanding into the UK") and Pubrio interprets it into filters — with optional AI match explanations grounded in each company's real signals via `is_explain_match`.
* **API:** Results now default to a relevance order that puts corroborated movers (multiple independent signal types) first; pass `sort_by: "recent"` for pure recency.
* **API:** Monitors can now watch **expansion signals** (`signal_types: ["expansions"]`) alongside jobs, news, and advertisements, and a monitor can be drafted from a plain-English sentence via [Monitor Interpret](/en/api-reference/endpoint/monitors/interpret).
* **API:** Monitor lifecycle is now a single `status` field (`draft` / `active` / `paused` / `inactive`), replacing the previous `is_active` / `is_paused` booleans in requests and responses.
* **New Feature:** **Monitors.** Automated signal detection with real-time delivery — track job postings, company news, and ad campaigns across millions of companies without building your own polling pipeline. Define filters once, and Pubrio scans, enriches, and delivers matching signals to your webhook, email, or outreach sequence.
* **New Feature:** **Two Detection Modes.** Choose between **Signal First** (broad market scanning) and **Company First** (track named accounts) to match your prospecting workflow.
* **New Feature:** **Automatic People Enrichment.** Each monitor trigger can automatically find and redeem contacts at matched companies — multi-layer enrichment with configurable filters for management level, department, and title.
* **API:** Added 15 new Monitor endpoints — full CRUD, statistics, charts, detection logs, webhook validation, and test processing. [See the Monitor API reference](/en/api-reference/endpoint/monitors/create).
* **API:** `profile_id` is no longer required in request bodies. The API key now includes workspace information. The parameter is still accepted for backward compatibility.
* **API:** Added `operationId`, `summary`, `description`, and `tags` to all 59 API endpoints for improved AI agent and MCP tool compatibility.
* **Docs:** Enabled `llms.txt` for AI crawler discovery.
* **New Feature:** **AI Smart Lists (Beta).** Users can now upload CSVs and view them in a spreadsheet interface where Pubrio fills in missing columns automatically.
* **Data:** Added 3 million new verified entities in the DACH region (Germany, Austria, Switzerland).
* **API:** Faster response times (latency reduced by 200ms) for the `/enrich/company` endpoint.
* **New Feature:** **Ads Search Intelligence.** We now index ad transparency centers and paid search repositories. You can now see *if* a company is running ads, *where* they are spending, and *what* keywords they are targeting.
* **Improvement:** Enhanced "Tech Stack" detection for companies using non-standard localized software in LATAM.
***
## 2025 Archive: The Partner Year
2025 was defined by our major ecosystem integrations, bringing Pubrio data to the platforms you use every day.
* **Integration:** **Ottokit.** Launched the native connector for autonomous agent workflows.
* **Integration:** **Databar.** Added Pubrio as a verified provider in the Databar marketplace for no-code research.
* **Integration:** **Stripo.** Enabled "Push to Sequence" functionality, allowing design teams to sync HTML templates directly to Pubrio workflows.
* **Feature:** **Dynamic Variable Injection.** Allowed generic placeholders in templates to be resolved with real-time Pubrio data upon sending.
* **Integration:** **Clay Native Integration.** Became a default provider in the Clay enrichment menu.
* **Data:** Expanded the "Invisible 70%" coverage to include 15 new local registries across Asia-Pacific.
# B2B Data API Alternatives — Pubrio Comparisons
Source: https://docs.pubrio.com/en/resources/comparisons/overview
How Pubrio compares to ZoomInfo, Apollo, Cognism, and Lusha — find the right B2B data and enrichment provider for your team.
Looking for a B2B data and enrichment alternative? Here's how Pubrio compares to the most common providers, with honest framing on when each is the right fit.
## What makes Pubrio different
Most B2B data providers concentrate on the visible \~30% of the economy — well-known companies in a few professional networks, weighted toward North America. **Pubrio is built for the other 70%** — the long tail of real-world businesses and local champions outside mainstream datasets, in every region.
* **Glocalized data layer** — 50+ localized sources delivering global coverage with regional depth that mainstream NA-centric tools miss. Native multilingual data and documentation.
* **Free plan with no sales call** — sign up, get an API key, validate fit on your own ICP. ZoomInfo and Cognism are quote-only.
* **API parity across paid tiers** — full REST API on paid plans without separate entitlement add-ons. Both ZoomInfo and Cognism gate API access; Apollo gates the full API to its Organization tier.
* **Monitors: a developer-ready signal pipeline** — signal detection + enrichment + webhook delivery + retry, all in a single configuration. Replaces the polling loops, deduplication, and manual stitching that competitor signal endpoints leave to you. See the [Monitor integration guide](/en/developer-guides/introduction).
* **Pure data + signal layer** — Pubrio doesn't bundle a sequencer, dialer, or CRM. It feeds whatever engagement stack you already use (HubSpot, Outreach, Salesloft, Apollo, your own platform). No overlap with the tools your team already runs.
## Compare Pubrio to other providers
Free plan + global coverage + API parity vs the NA enterprise contact incumbent at \$15K–\$60K+/yr quote-only.
Global glocalized data layer vs NA mid-market with bundled Chrome extension, dialer, and lightweight CRM.
Lookalike + Free plan + global coverage vs European phone-verified contacts and GDPR-first positioning.
Global data + webhook-delivered Monitors vs Chrome-extension-led NA + UK prospecting.
## Choosing the right provider
A quick decision framework:
| If you... | Consider |
| --------------------------------------------------------------------------------------- | ---------- |
| Sell into NA enterprise with deep org-chart needs and have an enterprise budget | ZoomInfo |
| Want NA mid-market data with a deep Chrome extension, dialer, and lightweight CRM | Apollo |
| Need EU/UK phone-verified contacts with GDPR-first compliance | Cognism |
| Want simple per-credit pricing for individual NA + UK Chrome prospecting | Lusha |
| Want to start without a sales call on a Free plan | **Pubrio** |
| Want full API parity across paid tiers without entitlement gating | **Pubrio** |
| Need lookalike search alongside enrichment and signals | **Pubrio** |
| Need a webhook-delivered signal pipeline (not raw signal endpoints to stitch yourself) | **Pubrio** |
| Sell to global ICPs or the long tail of regional businesses outside mainstream networks | **Pubrio** |
## Honest scope notes
* **Lookalike search**, **real-time signals**, and **Chrome extensions** are not unique to any single vendor. Pubrio, Apollo, Lusha, and ZoomInfo all have lookalike. All five vendors have signals in some form. Lusha, Apollo, ZoomInfo, and Cognism all have Chrome extensions; Pubrio focuses on API + dashboard rather than browser-based prospecting.
* **Pubrio's defensible advantages** are pricing accessibility (Free plan, transparent per-credit, API parity across tiers), a webhook-delivered Monitor pipeline, and global coverage with long-tail depth that mainstream NA/EU-centric tools miss.
* **Where competitors clearly win:** ZoomInfo on NA enterprise depth + Engage suite. Apollo on NA mid-market density + Chrome workflow + bundled dialer/CRM. Cognism on EU + UK depth + Diamond Data verified mobile + GDPR positioning. Lusha on Chrome extension simplicity + low-friction free tier.
## Get started with Pubrio
Sign up on the Free plan and start enriching in minutes — no sales call.
Discuss your ICP and migration path with the Pubrio team.
Full REST API documentation — enrichment, search, lookup, redeem, monitors.
Concepts, best practices, and integration guides.
# Pubrio vs Apollo
Source: https://docs.pubrio.com/en/resources/comparisons/pubrio-vs-apollo
Comparing Pubrio and Apollo for B2B data and enrichment — pure global data + signal layer vs NA mid-market with bundled Chrome extension, dialer, and lightweight CRM.
## TL;DR
**Pubrio** is a glocalized B2B data and signal layer — global coverage with the long-tail and regional depth that NA-centric tools miss, available with a Free plan and full API parity across paid tiers. **Apollo** is a freemium NA-focused B2B database paired with a full sales-engagement bundle — sequencer, Chrome extension, dialer, lightweight CRM.
Both have free plans, public APIs, lookalike, and real-time signals. The decision usually comes down to two questions: **does your ICP extend beyond NA mid-market?** (Pubrio) and **do you want a bundled engagement platform vs feeding your existing stack via API?** (Apollo's bundle is duplicate cost if you already have HubSpot, Outreach, Salesloft, etc.)
## At a glance
| | Pubrio | Apollo |
| ------------------- | ------------------------------------------------ | ------------------------------------------------------ |
| Product positioning | Pure glocalized B2B data + signal layer | NA-centric data + sales engagement bundle |
| Best for | Global coverage, long-tail, API-driven workflows | NA mid-market SDR teams, Chrome-led outbound |
| Pricing model | Free plan + per-credit | Free plan + per-seat (\$49–\$149/seat/mo) + per-credit |
| API access model | Public REST across paid tiers | Full API typically gated to Organization tier |
| Database focus | 50+ localized sources, glocalized graph | 210M+ contacts (NA-weighted) |
## When Pubrio is the right choice
REST API available across paid tiers. Apollo's full API is gated to Organization tier; rate limits at lower tiers are often restrictive for production workloads.
Pubrio's API supports search queries against non-English company names, job titles, and locations natively. Apollo's API is English-primary.
Pubrio's technology, vertical, and specialty filters cover long-tail and regional companies. Apollo's tag taxonomy concentrates on well-known brands.
50+ localized sources deliver depth across APAC, broader EMEA, and emerging markets — territory where Apollo's NA-weighted graph thins out.
If HubSpot, Outreach, Salesloft, or Salesforce handles your sequencing and CRM, Apollo's bundled tools are duplicate cost. Pubrio feeds your existing platform via API and webhook.
## When Apollo is the right choice
Apollo's contact graph is densest where the buyer-base concentration is highest — North American mid-market and tech.
Apollo's deep extension across LinkedIn, Gmail, Salesforce, and HubSpot is a real time-saver for individual SDRs working in those surfaces.
Apollo includes a lightweight CRM (Kanban pipeline) and a US dialer (Professional+). Real value if you don't have these elsewhere.
Apollo's Starter plan is genuinely usable for solo operators and very small teams.
## Apollo API: known limitations to validate before committing
Apollo's marketed capabilities and what its API delivers in production can diverge significantly. Test these on your own ICP before you build pipelines on top of Apollo:
Even when matching contacts exist in Apollo's database, the People Search API frequently returns only a fraction of available people per query — or empty responses entirely — especially for non-NA companies, mid-market, and long-tail accounts. Many teams end up running multiple workaround queries and stitching results to assemble a usable list. Run a sample search on accounts you know well; compare what you get back against what's actually in your CRM.
Apollo's full API is gated to the Organization tier, and even there, per-minute and daily caps are tight enough to throttle normal enrichment pipelines. Teams routinely hit 429 errors during sustained usage and have to artificially space requests to stay within limits. If your expected request volume is anywhere close to "real production," validate the rate limits at your tier before integrating.
Queries against non-English company names (Japanese, Korean, Chinese), localized job titles, or regional vertical terms return limited or no results. This is structural, not a tuning issue — if your ICP includes non-English markets, the API can't reach them.
Apollo's technology, specialty, and industry filters concentrate on well-known mainstream brands. Long-tail and regional companies in your ICP often have sparse or missing tag coverage, which limits the precision of any targeted list you build.
These aren't deal-breakers for every team — Apollo's NA mid-market data is genuinely strong. But for global ICPs, multilingual markets, or high-volume API workloads, run the validation before committing.
## Capability comparison
### Core data capabilities
| Capability | Pubrio | Apollo |
| --------------------------------------- | ---------- | ---------------------------------------- |
| Company search & filtering | ✅ | ✅ |
| People search & filtering | ✅ | ✅ |
| Company enrichment | ✅ | ✅ |
| People enrichment (email, phone) | ✅ | ✅ |
| LinkedIn URL lookup | ✅ | ✅ |
| Lookalike / similar companies | ✅ | ✅ Up to 5 seed companies, weekly refresh |
| Real-time signals (jobs, news, funding) | ✅ Monitors | ✅ Intent on higher tiers |
| Webhook delivery | ✅ Native | ✅ |
### Pricing & accessibility
| | Pubrio | Apollo |
| ------------------------------ | ------ | --------------------------------------- |
| Free plan | ✅ | ✅ Free-forever Starter |
| Self-serve sign-up | ✅ | ✅ |
| Transparent per-credit pricing | ✅ | ✅ (alongside per-seat) |
| API parity across paid tiers | ✅ | — (full API gated to Organization tier) |
| No per-seat tax | ✅ | — (\$49–\$149/seat/mo) |
### Geographic & language coverage
| | Pubrio | Apollo |
| ----------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------- |
| Localized data sources | ✅ 50+ regional sources | NA-centric (210M+ contacts, NA-weighted) |
| Multilingual data coverage | ✅ Many languages (en, zh, ja, ko, hi, pt-BR, es, and more) | English-primary |
| Documentation languages | ✅ en, zh, ja, ko | English-only |
| Multilingual API search (non-English queries) | ✅ | — (English-primary) |
| Filter depth for long-tail / regional companies | ✅ | — (skews to mainstream brands) |
| Long-tail / non-mainstream business coverage | ✅ Built for the 70% | NA mid-market focus |
| Depth across APAC, EMEA, emerging markets | ✅ | Limited |
### Bundled platform tools
Apollo bundles a full sales-engagement stack alongside its data — sequencer, US dialer (Professional+), lightweight CRM (Kanban pipeline), and a deep Chrome extension across LinkedIn, Gmail, Salesforce, and HubSpot. Pubrio is a pure data and signal layer; it integrates into whatever engagement stack you already use (HubSpot, Outreach, Salesloft, Salesforce, Apollo itself, or your own).
If you need a bundled engagement platform, Apollo includes one. If you already have an engagement layer, Pubrio gives you the data and signals to feed it without paying for tools you already own.
## "Where do you sell?" is the real question
Pubrio and Apollo overlap heavily on data capabilities — both have APIs, lookalikes, signals, freemium tiers. The two practical decisions:
NA mid-market → Apollo's contact density is hard to beat. Global, long-tail, or beyond mainstream professional networks → Pubrio's glocalized graph is structurally different.
Apollo includes sequencer, dialer, CRM, browser extension. If you already have HubSpot, Outreach, Salesloft, or are building your own engagement layer, those are duplicate cost. Pubrio is the data + signal layer that feeds whatever stack you already run.
## Monitors: a developer-ready signal pipeline
Pubrio's [Monitors](/en/api-reference/endpoint/monitors/monitors) wrap signal detection, company enrichment, optional people enrichment, and webhook delivery into a single configuration — no polling loops, no state tracking, no manual stitching of separate API calls.
`frequency_minute: 0` — signals delivered as detected, no polling required.
No state tracking on your end. Pubrio handles which signals you've already seen.
Signal + company enrichment + people enrichment in a single configuration. No multi-call stitching.
Auto-pause on repeated failure. Full delivery history visible in the dashboard.
Apollo exposes signal/intent endpoints and supports webhooks, but combining filters → enrichment → delivery typically requires assembling multiple API calls and your own pipeline logic. Pubrio Monitors are a single integrated configuration.
→ See the [Monitor integration guide](/en/developer-guides/introduction) for setup, webhook validation, and end-to-end examples.
## Switching from Apollo (or running both)
Sign up at [dashboard.pubrio.com](https://dashboard.pubrio.com) on the Free plan.
Pick 100–500 accounts where Apollo's match rate has been lowest — typically outside NA mid-market. Enrich through both. Compare match rate, recency, and field depth.
Most teams pull enrichment via API into HubSpot, Salesforce, Outreach, or Salesloft. See the [Knowledge Base](/en/knowledge-base/introduction) for integration patterns.
Many teams keep Apollo for NA Chrome workflows and add Pubrio for global / API-driven enrichment. Others migrate fully once parity is confirmed.
## Get started with Pubrio
Sign up on the Free plan and start enriching in minutes.
Discuss your geography, stack, and migration path with the Pubrio team.
Full REST API documentation — enrichment, search, lookup, redeem, monitors.
Concepts, best practices, and integration guides.
# Pubrio vs Cognism
Source: https://docs.pubrio.com/en/resources/comparisons/pubrio-vs-cognism
Comparing Pubrio and Cognism for B2B data and enrichment — global glocalized data with lookalike and Free plan vs European phone-verified contacts and GDPR-first positioning.
## TL;DR
**Pubrio** is a glocalized B2B data layer — global coverage with the long-tail and regional depth that mainstream tools miss, available with a Free plan, transparent per-credit pricing, and lookalike search out of the box. **Cognism** is the EU/UK-strong B2B contact provider — built around "Diamond Data" (human-verified mobile numbers) and central GDPR positioning, with quote-only enterprise pricing.
Pick Pubrio if you want lookalike search, a Free plan to start, or your ICP extends beyond EU/UK. Pick Cognism if EU/UK is your primary market and verified mobile phones drive your motion.
## At a glance
| | Pubrio | Cognism |
| --------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------ |
| Product positioning | Glocalized B2B data layer (50+ localized sources) | EU/UK-strong contact platform with Diamond Data + GDPR focus |
| Best for | Global / long-tail coverage, lookalike-driven prospecting, accessible entry | EU/UK enterprise, phone-verified outreach, GDPR procurement |
| Pricing accessibility | Free plan + transparent per-credit | Quote-only (Standard / Pro), annual contract |
| Onboarding friction | Self-serve, no sales call | Data sample on request; no advertised free trial |
| API access model | Public REST across paid tiers | Search/Redeem/Enrichment API behind entitlement add-on |
## When Pubrio is the right choice
Pubrio supports lookalike / similar-company discovery natively. Cognism does not appear to offer this as a documented feature.
Free plan and per-credit pricing let you validate fit on your own ICP before commitment. Cognism is quote-only.
REST API available on paid plans without separate entitlement add-ons. Cognism's API requires a paid entitlement add-on.
Built for the 70% of the economy outside mainstream professional networks — local champions, regional businesses, mid-market accounts that don't surface cleanly in EU/UK-centric or NA-centric datasets.
50+ localized sources deliver depth across NA, APAC, broader EMEA, and emerging markets — territory outside Cognism's home turf.
## When Cognism is the right choice
Cognism's data graph in the UK, DACH, France, Benelux, and Nordics is genuinely strong — they publicly claim \~2× European contact volume vs ZoomInfo.
"Diamond Data" — human-called mobile verification — is a real differentiator if cold-calling drives your pipeline.
Cognism's compliance posture (notification timeframes, 15 DNC list scrubbing) is central to the product, not bolted on.
For procurement, contracting, or data residency reasons, some buyers prefer this.
## Capability comparison
### Core data capabilities
| Capability | Pubrio | Cognism |
| --------------------------------------- | ---------- | ------------------------------------ |
| Company search & filtering | ✅ | ✅ |
| People search & filtering | ✅ | ✅ |
| Company enrichment | ✅ | ✅ |
| Email enrichment | ✅ | ✅ |
| Phone enrichment | ✅ | ✅ "Diamond Data" mobile verification |
| LinkedIn URL lookup | ✅ | ✅ |
| Lookalike / similar companies | ✅ | — (not publicly documented) |
| Real-time signals (jobs, news, funding) | ✅ Monitors | ✅ Intent + triggers |
| Webhook delivery | ✅ Native | — (not publicly documented) |
### Pricing & accessibility
| | Pubrio | Cognism |
| ------------------------------ | ------ | ---------------------- |
| Free plan | ✅ | — (data sample only) |
| Self-serve sign-up | ✅ | — (sales-led) |
| Transparent per-credit pricing | ✅ | — (quote-only) |
| API parity across paid tiers | ✅ | — (entitlement add-on) |
| No annual contract required | ✅ | — |
### Geographic & language coverage
| | Pubrio | Cognism |
| -------------------------------------------- | ---------------------------------------------------------- | ---------------------- |
| Localized data sources | ✅ 50+ regional sources | EU/UK depth |
| Multilingual data coverage | ✅ Many languages (en, zh, ja, ko, hi, pt-BR, es, and more) | English-primary |
| Documentation languages | ✅ en, zh, ja, ko | English-only |
| Long-tail / non-mainstream business coverage | ✅ Built for the 70% | EU/UK enterprise focus |
| Depth across APAC, NA, emerging markets | ✅ | Narrower outside EU/UK |
### Bundled platform tools
Cognism bundles Engage (sequencer + native dialer) and a Chrome extension alongside its data. Pubrio is a pure data and signal layer; it integrates into whatever engagement stack you already use (HubSpot, Outreach, Salesloft, your own, or even Cognism Engage).
## Geography is one factor — feature parity matters too
The clearest practical difference IS geography (Pubrio = global / Cognism = EU/UK), but two capability differences also tip the decision:
Pubrio has it natively; Cognism doesn't appear to. If lookalike-driven prospecting is part of your motion, this is a real gap.
Pubrio's Monitors deliver enriched signals to your webhook in one config. Cognism's signal endpoints don't ship with documented webhook delivery.
## Monitors: a developer-ready signal pipeline
Pubrio's [Monitors](/en/api-reference/endpoint/monitors/monitors) wrap signal detection, company enrichment, optional people enrichment, and webhook delivery into a single configuration — no polling loops, no state tracking, no separate API stitching.
`frequency_minute: 0` — signals delivered as detected, no polling required.
No state tracking on your end. Pubrio handles which signals you've already seen.
Signal + company enrichment + people enrichment in a single configuration. No multi-call stitching.
Auto-pause on repeated failure. Full delivery history visible in the dashboard.
Cognism offers Bombora-powered intent (Pro tier) and job/funding triggers, but webhook delivery is not publicly documented — most signal workflows require pulling data into your own pipeline first. Pubrio Monitors deliver fully enriched signals to your webhook in one config.
→ See the [Monitor integration guide](/en/developer-guides/introduction) for setup, webhook validation, and end-to-end examples.
## Switching from Cognism
Sign up at [dashboard.pubrio.com](https://dashboard.pubrio.com) on the Free plan. Per-credit pricing means no commitment to evaluate.
Pick 100–500 accounts weighted toward your weakest Cognism coverage. Enrich through both. Compare match rate, recency, and contact field depth.
If you've been working around Cognism's lack of native lookalike, run Pubrio's lookalike against your top accounts and evaluate ICP-match quality.
Run both in parallel for one cycle. [Get in touch](https://pubrio.com/en/get-in-touch) for migration support — especially around contract and credit-allocation planning.
## Get started with Pubrio
Sign up on the Free plan and start enriching in minutes.
Discuss your geography and migration path with the Pubrio team.
Full REST API documentation — enrichment, search, lookup, redeem, monitors.
Concepts, best practices, and integration guides.
# Pubrio vs Lusha
Source: https://docs.pubrio.com/en/resources/comparisons/pubrio-vs-lusha
Comparing Pubrio and Lusha for B2B data and enrichment — global glocalized data with webhook-delivered Monitors vs Chrome-extension-led NA + UK prospecting.
## TL;DR
**Pubrio** is a glocalized B2B data layer — global coverage with the long-tail and regional depth that NA-centric tools miss, plus a webhook-delivered Monitor pipeline for real-time signal integration. **Lusha** is the Chrome-extension-led B2B contact provider — strong NA + UK coverage, simple per-credit pricing with a free tier, and a recently expanded API surface across four products (Enrichment, Prospecting, Signals, Lookalike).
Both are pure data and signal providers without bundled sequencers — both integrate into your existing engagement stack. The decision usually comes down to: **does your ICP extend beyond NA + UK?** (Pubrio) and **do you primarily prospect in Chrome on LinkedIn?** (Lusha).
## At a glance
| | Pubrio | Lusha |
| ------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Product positioning | Glocalized B2B data + Monitor signal pipeline | NA/UK contact data + Chrome extension |
| Best for | Global coverage, long-tail, API + webhook workflows | NA + UK prospecting, Chrome-extension users |
| Pricing model | Free plan + per-credit | Free \$0 (70 credits/mo), Starter \$49.90/mo (400), Pro \$69.90/mo (600), Premium \$399.90/mo (3,400) |
| API surface | Public REST, uniform across paid tiers | 4 named APIs: Enrichment, Prospecting, Signals, Lookalike |
| Signal delivery | Webhook (Monitors) — single-config pipeline | API endpoints; webhook delivery not publicly documented |
## When Pubrio is the right choice
Built for the 70% of the economy outside mainstream professional networks — local champions, regional businesses, mid-market accounts that don't surface cleanly in NA-centric tools.
50+ localized sources deliver depth across APAC, broader EMEA, and emerging markets — regions where multiple third-party reviews flag thinning Lusha coverage.
Monitors deliver fully enriched signal events to your webhook in one config. Lusha's Signals API exposes triggers, but webhook + combined enrichment in one configuration aren't publicly documented.
One REST API across all paid plans. Lusha splits its API surface into four separate products — you may need to integrate against multiple endpoints to cover what Pubrio handles in one.
## When Lusha is the right choice
Lusha's extension across LinkedIn, Sales Navigator, Gmail, and CRM is genuinely fast for individual SDRs working in those surfaces.
Lusha's data depth is strongest in these regions.
70 credits/month on the free tier is enough for solo operators to validate fit.
Lusha's four named APIs (Enrichment, Prospecting, Signals, Lookalike) make the surface area explicit if your team prefers that mental model.
## Capability comparison
### Core data capabilities
| Capability | Pubrio | Lusha |
| ------------------------------------------- | ---------- | ------------------------------------------------------- |
| Person lookup (email, phone) | ✅ | ✅ (1 credit email / 10 credits phone) |
| Company lookup | ✅ | ✅ |
| LinkedIn URL lookup | ✅ | ✅ |
| Person search with filters | ✅ | ✅ Prospecting API |
| Company search with filters | ✅ | ✅ Prospecting API |
| Lookalike / similar companies | ✅ | ✅ Lookalike API |
| Real-time signals (jobs, news, ads) | ✅ Monitors | ✅ Signals API (job changes, promotions, hiring, growth) |
| Webhook delivery for signals | ✅ Native | — (not publicly documented) |
| Combined signal + enrichment in one trigger | ✅ Monitors | — (separate API calls) |
### Pricing & accessibility
| | Pubrio | Lusha |
| ------------------------------ | ------ | --------------------------- |
| Free plan | ✅ | ✅ 70 credits/mo |
| Self-serve sign-up | ✅ | ✅ |
| Transparent per-credit pricing | ✅ | ✅ |
| Uniform API across paid tiers | ✅ | — (4 separate API products) |
### Geographic & language coverage
| | Pubrio | Lusha |
| ------------------------------------------------- | ---------------------------------------------------------- | --------------------------------- |
| Localized data sources | ✅ 50+ regional sources | NA + UK focus |
| Multilingual data coverage | ✅ Many languages (en, zh, ja, ko, hi, pt-BR, es, and more) | English-primary |
| Documentation languages | ✅ en, zh, ja, ko | English-only |
| Long-tail / non-mainstream business coverage | ✅ Built for the 70% | Mainstream NA + UK |
| Depth across APAC, broader EMEA, emerging markets | ✅ | Limited (per third-party reviews) |
### Bundled platform tools
Lusha bundles a deep Chrome extension across LinkedIn, Sales Navigator, Gmail, and CRM. Pubrio focuses on the API + dashboard surface and doesn't ship a browser extension. Neither bundles a sequencer or dialer — both are pure data and signal layers that integrate into your engagement stack.
## What actually differentiates them
Lusha has expanded considerably — the four named APIs (Enrichment, Prospecting, Signals, Lookalike) put its data surface much closer to Pubrio than older comparisons would suggest. Most core data capabilities are at parity. The two practical decisions:
NA + UK with Chrome workflow → Lusha is fast and cheap. Global, long-tail, or beyond mainstream networks → Pubrio's glocalized graph is structurally different.
Pull from Lusha's Signals API and stitch enrichment + delivery yourself, or subscribe once and get enriched signals delivered to your webhook via Pubrio Monitors.
## Monitors: a developer-ready signal pipeline
Pubrio's [Monitors](/en/api-reference/endpoint/monitors/monitors) wrap signal detection, company enrichment, optional people enrichment, and webhook delivery into a single configuration — no polling loops, no state tracking, no manual stitching of multiple API calls.
`frequency_minute: 0` — signals delivered as detected, no polling required.
No state tracking on your end. Pubrio handles which signals you've already seen.
Signal + company enrichment + people enrichment in a single configuration. No multi-call stitching.
Auto-pause on repeated failure. Full delivery history visible in the dashboard.
Lusha's Signals API exposes job changes, hiring, growth, and other triggers — but webhook delivery and combined enrichment in a single configuration are not publicly documented. You typically pull signals, then enrich, then deliver from your own pipeline.
→ See the [Monitor integration guide](/en/developer-guides/introduction) for setup, webhook validation, and end-to-end examples.
## Switching from Lusha (or adding Pubrio alongside)
Sign up at [dashboard.pubrio.com](https://dashboard.pubrio.com) on the Free plan.
Pick 100–500 accounts where Lusha's match rate has been lowest. Enrich through both. Compare match rate, recency, and field completeness.
Most teams pull enrichment via API into HubSpot, Salesforce, Clay, n8n, or their own pipeline. See the [Knowledge Base](/en/knowledge-base/introduction) for integration patterns.
Many teams keep Lusha for NA Chrome lookups and add Pubrio for global / API-driven enrichment + webhook signals. Others migrate fully once parity is confirmed for their ICP.
## Get started with Pubrio
Sign up on the Free plan and start enriching in minutes.
Discuss your ICP and automation use case with the Pubrio team.
Full REST API documentation — enrichment, search, lookup, redeem, monitors.
Concepts, best practices, and integration guides.
# Pubrio vs ZoomInfo
Source: https://docs.pubrio.com/en/resources/comparisons/pubrio-vs-zoominfo
Comparing Pubrio and ZoomInfo for B2B data and enrichment — accessible global data with Free plan and full API parity vs the NA enterprise contact incumbent at $15K–$60K+/yr quote-only pricing.
## TL;DR
**Pubrio** is a glocalized B2B data layer — global coverage with the long-tail and regional depth that NA-centric tools miss, available with a Free plan, transparent per-credit pricing, and full API parity across paid tiers. **ZoomInfo** is the incumbent enterprise contact database — strongest in NA, with an integrated platform (Engage, ReachOut, Scoops) and quote-only pricing typically running \$15K–\$60K+ per year.
Pick Pubrio if you want to start without a sales call, need API access without entitlement gating, or your ICP extends beyond mainstream NA enterprise. Pick ZoomInfo if NA enterprise is your sole market and a 12-month enterprise contract is a fit.
## At a glance
| | Pubrio | ZoomInfo |
| --------------------- | ----------------------------------------------------------- | ---------------------------------------------------------- |
| Product positioning | Glocalized B2B data layer (50+ localized sources) | NA-centric enterprise contact platform |
| Best for | Global coverage, long-tail businesses, API-driven workflows | NA enterprise sales teams, integrated platform users |
| Pricing accessibility | Free plan + transparent per-credit | Quote-only, \~\$15K–\$60K+/yr (third-party reports) |
| Onboarding friction | Self-serve, no sales call | Sales-qualified form required |
| API access model | Public REST across paid tiers | Behind separate Enterprise/Scaling/Monitoring entitlements |
## When Pubrio is the right choice
Free plan and per-credit pricing let you sign up, get an API key, and validate fit on your own ICP. ZoomInfo's trial is sales-qualified and gated.
REST API available on all paid plans without separate entitlement add-ons. ZoomInfo gates Enterprise/Scaling/Monitoring APIs as paid entitlements.
Built for the 70% of the economy outside mainstream professional networks — local champions, regional businesses, mid-market accounts that don't surface in NA-centric datasets.
50+ localized sources deliver depth across regions NA-centric tools miss — including APAC, broader EMEA, and emerging markets.
## When ZoomInfo is the right choice
ZoomInfo's NA contact graph and org-chart depth remain the industry benchmark.
Engage (sequences + dialer), ReachOut (extension), and Scoops (signal triggers) are all native — useful if you'd rather standardize on one vendor than assemble a stack.
ZoomInfo's quote-led model fits buyers who want a single consolidated agreement, not pay-as-you-go metering.
Migration cost is real; sometimes the right answer is to stay.
## Capability comparison
### Core data capabilities
| Capability | Pubrio | ZoomInfo |
| --------------------------------------- | ---------- | --------------------------------------- |
| Company search & filtering | ✅ | ✅ |
| People search & filtering | ✅ | ✅ |
| Company enrichment | ✅ | ✅ |
| People enrichment (email, phone) | ✅ | ✅ |
| LinkedIn URL lookup | ✅ | ✅ |
| Lookalike / similar companies | ✅ | ✅ |
| Real-time signals (jobs, news, funding) | ✅ Monitors | ✅ Scoops |
| Intent data | ✅ | ✅ Streaming Intent |
| Webhook delivery | ✅ Native | ✅ Behind Scaling/Monitoring entitlement |
### Pricing & accessibility
| | Pubrio | ZoomInfo |
| ------------------------------ | ------ | ---------------------- |
| Free plan | ✅ | — (gated trial only) |
| Self-serve sign-up | ✅ | — (sales-qualified) |
| Transparent per-credit pricing | ✅ | — (quote-only) |
| API parity across paid tiers | ✅ | — (entitlement gating) |
| No annual contract required | ✅ | — (12-month minimum) |
### Geographic & language coverage
| | Pubrio | ZoomInfo |
| -------------------------------------------- | ---------------------------------------------------------- | --------------------------- |
| Localized data sources | ✅ 50+ regional sources | NA-centric |
| Multilingual data coverage | ✅ Many languages (en, zh, ja, ko, hi, pt-BR, es, and more) | English-primary |
| Documentation languages | ✅ en, zh, ja, ko | English-only |
| Long-tail / non-mainstream business coverage | ✅ Built for the 70% | Concentrated on visible 30% |
| Depth across APAC, EMEA, emerging markets | ✅ | Limited |
### Bundled platform tools
ZoomInfo bundles a full sales-engagement platform alongside its data — Engage (Salesflows + Sales Dialer) and the ReachOut Chrome extension. Pubrio is a pure data and signal layer; it integrates into whatever engagement stack you already use (Apollo, HubSpot, Outreach, Salesloft, Salesforce, or your own).
If you need a bundled engagement platform, ZoomInfo includes one. If you have your own engagement stack, Pubrio gives you the data and signals to feed it without paying for tools you already own.
## Monitors: a developer-ready signal pipeline
Pubrio's [Monitors](/en/api-reference/endpoint/monitors/monitors) wrap signal detection, company enrichment, optional people enrichment, and webhook delivery into a single configuration — no polling loops, no state tracking, no separate webhook entitlement.
`frequency_minute: 0` — signals delivered as detected, no polling required.
No state tracking on your end. Pubrio handles which signals you've already seen.
Signal + company enrichment + people enrichment in a single configuration. No multi-call stitching.
Auto-pause on repeated failure. Full delivery history visible in the dashboard.
ZoomInfo offers Scoops + Streaming Intent for signals and webhooks via the Scaling/Monitoring API entitlement, but they're separately configured products with separate paid entitlements — not a single integrated pipeline.
→ See the [Monitor integration guide](/en/developer-guides/introduction) for setup, webhook validation, and end-to-end examples.
## Switching from ZoomInfo
Sign up at [dashboard.pubrio.com](https://dashboard.pubrio.com) on the Free plan. No sales call, no contract.
Pick 100–500 accounts from your CRM — ideally weighted toward where ZoomInfo's match rate or recency has been weakest. Enrich through both providers and compare match rate, contact recency, and field completeness.
Pubrio's Monitors deliver real-time jobs, news, and ad signals with built-in enrichment. Compare against ZoomInfo Scoops / Streaming Intent for noise, latency, and credit cost.
Most teams run both in parallel for one cycle, then migrate enrichment workflows once parity is confirmed for their ICP. [Get in touch](https://pubrio.com/en/get-in-touch) for migration support.
## Get started with Pubrio
Sign up on the Free plan and start enriching in minutes.
Discuss your ICP and migration path with the Pubrio team.
Full REST API documentation — enrichment, search, lookup, redeem, monitors.
Concepts, best practices, and integration guides.
# Free Company Logo Lookup
Source: https://docs.pubrio.com/en/resources/free-tools/logo-lookup
Get any company logo by domain — free, no signup, no credit card. Embed in your CRM, slides, marketing pages, or apps. A free utility from Pubrio.
Type a domain. Get a logo. That's it.
A free utility from Pubrio — no signup, no API key, no credit card. Use it in your CRM, slides, marketing pages, customer logo walls, dashboards, or apps. Forever free.
## Try any company
Just swap the domain in the URL: `https://logo.pubrio.com/{any-domain.com}`.
## What you can build with it
"Trusted by" sections, integration grids, partner pages — fed straight from a list of domains. No more chasing high-res logos from each customer.
Drop a logo into any slide by typing the domain. No download, no resize, no Slack-asking the marketing team for a brand-approved file.
See a real logo next to every account in your CRM, BI dashboard, or internal tool — instead of generic gray squares or initials.
Add the recipient's company logo to email signatures, sequences, or landing pages. Each render fetches the freshest version automatically.
Render a clean grid of portfolio companies, customers, or competitors by domain — including private and international companies.
Hook it into Notion, Airtable, Retool, Linear, or any spreadsheet. Anywhere a domain lives, a logo can live next to it.
## Why it's free
Pubrio is a glocalized B2B data layer — companies, contacts, and real-time signals across 50+ regional sources. The Logo API is a free utility we keep open because:
A company's logo is its public identity. Surfacing it from a domain shouldn't require a signup form or a credit card.
Designers, marketers, and ops folks discover Pubrio through this tool. When you later need company data or contacts, you already know us.
Logos are cached at the CDN edge. Serving them at scale costs us little — and saves your team a meaningful amount of repetitive work.
## Frequently asked questions
Yes. No signup. No API key. No credit card. No hidden quota that suddenly kicks in. The Logo API is a free public utility from Pubrio.
Yes — including in customer-facing apps, marketing pages, sales decks, and investor materials. The logos belong to their respective companies; Pubrio just makes them easy to find. Standard fair-use guidelines apply (don't imply endorsement, don't alter the marks).
Not required, but appreciated. A small "Logos by Pubrio" link helps other teams discover the tool. If you'd rather not link, that's fine too.
Unknown domains return a neutral placeholder image instead of a broken icon. Your design stays clean even when a logo isn't available.
Yes. Logos are served from a global CDN. Embed them directly in your HTML — no server-side proxy needed.
Yes. The Logo API is funded by Pubrio's paid platform (company data, contact data, real-time signals). The free tier helps people discover Pubrio; we have no plans to take it away.
Pubrio's data sources cover 50+ regional and international sources, including private companies, regional businesses, and brands outside the US-centric long-tail. Coverage extends well beyond what mainstream stock-image services include.
## Pubrio also does the rest
If you find the Logo API useful, the same domain unlocks a lot more on Pubrio's paid platform.
Employee count, industry, location, technologies in use, funding history, and more — by domain.
Find the right people at any company by role, seniority, or department — with verified emails and phone numbers.
Hiring, news, funding, and ad signals delivered to your Webhook the moment they happen.
50+ regional data sources covering markets, languages, and long-tail companies that NA-centric tools miss.
## For developers
If you want to embed the Logo API in your code, see the [Logo API reference](/en/api-reference/logo-api) for the full URL contract, code examples in HTML / JavaScript / Python / curl, and a migration guide from other providers.
`https://logo.pubrio.com/{domain}` — no signup needed.
Free plan with credits — for company data, contacts, and signals.
# Pubrio Integrations
Source: https://docs.pubrio.com/en/resources/integrations
Connect Pubrio to Clay, Ottokit, Databar, Stripo, HubSpot, Salesforce, and any tool with a REST API or webhook — native partner integrations and developer patterns.
Pubrio is API-first. Every endpoint is REST + JSON, and [Monitors](/en/api-reference/endpoint/monitors/monitors) deliver enriched signal data via webhook in a single configuration. If your destination accepts an API call or a webhook, you can integrate Pubrio.
Below: published partner integrations, developer integration patterns, and what's on the roadmap.
## Partner integrations
Combine Clay's orchestration with Pubrio's glocal data layer — enrich global leads and reach the hidden 70% of the market.
Fuel autonomous agents with Pubrio's ground-truth data for navigating the global economy.
Enrich Databar spreadsheets with glocal intelligence — no-code access to Pubrio data.
Push responsive Stripo email templates directly into Pubrio Sequences.
## Build your own integration
Pubrio's REST API and webhook-based Monitors connect cleanly to any system that accepts HTTP calls. Three primary patterns:
Call enrichment, search, lookup, and redeem endpoints directly from your application or pipeline.
Subscribe to real-time signals (jobs, news, ads) with automatic enrichment delivered to your webhook.
Header-based API key authentication — same scheme across every endpoint.
## Common integration patterns
| Pattern | What it looks like | Pubrio components |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **CRM enrichment** | Pull people/company data into HubSpot, Salesforce, Pipedrive, or your custom CRM via API | [Enrichment](/en/api-reference/endpoint/companies/enrichment) + [Search](/en/api-reference/endpoint/companies/search) endpoints |
| **Lead scoring pipeline** | Enrich inbound leads server-side, score them, route to the right rep | Enrichment + [Lookalike](/en/api-reference/endpoint/companies/similar) + your scoring logic |
| **Real-time alerting** | "Notify Slack when companies in my ICP post a new AI job" — without building a polling loop | [Monitors](/en/api-reference/endpoint/monitors/monitors) → webhook → Slack/Teams/email |
| **No-code automation** | Connect Pubrio to Zapier, Make, n8n, or workflow tools via REST + webhooks | API + Monitor webhook destinations |
| **Sequence automation** | Auto-enroll matched contacts into your outreach sequencer (HubSpot, Outreach, Salesloft, Apollo, etc.) when triggers fire | Monitor webhook → your sequencer's enrollment endpoint |
| **Spreadsheet enrichment** | Bulk-enrich a CSV of accounts or contacts | Enrichment endpoints + batch redeem |
## Integration with workflow platforms
Pubrio's REST API works with any platform that supports HTTP calls. Common configurations:
* **Zapier / Make / n8n / Pipedream** — use the generic HTTP/Webhook action with `pubrio-api-key` header authentication. Monitor webhooks deliver enriched signals to any of these platforms.
* **HubSpot / Salesforce / Pipedrive** — call enrichment endpoints from server-side functions or middleware (Workato, Tray.io, custom Lambda) to populate fields.
* **Clay / Cargo / Databar** — covered by published partner integrations above.
* **Slack / Teams / Discord** — point a Monitor webhook destination at the platform's incoming webhook URL.
## Coming soon
From our [product roadmap](/en/resources/product-roadmap):
* **Native HubSpot Enrichment App** — sidebar app showing localized Pubrio data (headcount, intent) inside the HubSpot Company view
* **Salesforce 2-way sync** — bi-directional sync; buying signals detected in Pubrio automatically update Lead Score in Salesforce
## Need an integration we don't list?
If you'd like Pubrio integrated with a specific tool — or you've built one we should feature — get in touch. We prioritize integrations by demand.
Sign up on the Free plan and start building.
Tell us about the integration you need.
Webhooks, Monitor setup, filter conditions, and end-to-end examples.
Full REST API documentation.
# Product Roadmap
Source: https://docs.pubrio.com/en/resources/product-roadmap
The 2026 vision for the Pubrio Data Layer.
# 2026: The Year of the AI Spreadsheet
In 2025, we connected the ecosystem. In 2026, we are reimagining how you interact with the data itself.
Our focus for the year is **"Data Enrichment First."** We are building the ultimate staging area - an **AI-Powered Spreadsheet** interface - where teams can clean, enrich, and verify global data before syncing it to their systems of record (Salesforce, HubSpot, etc.).
**Partner-First Philosophy:** We build the data layer so you don't have to. Our roadmap is designed to empower revenue teams and ISVs, not replace their core workflows.
## Strategic Pillars for 2026
A spreadsheet-like interface to view, enrich, and filter your CRM data with Pubrio signals in real-time.
Adding 20+ new "offline" data sources in emerging markets to deepen our "Invisible 70%" coverage.
True 2-way sync with Salesforce & HubSpot. Enrich data in Pubrio and push clean updates back automatically.
***
## Q1-Q2 2026: The Enrichment Workspace
*Focus: Giving teams a visual interface to manage their data quality.*
| Status | Feature | Description |
| :------------------------------- | :--------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
| **Beta** | **AI Smart Lists** | A dynamic spreadsheet view. Upload a raw CSV and watch Pubrio’s AI agents fill in the missing cells (Revenue, Tech Stack, Emails) row-by-row. |
| **Beta** | **CRM "Health Check"** | Connect your CRM. We analyze your account list and flag outdated info, duplicates, or "Ghost" companies that no longer exist. |
| **Live** | **APAC Deep Dive** | Added 8 new government registry sources for Indonesia, Thailand, and Vietnam. |
## Q3-Q4 2026: Ecosystem Sync
*Focus: Seamlessly moving enriched data back to your system of record.*
| Status | Feature | Description |
| :-------------------------------- | :-------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------- |
| **Planned** | **Salesforce 2-Way Sync** | Real-time bi-directional sync. If a "Buying Signal" is detected in Pubrio, it automatically updates the Lead Score field in Salesforce. |
| **Planned** | **HubSpot Enrichment App** | A native sidebar app for HubSpot. View localized Pubrio data (Headcount, Intent) directly inside the HubSpot Company view. |
| **Planned** | **"Offline" Entity Verification** | A strict verification badge for businesses with no website but verified tax/government records (crucial for Logistics/Manufacturing). |
***
## Long-Term Horizon
How we are evolving the Glocal Data Layer.
### 🧠 Autonomous Data Stewardship
* **Concept:** Instead of you manually cleaning lists, an AI agent monitors your CRM 24/7.
* **Goal:** If a prospect changes jobs or a company opens a new branch, the data updates itself in the background without human intervention.
### 🛡️ The "Ground Truth" Graph
* **Concept:** Digitizing the paper trail of the real world.
* **Goal:** Continuing our mission to map the "offline economy" by integrating municipal records, trade permits, and physical footprint data.