# Owler Scraper — Company Data, Revenue, Competitors & Funding (`foxlabs/owler-intelligence`) Actor

Scrape Owler company data as clean JSON — revenue, employees, industry, HQ, competitors with proximity scores, funding & M\&A. Affordable, no-contract alternative to Owler Pro / enterprise data APIs for B2B sales prospecting, lead enrichment, competitive intelligence & CRM data.

- **URL**: https://apify.com/foxlabs/owler-intelligence.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 76 total users, 11 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.50 / 1,000 company records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Owler Scraper — Company Data, Revenue, Competitors & Funding 🦉

**foXLabs company-intelligence series:** [Company enrichment](https://apify.com/foxlabs/company-enrichment) · [Craft](https://apify.com/foxlabs/craft-intelligence) · [Built In](https://apify.com/foxlabs/builtin-intelligence) · [Free lookup](https://apify.com/foxlabs/company-lookup-free)

🎉 Turn Owler company profiles into structured JSON — firmographics, revenue and employees, competitors with proximity scores, funding rounds, acquisitions, investments, news highlights, the CEO and social links, one row per company.
Built for competitive intelligence, market mapping and account research.

### 🔍 What is Owler Scraper — and when should you use it?

Give this Actor **Owler company URLs** — or pick a **sector preset** that starts from a set of anchor companies and follows their Owler competitor lists — and it returns one record per company from the public profile pages of [Owler](https://www.owler.com). Every run reads the pages live.

**Use it when you need:** a competitor map with Owler's proximity scores; the funding, acquisition and investment history of a watch list; firmographics plus the CEO for account research.

**Use something else when:** you want to look companies up by name or domain — [Company Data Enrichment](https://apify.com/foxlabs/company-enrichment) matches those to Owler profiles and returns the firmographic fields; or you need filed financials or registry records — this Actor returns what Owler publishes.

### 🤖 Use with AI agents

**Already on the Apify MCP server?** Ask for this Actor by name: `foxlabs/owler-intelligence`.

**Your agent can pay for its own runs.** This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over **x402 (USDC on Base)** or **Skyfire** — no Apify account or API token of its own. Billing is the same either way: per delivered company record — rows that only report a failed lookup are free from 25 September 2026.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```
I want Owler company profiles from the Apify Actor `foxlabs/owler-intelligence`.
Input: `companyUrls` is a list of Owler company URLs, each given as an object with a `url` key (https://www.owler.com/company/<slug>) — the company's own website also works (https://www.tesla.com: looked up on Owler by its domain, delivered only if the profile's domain matches); or set `preset` to a sector (saas, fintech, ai-ml, ecommerce, gaming, crypto-web3) to start from its anchor companies and follow their competitors for `presetDepth` hops. Eight `include…` switches (competitors, funding, acquisitions, investments, news, financial history, leadership, social) are on by default. `maxResults` caps the rows.
Start with: {"companyUrls":[{"url":"https://www.owler.com/company/apify"},{"url":"https://www.owler.com/company/stripe"},{"url":"https://www.owler.com/company/openai"}],"maxResults":100}
Ask me what to look up, run the Actor, then summarise the rows as a table.
```

The machine-readable API, MCP config and OpenAPI definition live at `apify.com/foxlabs/owler-intelligence.md`.

### 📋 Overview

Everything you need to turn Owler profiles into structured data — in one Actor, with no login, cookies or API key.

**Why teams pick this Actor:**

- ✅ **URLs or a sector preset** — paste Owler profiles, or start from 18–34 anchor companies per sector and follow their competitors.
- 🥊 **Competitors with proximity scores** — each with its own revenue, employees, HQ, founded year and total funding.
- 💸 **Funding, M\&A and investments** — funding rounds with investors, acquisitions with dates and source links, the company's own investments.
- 📰 **News highlights and momentum** — Owler's typed news items and revenue / employee trend signals.
- 💰 **Pay per record** — $0.004 per company record, no subscription.
- 🤖 **Agent-ready** — MCP + x402 agentic payments.

### ✨ Features

- 🔗 **Profile URLs in, one row out** — `companyUrls` takes Owler company URLs, the companies' own websites (looked up by domain and checked against it) or a .txt / .csv upload; a URL listed twice is fetched once.
- 🧭 **Sector presets** — `saas`, `fintech`, `ai-ml`, `ecommerce`, `gaming`, `crypto-web3`: anchor companies plus up to 4 hops through Owler's competitor lists; companies found along the way are kept only if their Owler industry matches the sector's keywords.
- 🎛️ **Eight include switches** — competitors, funding, acquisitions, investments, news highlights, financial history, leadership, social. Switched off, their fields are left out of the row; the price stays the same.
- 🧪 **An empty input still returns data** — with no URLs and no preset the Actor runs a three-company demo (Apify, Stripe, OpenAI).

### 🎬 Quick Start

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~owler-intelligence/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyUrls":[{"url":"https://www.owler.com/company/apify"},{"url":"https://www.owler.com/company/stripe"},{"url":"https://www.owler.com/company/openai"}],"maxResults":100}'
```

### 🚀 Getting Started (3 steps)

1. **Choose companies** — paste Owler profile URLs, or pick a sector preset.
2. **Pick what to extract** — leave the include switches on for the full profile, or switch off what you don't need.
3. **Run and export** — download the dataset as JSON, CSV, Excel, HTML or XML.

### 📥 Input

```json
{"companyUrls":[{"url":"https://www.owler.com/company/apify"},{"url":"https://www.owler.com/company/stripe"},{"url":"https://www.owler.com/company/openai"}],"maxResults":100}
```

| Field | Type | Description |
|---|---|---|
| `preset` | string | Start from a sector's anchor companies: `saas` (34), `fintech` (22), `ai-ml` (22), `ecommerce` (21), `gaming` (18), `crypto-web3` (22). Combined with `companyUrls` when both are given. |
| `presetDepth` | integer | Preset only — how many hops to follow through each profile's competitor list (0 = anchors only; default 2; max 4). |
| `companyUrls` | array | Owler company URLs (`https://www.owler.com/company/<slug>`), the company's own website (`https://www.tesla.com` or `tesla.com` — looked up on Owler under the name its domain suggests and delivered only if the profile's domain matches), or a .txt / .csv upload. Company pages on other sites (LinkedIn, Crunchbase, …) are skipped with a note in the log. |
| `includeCompetitors` | boolean | Adds `competitors[]` and `totalCompetitors` (default on). |
| `includeFunding` | boolean | Adds `funding` (default on). |
| `includeAcquisitions` | boolean | Adds `acquisitions[]` (default on). |
| `includeInvestments` | boolean | Adds `investments[]` and `firstInvestment` (default on). |
| `includeNewsEvents` | boolean | Adds `keyHighlights[]` (default on). |
| `includeFinancialHistory` | boolean | Adds `revenueQuarterly[]`, `momentum[]` and `fundingByYear[]` (default on). |
| `includeLeadership` | boolean | Adds `leadership[]` (default on); the `ceo` field is always included. |
| `includeSocial` | boolean | Adds `social` (default on). |
| `maxResults` | integer | Stop saving companies after this many (default 100; 0 = no limit). Without a preset only the first `maxResults` URLs are fetched. |
| `maxConcurrency` | integer | Pages fetched in parallel (default 10; values above 20 are treated as 20). |
| `proxyConfiguration` | object | Apify proxy settings (default: Apify proxy, automatic selection). |

**More recipes**

- Lean firmographic rows: `{"companyUrls":[{"url":"https://www.owler.com/company/apify"}],"includeCompetitors":false,"includeFunding":false,"includeAcquisitions":false,"includeInvestments":false,"includeNewsEvents":false,"includeFinancialHistory":false,"includeLeadership":false,"includeSocial":false}` — 30 fields per row instead of 42 in our test run, same price.
- Competitor landscape: set `preset` (for example `fintech`) and `presetDepth` to 1 for the anchor companies plus the companies on their Owler competitor lists.

### 📤 Output

One row per company. A profile Owler doesn't have comes back as a row with every company field empty and an `error` field; a page that loaded but could not be read comes back with `url`, `error` and `scrapedAt` only. A page you asked for that still cannot be read after its retries — Owler closed the connection or did not answer — also comes back as a row with every company field empty and an `error` field, and the run's status message says how many pages could not be read. Rows with `error` are not charged as records (once the planned lookup fee starts, a company you asked for that Owler does not have costs $0.0005 — see Pricing).

Always in the row:

| Field | Description |
|---|---|
| `url` | Owler profile URL |
| `name` / `legalName` | Short name and full legal name |
| `description` / `summary` | Owler's one-paragraph description and its longer company write-up |
| `website` / `domain` / `logo` | Website, root domain, logo image URL |
| `industry` / `industrySectors` / `industries` | Owler's sectors (comma-joined and as a list) and its broader industry group |
| `ownership` / `yearFounded` | `Public` or `Private`, founding year |
| `headquarters` / `address` | HQ as `city, state, country`; the street address (`street1`, `street2`, `city`, `state`, `country`, `zipcode`) as Owler shows it |
| `phoneNumber` | Company phone number where the profile lists one (1 of 3 test companies) |
| `exchange` / `ticker` | Stock-listing fields as Owler shows them — in our test `ticker` was empty for all 3 companies and `exchange` was filled for 1 |
| `ceo` | The executive Owler lists as CEO: `name`, `designation` (title), `rating` (Owler approval rating, 0–100), `photoUrl`, `linkedin`, `twitter` |
| `employees` / `employeesFormatted` / `employeesRange` | Employee count as a number and as text, and Owler's size band |
| `revenueAmount` / `revenueFormatted` / `revenueRange` | Revenue as a number, as text (e.g. `5.1B`) and as a band |
| `followers` | Owler followers of the profile |
| `totalAcquisitions` / `totalInvestments` | Totals shown on the profile |
| `sicCodes` | SIC codes (2 of 3 test companies) |
| `scrapedAt` | Timestamp of the scrape |
| `error` | Miss rows only — why the profile could not be read |

Added by the include switches:

| Field | Switch | Description |
|---|---|---|
| `competitors[]` / `totalCompetitors` | `includeCompetitors` | `position`, `name`, `url` (Owler), `website`, `logo`, `proximityScore`, `ownership`, `yearFounded`, `industrySectors`, `headquarters`, `employeeCount` / `employeeRange` / `employeesFormatted`, `revenueAmount` / `revenueFormatted` / `revenueRange`, `totalFundingFormatted`. The `domain` key was empty for all 44 competitors in our test run. |
| `funding` | `includeFunding` | `totalAmount`, `totalFormatted`, `totalRounds`, `seoText` and `rounds[]` (`date`, `round`, `amount`, `amountFormatted`, `investors[]`). `rounds` holds the rounds listed on the page — 5 of Stripe's 23 in our run. |
| `acquisitions[]` | `includeAcquisitions` | `companyName`, `shortName`, `description`, `owlerUrl`, `logo`, `date`, `amount`, `amountFormatted`, `undisclosed`, `sources[]` — the acquisitions listed on the page (Stripe: 5 listed, 22 in total). |
| `investments[]` / `firstInvestment` | `includeInvestments` | Companies this one invested in: `companyId`, `companyName`, `teamName`, `owlerUrl`, `description`, `ownership`, `logo`, `date`, `amount` (Stripe: 5 listed, 59 in total); `firstInvestment` is the earliest. |
| `keyHighlights[]` | `includeNewsEvents` | `type` (e.g. `ai`, `funding`, `acquisition`, `partnership`, `product_launch`), `headline`, `date`, `sourceUrl`, `sourceName`, `owlerReportUrl`, `mentionCount` |
| `revenueQuarterly[]` / `momentum[]` / `fundingByYear[]` | `includeFinancialHistory` | `revenueQuarterly` was empty for all 3 test companies; `momentum` = `metric`, `changePercentage`, `direction`; `fundingByYear` = `year` + `amount` |
| `leadership[]` | `includeLeadership` | `name`, `designation`, `photoUrl`, `linkedin`, `twitter` — one person, the CEO, for each test company |
| `social` | `includeSocial` | Links keyed by network (`facebook`, `linkedin`, `twitter` for all 3 test companies) |

Sample — Stripe, from our test run on 2026-09-10 (lists trimmed to one entry; the long `summary` and source-link texts shortened with …):

```json
{
  "url": "https://www.owler.com/company/stripe",
  "name": "Stripe",
  "legalName": "Stripe, Inc.",
  "description": "Stripe is a California-based financial infrastructure platform that offers solutions such as payment processing, VAT automation and invoice management for businesses.",
  "summary": "Stripe is a web and mobile platform that allows individuals and businesses to accept online payments. …",
  "website": "https://stripe.com/",
  "domain": "stripe.com",
  "logo": "https://image4.owler.com/logo/stripe_owler_20260318_134635_medium.png",
  "industry": "Fintech Software",
  "industries": [
    "Banking, Financial Services and Insurance"
  ],
  "industrySectors": [
    "Fintech Software"
  ],
  "ownership": "Private",
  "yearFounded": 2009,
  "headquarters": "San Francisco, California, USA",
  "address": {
    "street1": "185 Berry Street",
    "street2": "Suite 550",
    "city": "San Francisco",
    "state": "California",
    "country": "USA",
    "zipcode": "94107"
  },
  "phoneNumber": "1-415-298-5539",
  "exchange": null,
  "ticker": null,
  "ceo": {
    "name": "John Collison",
    "designation": "President",
    "rating": 64,
    "photoUrl": "https://image4.owler.com/ceo/John_Collison_owler_20240726_224858_original.png",
    "linkedin": "https://www.linkedin.com/in/johnbcollison/",
    "twitter": "https://twitter.com/collision"
  },
  "leadership": [
    {
      "name": "John Collison",
      "designation": "President",
      "photoUrl": "https://image4.owler.com/ceo/John_Collison_owler_20240726_224858_original.png",
      "linkedin": "https://www.linkedin.com/in/johnbcollison/",
      "twitter": "https://twitter.com/collision"
    }
  ],
  "employees": 8200,
  "employeesFormatted": "8,200",
  "employeesRange": "5,000 - 10,000",
  "revenueAmount": 5100000000,
  "revenueFormatted": "5.1B",
  "revenueRange": "$5B - 10B",
  "followers": 318790,
  "totalAcquisitions": 22,
  "totalInvestments": 59,
  "acquisitions": [
    {
      "companyName": "OpenRouter, Inc.",
      "shortName": "OpenRouter",
      "description": null,
      "owlerUrl": "https://www.owler.com/company/openrouter",
      "logo": "https://image4.owler.com/logo/openrouter_owler_20260817_061632_small.png",
      "date": "Aug 2026",
      "amount": "7500000000",
      "amountFormatted": "7.5B",
      "undisclosed": null,
      "sources": [
        "https://www.digitimes.com/news/a20260817VL203/ai-startup-acquisition-data-price-switch.html"
      ]
    }
  ],
  "investments": [
    {
      "companyId": 16549136,
      "companyName": "Archive",
      "teamName": "archivetechnologiesinc",
      "description": "Archive is a Florida-based digital platform that offers solutions such as community marketing infrastructure and automation for E-commerce merchants.",
      "ownership": "Private",
      "owlerUrl": "https://www.owler.com/company/archivetechnologiesinc",
      "logo": "https://image4.owler.com/logo/archive_owler_20260902_202811_original.png",
      "date": "Sep 01, 2026",
      "amount": null
    }
  ],
  "firstInvestment": {
    "companyId": 12406602,
    "companyName": "StdLib",
    "teamName": "stdlib",
    "description": "StdLib provides a serverless API that allows developers to write syntaxes from simple functions to complex business logic before deploying their code.",
    "ownership": "Private",
    "owlerUrl": "https://www.owler.com/company/stdlib",
    "logo": "https://image4.owler.com/logo/stdlib_owler_20170629_070218_original.png",
    "date": "May 30, 2018"
  },
  "keyHighlights": [
    {
      "type": "investment",
      "headline": "Stripe, Inc. has invested $0 in Archive Technologies, Inc.",
      "date": "2026-09-01T18:30:00.000Z",
      "sourceUrl": "http://www.businesswire.com/news/home/20260902447895/en/Archive-Closes…",
      "sourceName": "http://www.businesswire.com/news/home/20260902447895/en/Archive-Closes…",
      "owlerReportUrl": null,
      "mentionCount": 8
    }
  ],
  "revenueQuarterly": [],
  "momentum": [
    {
      "metric": "revenue",
      "changePercentage": "0.4%",
      "direction": "up"
    }
  ],
  "fundingByYear": [
    {
      "year": "2010",
      "amount": 1800000
    }
  ],
  "sicCodes": [
    "7373"
  ],
  "funding": {
    "totalAmount": 9787455541,
    "totalFormatted": "9.8B",
    "totalRounds": 23,
    "seoText": "Since Stripe was founded in 2009, it has participated in 23 rounds of funding. In total Stripe has raised $9.8B. Stripe's last funding round was on Mar 2026 for a total of $14.6M",
    "rounds": [
      {
        "date": "Mar 2026",
        "round": "Venture Round",
        "amount": 14577645,
        "amountFormatted": "14.6M",
        "investors": []
      }
    ]
  },
  "competitors": [
    {
      "position": 1,
      "name": "Rapyd",
      "url": "https://www.owler.com/company/rapydlimited",
      "website": "https://www.rapyd.net/",
      "domain": null,
      "logo": "https://image4.owler.com/logo/rapyd_owler_20191030_135043_small.png",
      "proximityScore": 100000,
      "ownership": "Private",
      "yearFounded": 2016,
      "industrySectors": [
        "Retail & Business Banking"
      ],
      "headquarters": "London, England, GB",
      "employeeCount": 850,
      "employeeRange": "500 - 1,000",
      "employeesFormatted": "850",
      "revenueAmount": 105000000,
      "revenueFormatted": "105M",
      "revenueRange": "$100M - 500M",
      "totalFundingFormatted": "1.3B"
    }
  ],
  "totalCompetitors": 23,
  "social": {
    "linkedin": "https://www.linkedin.com/company/stripe/",
    "facebook": "https://www.facebook.com/StripeHQ/",
    "twitter": "https://twitter.com/stripe"
  },
  "scrapedAt": "2026-09-10T14:52:47.870Z"
}
```

### 💼 Use cases

**1. Competitive intelligence** — who competes with you, and how big they are.
*Input:* your company's Owler URL. *Output:* competitors with proximity score, revenue, employees and HQ. *Use:* a competitor map.

**2. Deal tracking** — funding and M\&A on a watch list.
*Input:* the Owler URLs of the companies you follow. *Output:* funding rounds, acquisitions, investments, news highlights. *Use:* spot new deals on a schedule.

**3. Market mapping** — a sector in one run.
*Input:* a sector preset. *Output:* anchor companies plus the companies on their competitor lists, with firmographics. *Use:* a market landscape.

**4. Account research** — brief the team on a target account.
*Input:* the account's Owler URL. *Output:* description, HQ, the CEO, social links and — where the profile lists one — a phone number. *Use:* an account one-pager.

### 🔗 Integration

**JavaScript / Node.js**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/owler-intelligence').call({"companyUrls":[{"url":"https://www.owler.com/company/apify"},{"url":"https://www.owler.com/company/stripe"},{"url":"https://www.owler.com/company/openai"}],"maxResults":100});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/owler-intelligence').call(run_input={"companyUrls": [{"url": "https://www.owler.com/company/apify"}, {"url": "https://www.owler.com/company/stripe"}, {"url": "https://www.owler.com/company/openai"}], "maxResults": 100})
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

Written for `apify-client` 3 for Python, where `call()` returns a run object; with version 1 or 2 it returns a dict — write `run['defaultDatasetId']` there.

**Automation (n8n / Zapier / Make):** schedule or webhook → HTTP request to the Actor API with your `companyUrls` → handle the JSON dataset → push to a sheet, CRM or dashboard.

### 📊 Pricing

Pay-per-event: **$0.004 per delivered company record** (≈ $4 per 1,000 companies), plus Apify's run-start event ($0.00005 per GB of run memory). The include switches change the size of a row, not its price. With a preset, the run stops when `maxResults` is reached: it saves — and charges for — at most that many companies and does not fetch the rest of the queue. Rows that only report a failed lookup (`error`) are not charged as records. [Current pricing](https://apify.com/foxlabs/owler-intelligence).

**Planned — from the start date shown on the Pricing tab (Apify announces it 14 days ahead; not before 24 October 2026):** a delivered company costs **the same $0.004**, then split into a **$0.0005 `company-lookup`** and a **$0.0035 company record**. A company you asked for that turns out to be missing on Owler (an Owler 404) or to be another company's profile (website entries are checked against the domain) costs only the **$0.0005 lookup** — finding that out still takes a request. Preset anchors and discovered competitors are charged only when delivered; entries that are skipped (LinkedIn / Crunchbase pages) and failures on our side (blocked pages, errors) stay **free**. Apify notifies users of the change in advance.

### ❓ FAQ

**Where does the data come from?** From Owler's public company profile pages (`owler.com/company/…`): the Actor reads the company data embedded in each page. No login and no Owler account are needed.

**Can I look companies up by name?** Not in this Actor — give Owler URLs or a preset. [Company Data Enrichment](https://apify.com/foxlabs/company-enrichment) matches names and domains to Owler profiles.

**How does a preset work?** It starts from the sector's anchor companies (for `fintech`: Stripe, PayPal, Square, Adyen, Klarna and others) and, for every profile, queues the companies on its Owler competitor list, up to `presetDepth` hops. Anchors are always kept; companies found through competitor lists are kept only when their Owler industry matches the sector's keywords.

**Why are `ticker` and `revenueQuarterly` empty?** Both are passed through from the page; they were empty for all three companies in our 2026-09-10 test run.

**Do the include switches change the price?** No. The price is per company; switching them off only makes rows smaller (30 fields instead of 42 in our test).

**Can I export to CSV / Excel / JSON?** Yes — directly from the Apify dataset.

### 🐛 Troubleshooting

- **A URL comes back as an `error` row** — the slug is wrong. Owler's slug is not always the company name (Datadog is `datadoghq`, Notion is `notion1`); copy the address from owler.com. A website entry gives an `error` row (no record charged; once the planned lookup fee starts, $0.0005) when Owler has no profile under that name or the profile there belongs to another domain — paste the company's Owler URL instead.
- **The run fails with "None of the … supplied entries can be looked up on Owler"** — `companyUrls` contained only entries that are neither Owler addresses nor company websites (for example LinkedIn or Crunchbase company pages).
- **The status message says "N pages could not be read"** — Owler closed the connection or did not answer for those pages after every retry. Nothing is charged for them. A page you asked for is in the dataset as a row with an `error`; run those URLs again later.
- **A preset run returns fewer companies than `maxResults`** — the anchors' competitor lists, `presetDepth` and the sector filter limit what is found; raise `presetDepth` (max 4).
- **A list such as `acquisitions` is empty** — the profile has none (Apify had no acquisitions, investments or news highlights in our test), or the matching include switch is off.

### ⚖️ Is it legal to scrape this data?

The Actor reads publicly accessible company profile pages. CEO and leadership names, photos and social links are personal data under the GDPR and similar laws — process them only with a lawful basis, and check that your use fits the source website's terms. Owler is a trademark of its owner; this Actor is not affiliated with Owler.

### 🤝 Support & contact

- 🌐 **Website:** [data.foxlabs.com.tr](https://data.foxlabs.com.tr)
- 📧 **Email:** info@foxlabs.com.tr
- 🐛 **Issues:** open a ticket in the Actor’s **Issues** tab
- 🧰 **More clean B2B data actors:** [Fox Labs on Apify](https://apify.com/foxlabs)

### Changelog

#### 1.9.54 — 2026-10-08 — README: the Python example works with the current Apify client

- The README's Python example read the results with `run['defaultDatasetId']`. With the current Apify client for Python (version 3) `call()` returns a run object, not a dict, and that line raised `TypeError: 'Run' object is not subscriptable` — after the run itself had finished. The example now reads `run.default_dataset_id`; with client version 1 or 2, keep `run['defaultDatasetId']`. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2.
- No code, output field or pricing change.

#### 1.9.53 — 2026-10-07 — a preset run stops at maxResults; a page that cannot be read is reported

- **A preset run now stops when `maxResults` is reached.** Until now the crawl went on through everything that was queued — and kept retrying the pages that failed — after the last row had been written: in a test, a run with `maxResults` 15 wrote its 15th row after about a minute and then ran for eight more minutes. The run now stops taking pages from the queue at that point, and it saves at most `maxResults` companies (before, pages in progress could add a few more).
- **A page that cannot be read is no longer silent.** A URL you asked for that still fails after every retry — Owler closed the connection or did not answer — used to leave nothing but a log line: 12 URLs in, 11 rows out. It now comes back as a row with an `error` (not charged), and every run ends with a status message that says how many profiles were delivered, how many inputs have no Owler profile and how many pages could not be read.
- No output field changed, no pricing change.

#### 1.9.52 — 2026-10-07 — a run that Apify starts again does not write a company twice

- **A run that the platform starts again no longer repeats a company.** Apify can move a run to another server while it is going; the Actor then starts again with the same dataset. The pages that were done are remembered, but the page that was being read at that moment was read and written again, and the count towards `maxResults` started from zero: in a test with 12 companies that was started again after 4 rows, one company was written and charged twice. The Actor now first reads which pages its own dataset already has a row for; they are not written or charged again, and the profiles among them count towards `maxResults`.
- No output field changed, no pricing change.

#### 1.9.51 — 2026-10-02 — correction: lookup fee start date

- **The lookup fee does not start on 17 October 2026 for this Actor.** Apify allows one pricing change per month and this Actor's last one was on 10 September, so the new price can be scheduled from 10 October and starts at least 14 days after that (not before 24 October 2026). The exact date will be on the Pricing tab and Apify notifies users ahead. Until then nothing changes.

#### 1.9.50 — 2026-10-02 — lookup fee announced for 17 October 2026

- **Pricing change from 17 October 2026 (15:00 UTC):** every company looked up costs a $0.0005 `company-lookup`, and a company record drops from $0.004 to $0.0035 — **a delivered company costs $0.004 as before**. A company you asked for that Owler does not have (404) or that resolves to another company's profile costs only the $0.0005 lookup. Preset anchors and discovered competitors are charged only when delivered; skipped entries and failures on our side stay free. The code is live now and charges nothing extra until the new price takes effect (`src/billing.js`).

#### 1.9.48 — 2026-10-02 — company websites are accepted as input

- **A company website in `companyUrls` used to fail the run.** The form field only accepts URLs, so the natural entry is the company's own site (`https://www.tesla.com`); it is not an Owler address, and when every entry was one the run failed with "None of the … supplied entries is an Owler company reference" (measured 2026-09-29). A website or bare domain is now looked up on Owler under the name its domain suggests (`tesla.com` → `owler.com/company/tesla`, `bbc.co.uk` → `bbc`).
- **The profile must belong to that domain.** The same name can be another company's profile, so a profile is delivered only if its own domain or website matches the one you gave; otherwise you get an `error` row explaining it, with no charge.
- Company pages on other sites (LinkedIn, Crunchbase, …) are skipped with a note in the log rather than looked up under the site's own name. No output field or price changed.

#### 1.9.46 — 2026-09-10 — failed lookups become free (per-record billing) + README corrected

- Input and output texts corrected: `maxConcurrency` says the Actor caps it at 20, and the output schema no longer carries another Actor's title.
- **You will pay only for delivered company records.** The Actor now charges a new `company-record` event for each delivered company, and rows that only report a failed lookup (`error`) are pushed without a charge (`src/billing.js`; the record push in `src/main.js` now goes through `pushRecord`, the two error-row pushes stay plain).
- **Timing:** Apify applies pricing changes after a 14-day notice. From **25 September 2026** the pricing switches from the per-dataset-item event to `company-record` at the same price ($0.004). Until then billing is exactly as before; the code detects the switch by itself.
- No output field changed.
- **README corrected.** The 2026-09-07 README documented inputs this Actor does not have (`queries`, `maxResultsPerQuery`, `includeRaw`) with a placeholder (`undefined`) example, said it takes company names and supports registry-ID lookup (it takes Owler URLs or a sector preset), called `industry` a NACE code and `employees` a registered count, and promised status / legal form / formation date, "formation / status monitoring", "every row carries `query`", "no empty-promise columns" and "empty/failed lookups never billed". The new README describes the real inputs, all 42 output fields and billing, checked on local runs.
- **Correction to 1.9:** `ticker` and `revenueQuarterly` were not removed — both are still in the row (`revenueQuarterly` while the financial-history switch is on), and both came back empty for all three companies we tested. The older entries below are kept as written; the 1.0 entry's "by name or registry ID" was also wrong.

#### 1.9 — 2026-09-07

- **Dropped empty-promise columns.** Removed `ticker, revenueQuarterly` — Owler company-intelligence profiles does not carry them, so they were shipped as always-null columns. Only fields this source actually fills are now emitted.
- **Enabled AI-agent payments (x402) + rebuilt the README to the full standard** (What-is / when, AI-agents + x402 agentic payments + MCP, Overview, Features, Use cases, Integration, FAQ, Troubleshooting, Support & contact).

#### 1.0

- Initial release: data from Owler company-intelligence profiles by name or registry ID.

# Changelog

This Actor's version history is a separate document: https://apify.com/foxlabs/owler-intelligence/changelog.md

# Actor input Schema

## `preset` (type: `string`):

Pick a sector and the actor starts from a small list of anchor companies (e.g. SaaS: Apify, Stripe, OpenAI, Notion, Shopify, ...) and recursively follows their competitor graphs on Owler. Every run is **live** — today's Owler graph, not a frozen list. Set `Max results` to control size (1 - 100,000). Use `Discovery depth` to tune breadth (1 = anchors+direct competitors, 2 = +their competitors too — default, 3-4 = market-wide).

## `presetDepth` (type: `integer`):

Only used when a preset is selected. Controls how deep we follow Owler's competitor graph from anchor seeds:
• **1** — anchor companies + their direct competitors (~500 companies)
• **2** — also follow the competitors-of-competitors (~3k, **default**)
• **3** — one more hop (~15k market-wide)
• **4** — exhaustive crawl (use only with maxResults set; cost ramps fast)
Lower depth = faster + cheaper. Higher depth = broader market coverage. Max results is always the hard cap.

## `companyUrls` (type: `array`):

Full Owler profile URLs, one per line: `https://www.owler.com/company/apify`. The company's own website also works (`https://www.tesla.com`): it is looked up on Owler by its domain and delivered only if the profile's domain matches. Drop a `.txt`/`.csv` file or link a remote list for bulk loads.

This field validates URLs, so a bare company name or slug (`Apify`, `apify`) is rejected before the run starts — build the URL as `https://www.owler.com/company/<slug>`. ⚠ The slug is not always the hyphenated name (e.g. `Bright Data` → `brightdata`, not `bright-data`); if a URL returns 404, copy the address straight from owler.com.

No list yet? Pick a sector preset above instead.

## `includeCompetitors` (type: `boolean`):

Each competitor comes with full firmographics — proximity score, revenue, employees, HQ, founded year, ownership. Owler's flagship signal for competitive intelligence and market mapping.

## `includeFunding` (type: `boolean`):

Funding history with **named investors** (with Owler profile URLs), round type, date, and amount. Also includes total raised and year-by-year funding chart.

## `includeAcquisitions` (type: `boolean`):

Full acquisition timeline — date, target company, description, source news URLs. e.g. Sony has 5+ tracked, Microsoft 50+, Google 30+. Ideal for M\&A research and serial-acquirer maps.

## `includeInvestments` (type: `boolean`):

Distinct from M\&A — this is each company's VC-style investment activity (e.g., Sony invested $11M in Qoly Co.). Useful for corporate VC tracking, deal flow.

## `includeNewsEvents` (type: `boolean`):

Typed news/event stream — `ai`, `product_launch`, `investment`, `partnership`, `info_leak` and more. Each item has headline, date, source URL, source name. ~8 recent events per company, hand-curated by Owler.

## `includeFinancialHistory` (type: `boolean`):

Quarterly revenue history (e.g. Sony Q1 2025 → $19.3B, Q4 2024 → $28B) + revenue/employee trend percentages (`-1.3%`, `+0.9%`). This is normally a paywalled Owler Pro feature — available here via SSR.

## `includeLeadership` (type: `boolean`):

CEO and executive team — name, designation, photo, LinkedIn, Twitter. Plus CEO approval rating (0-100).

## `includeSocial` (type: `boolean`):

LinkedIn, Twitter, Facebook, YouTube, Instagram company profile URLs.

## `maxResults` (type: `integer`):

Hard cap on results — set per your budget and how broad a market sweep you want. Set 0 for unlimited. PPE pricing: $4 per 1,000 results.
• 100 ≈ $0.40 (~30s)
• 1,000 ≈ $4 (~3 min)
• 10,000 ≈ $40 (~25 min)
• 50,000 ≈ $200 (~2 h)

## `maxConcurrency` (type: `integer`):

How many company pages to fetch in parallel. Owler tolerates aggressive parallelism on datacenter proxy — default `10` is balanced, the Actor caps it at 20. Lower to 1-2 only if you start seeing repeated session rotations.

## `proxyConfiguration` (type: `object`):

Apify Datacenter proxy is sufficient for Owler — Residential is overkill and 5-10x more expensive. Datacenter is included free on every Apify plan.

## Actor input object example

```json
{
  "preset": "",
  "presetDepth": 2,
  "companyUrls": [
    {
      "url": "https://www.owler.com/company/apify"
    },
    {
      "url": "https://www.owler.com/company/stripe"
    },
    {
      "url": "https://www.owler.com/company/openai"
    }
  ],
  "includeCompetitors": true,
  "includeFunding": true,
  "includeAcquisitions": true,
  "includeInvestments": true,
  "includeNewsEvents": true,
  "includeFinancialHistory": true,
  "includeLeadership": true,
  "includeSocial": true,
  "maxResults": 100,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "presetDepth": 2,
    "companyUrls": [
        {
            "url": "https://www.owler.com/company/apify"
        },
        {
            "url": "https://www.owler.com/company/stripe"
        },
        {
            "url": "https://www.owler.com/company/openai"
        }
    ],
    "maxResults": 100,
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/owler-intelligence").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "presetDepth": 2,
    "companyUrls": [
        { "url": "https://www.owler.com/company/apify" },
        { "url": "https://www.owler.com/company/stripe" },
        { "url": "https://www.owler.com/company/openai" },
    ],
    "maxResults": 100,
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/owler-intelligence").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "presetDepth": 2,
  "companyUrls": [
    {
      "url": "https://www.owler.com/company/apify"
    },
    {
      "url": "https://www.owler.com/company/stripe"
    },
    {
      "url": "https://www.owler.com/company/openai"
    }
  ],
  "maxResults": 100,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call foxlabs/owler-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,foxlabs/owler-intelligence"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lEETl5hoLniP4ymFT/builds/9nmOgIfzluEa29Y4T/openapi.json
