# Satellite Operator Intelligence (`labrat011/satellite-operator-intelligence`) Actor

Who owns what in orbit. Every satellite operator with its active fleet, parent company after mergers, country, HQ, orbits and makers. Find new entrants for lead lists, or any satellite's ownership chain. Built on GCAT.

- **URL**: https://apify.com/labrat011/satellite-operator-intelligence.md
- **Developed by:** [mick\_](https://apify.com/labrat011) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 operators

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

<img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/wCP1WauwRX2Gr3Gir-actor-ffzSoxGQNw4PuH3kv-Ka4yFoeOPQ-satellite-operator-intelligence.png" alt="Satellite Operator Intelligence logo" width="120">

## Satellite Operator Intelligence

Who owns what in orbit. Get every satellite operator in the world with its **active fleet, parent company (after mergers), country, headquarters, orbits, purposes and satellite makers**. Find **new entrants** whose first satellite just launched, or look up **any satellite's full ownership chain**.

Built on GCAT, the General Catalog of Artificial Space Objects by Jonathan McDowell (planet4589.org), downloaded fresh on every run. No login, no proxy, no API key.

| At a glance | |
|---|---|
| **You give it** | A mode (operators, new entrants or satellites) and optional country, sector, purpose, orbit or maker filters |
| **You get** | One row per operator (fleet, parent company, country, HQ, orbits, makers) or per satellite (full ownership chain) |
| **Price** | $0.005 per run + $0.01 per operator, $0.001 per satellite (Free plan, lower on paid plans) |
| **Speed** | All 16,156 active satellites in about 8 seconds |
| **Needs** | Nothing: no login, no API key, no proxy |

### Why this and not a TLE scraper

Orbit data (TLEs, passes) is free everywhere. Ownership is not:

- **CelesTrak** records the owner as mostly a country code. All ~10,700 Starlink satellites just say "US".
- **The UCS Satellite Database**, the usual source for operators, has paused updates.
- **This actor** gives the company, its parent company and the country, and follows mergers: OneWeb satellites roll up to **Eutelsat SA**, Intelsat to **SES S.A.**, Kuiper to **Amazon**, and Maxar's satellites to **Vantor**.

### What you get

- **Operators mode:** one row per company or agency with active satellites, grouped by parent company (default) or operating unit. Active fleet by orbit and purpose, top programs (constellations), top manufacturers, satellites ever launched, launches in the last 12 months, first and latest launch, headquarters city.
- **New entrants mode:** operators whose first satellite ever launched in the last N months. A ready lead list of young space companies that are buying ground stations, components, insurance and launch rides right now.
- **Satellites mode:** one row per satellite with NORAD and COSPAR IDs, operator, parent company, owner at launch and whether ownership changed, manufacturer, bus, orbit, perigee, apogee, inclination, launch mass and maneuverability.
- **Filters:** country, sector (business, civil, defense, academic), purpose (communications, optical or radar imaging, navigation, signals intelligence...), orbit (LEO, MEO, GEO, HEO), manufacturer, launch date, name search.
- **Coverage:** 27,852 payloads ever launched and 16,156 active, from 1957 to the latest catalog update.

### Use cases

- **Space suppliers and sales teams:** new operators and fast-growing fleets, with HQ city and country, for outbound lists.
- **Competitive intelligence for manufacturers:** filter by manufacturer to see a rival's customers and how many of their satellites are flying.
- **Investors and analysts:** who is really scaling (launches in the last 12 months), how crowded each orbit is, which makers win contracts.
- **OSINT and journalism:** which government, military or company controls a satellite, including the parent behind an operating unit.
- **Market maps:** every radar-imaging or direct-to-device operator in one table.

### Example inputs

#### Top operators worldwide, by parent company

```json
{ "mode": "operators", "maxItems": 50 }
```

#### Commercial newcomers from the last 12 months (lead list)

```json
{ "mode": "newEntrants", "sectors": ["business"], "newWithinMonths": 12, "maxItems": 200 }
```

#### Every radar-imaging operator

```json
{ "mode": "operators", "purposes": ["IMG-R"] }
```

#### A manufacturer's customers

```json
{ "mode": "operators", "manufacturers": ["Blue Canyon"], "groupBy": "operator" }
```

#### German commercial operators

```json
{ "mode": "operators", "countries": ["Germany"], "sectors": ["business"] }
```

#### All active OneWeb satellites with ownership

```json
{ "mode": "satellites", "search": ["OneWeb"], "maxItems": 0 }
```

### Input

| Field | What it does |
|---|---|
| `mode` | `operators`, `newEntrants` or `satellites`. Default `operators`. |
| `groupBy` | `parent` (roll subsidiaries into the parent company) or `operator` (each operating unit). |
| `newWithinMonths` | New entrants: first launch within this many months. Default 24. |
| `search` | Operator, parent, program or satellite names. Satellites mode also matches NORAD and COSPAR IDs. Common constellation names work even where GCAT uses another program name (`Guowang` finds GCAT's `HWD`). |
| `countries` | Country of the operator or its parent: names (`Germany`, `United States`, `China`) or codes. A foreign company appears when one of its operating units is in that country; use `groupBy: operator` to see only the local unit. |
| `sectors` | `business`, `civil`, `defense`, `academic`. In the operator modes this is the operator's own sector. |
| `purposes` | Purpose codes such as `COM`, `IMG`, `IMG-R`, `NAV`, `SIG`, `MET`. |
| `orbits` | `LEO`, `MEO`, `GEO`, `HEO`, `Other`. |
| `manufacturers` | Satellite maker names, for example `Airbus`, `Thales`, `Lanteris`, `Surrey`. |
| `launchedAfter` | Only satellites launched on or after this date. |
| `minActiveSatellites` | Operator modes: skip operators with fewer active satellites. Default 1. |
| `includeInactive` | Satellites mode: include dead, decayed and retired satellites. Default off. |
| `maxItems` | Stop after this many rows. `0` means no limit. Default 100. |

Filters on satellites (purpose, orbit, manufacturer, launch date, country) apply before operators are counted, so `"orbits": ["GEO"]` gives GEO operators with their GEO fleet.

### Output

Real rows from a run on 2026-09-26 (GCAT data of 2026-09-24).

#### Operator row (lists shortened)

```json
{
  "type": "operator",
  "name": "Eutelsat SA",
  "shortName": "EutelsatSA",
  "localName": null,
  "country": "France",
  "countryCode": "F",
  "headquarters": "Paris",
  "sector": "business",
  "parentCompany": null,
  "parentCountry": null,
  "subsidiaries": [
    { "name": "Eutelsat One Web (Network Access Associates Ltd.)", "count": 652 },
    { "name": "Eutelsat Americas", "count": 3 }
  ],
  "activeSatellites": 678,
  "activeByOrbit": { "LEO": 652, "GEO": 16, "HEO": 8, "MEO": 2 },
  "activeByPurpose": { "Communications": 678 },
  "topPrograms": [ { "name": "OneWeb", "count": 652 }, { "name": "Eutelsat New", "count": 14 } ],
  "topManufacturers": [ { "name": "One Web (Florida)", "count": 646 }, { "name": "Airbus Defense and Space (F) Toulouse", "count": 15 } ],
  "satellitesEverLaunched": 713,
  "launchedLast12Months": 0,
  "firstLaunch": "1984-08-04",
  "latestLaunch": "2024-10-20",
  "operatorCode": "EUTSA",
  "dataUpdated": "2026-09-24",
  "source": "Data from J. McDowell, planet4589.org (GCAT, CC-BY-4.0)"
}
```

#### Satellite row

```json
{
  "type": "satellite",
  "name": "OneWeb SL0115",
  "noradId": 48042,
  "cosparId": "2021-025A",
  "launchDate": "2021-03-25",
  "active": true,
  "operator": "Eutelsat One Web (Network Access Associates Ltd.)",
  "operatorCountry": "UK",
  "parentCompany": "Eutelsat SA",
  "parentCountry": "France",
  "ownerAtLaunch": "One Web (Network Access Associates Ltd.)",
  "ownerChanged": true,
  "ownershipChain": ["Eutelsat One Web (Network Access Associates Ltd.)", "Eutelsat SA"],
  "coOwners": [],
  "manufacturer": "One Web (Florida)",
  "manufacturerCountry": "USA",
  "bus": "ARROW",
  "program": "OneWeb",
  "sector": "business",
  "purpose": ["Communications"],
  "orbit": "LEO",
  "orbitDetail": "LLEO/P",
  "orbitEpoch": "2021-03-27",
  "perigeeKm": 440.0,
  "apogeeKm": 446.0,
  "inclinationDeg": 87.4,
  "launchMassKg": 148.0,
  "maneuverable": true,
  "endOfOperations": null,
  "dataUpdated": "2026-09-24",
  "source": "Data from J. McDowell, planet4589.org (GCAT, CC-BY-4.0)"
}
```

### Pricing

Pay per event:

- **$0.005** per run start
- **$0.01** per operator row (Operators and New entrants modes)
- **$0.001** per satellite row (Satellites mode)

Lower prices apply on higher Apify plans. Apify platform usage is billed separately to your account and is small, almost all of it dataset writes: 100 operators took 4 seconds and about $0.0007; all 16,156 active satellites took 8 seconds and about $0.08.

| You get | Actor cost |
|---|---|
| Top 50 operators | about $0.51 |
| 150 new entrants | about $1.51 |
| 1,000 satellites | about $1.01 |

Set a **Maximum cost per run** in the run options and the actor stops cleanly when it reaches it.

### Automate it with n8n

Each workflow uses n8n's official **Apify** node, operation **Run actor and get dataset**, actor `labrat011/satellite-operator-intelligence`. Paste the input into **Input JSON**.

#### 1. Weekly new-operator alert to Slack

```
Schedule Trigger (Mondays 08:00)
  > Apify: Run actor and get dataset   { "mode": "newEntrants", "sectors": ["business"], "newWithinMonths": 2 }
  > Remove Duplicates (n8n, across executions, on operatorCode)
  > Slack: "New operator: {{ $json.name }} ({{ $json.country }}, {{ $json.headquarters }}), first launch {{ $json.firstLaunch }}"
```

#### 2. Lead list with contacts

```
Manual Trigger
  > Apify: Run actor and get dataset   { "mode": "newEntrants", "sectors": ["business"], "newWithinMonths": 24, "maxItems": 0 }
  > HTTP Request / search: find each company's website from name + headquarters
  > Apify: labrat011/website-contact-finder on those websites (emails, phones, socials)
  > Google Sheets or your CRM: one row per company
```

#### 3. Competitor customer tracker

```
Schedule Trigger (monthly)
  > Apify: Run actor and get dataset   { "mode": "operators", "manufacturers": ["Competitor Name"], "groupBy": "operator" }
  > Airtable: upsert by operatorCode (activeSatellites, latestLaunch)
```

#### 4. Constellation growth dashboard

```
Schedule Trigger (weekly)
  > Apify: Run actor and get dataset   { "mode": "operators", "search": ["Starlink", "Kuiper", "OneWeb", "Guowang", "Qianfan"] }
  > Google Sheets: append activeSatellites and launchedLast12Months with the date
```

### For AI agents

- **Actor:** `labrat011/satellite-operator-intelligence`
- **Smallest input:** `{ "mode": "newEntrants" }`
- **One row = one operator (`type: "operator"`) or one satellite (`type: "satellite"`).** Key fields: operators: `name`, `country`, `headquarters`, `parentCompany`, `activeSatellites`, `firstLaunch`; satellites: `name`, `noradId`, `operator`, `parentCompany`, `ownerChanged`, `orbit`.
- **Billing:** `apify-actor-start` once per run, `operator` per operator row, `satellite` per satellite row. Cap spend with `maxItems` or a maximum cost per run.
- **Run it:** `POST https://api.apify.com/v2/acts/labrat011~satellite-operator-intelligence/run-sync-get-dataset-items` with the input as the JSON body, or call it from the Apify MCP server.
- **Done signal:** the run's status message reads `Saved N operators (GCAT data updated D).` or `Saved N satellites (GCAT data updated D).`

### FAQ

**Where does the data come from?** GCAT by Jonathan McDowell, the most complete public satellite catalog, released under CC-BY-4.0. Every row carries the attribution in `source`; keep it when you republish the data.

**How current is it?** The catalog is usually updated weekly. Each row has `dataUpdated`.

**How is "active" decided?** From GCAT's active catalog: payloads believed to be operating or still transmitting. For satellites that do not maneuver this is sometimes a judgment call.

**Why does a satellite show an owner I did not expect?** `ownerAtLaunch` is the owner recorded at launch; `operator` and `parentCompany` are today's entity after renames, sales and mergers. `ownerChanged` tells you when they differ.

**Are perigee, apogee and inclination current?** They are the catalog orbit at `orbitEpoch`, often just after launch, before the satellite raised to its working altitude. For live positions use a TLE source such as CelesTrak; this actor is about who owns what.

**Do I need a proxy?** No.

### Support

Open an issue on the actor's Issues tab with the run ID and it will be looked at.

# Changelog

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

# Actor input Schema

## `mode` (type: `string`):

Operators: one row per company or agency with its active fleet. New entrants: operators whose first satellite launched recently (lead lists). Satellites: one row per satellite with its full ownership chain.

## `groupBy` (type: `string`):

Parent company rolls subsidiaries up (OneWeb into Eutelsat, Kuiper into Amazon). Operating unit keeps each licensee separate. Operators and New entrants modes.

## `newWithinMonths` (type: `integer`):

New entrants mode: operators whose first satellite ever launched in this many months.

## `search` (type: `array`):

Operator, parent, program or satellite names, for example: Starlink, Planet, Eutelsat, Iridium. In Satellites mode also NORAD or COSPAR IDs.

## `countries` (type: `array`):

Country of the operator or its parent. Names or codes: United States, China, Germany, UK, France, Japan, India.

## `sectors` (type: `array`):

Business, civil government, defense and intelligence, or academic and non-profit.

## `purposes` (type: `array`):

Only count satellites with these purposes.

## `orbits` (type: `array`):

Only count satellites in these orbits.

## `manufacturers` (type: `array`):

Only satellites built by these makers, for example: Airbus, Thales, Lanteris, Surrey, Blue Canyon. Find a manufacturer's customers with Operators mode.

## `launchedAfter` (type: `string`):

Only satellites launched on or after this date, for example 2025-01-01.

## `minActiveSatellites` (type: `integer`):

Operators and New entrants modes: skip operators with fewer active satellites (after filters).

## `includeInactive` (type: `boolean`):

Satellites mode: also return dead, decayed or retired satellites.

## `maxItems` (type: `integer`):

Stop after this many rows. 0 means no limit.

## Actor input object example

```json
{
  "mode": "operators",
  "groupBy": "parent",
  "newWithinMonths": 24,
  "minActiveSatellites": 1,
  "includeInactive": false,
  "maxItems": 20
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("labrat011/satellite-operator-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 = { "maxItems": 20 }

# Run the Actor and wait for it to finish
run = client.actor("labrat011/satellite-operator-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 '{
  "maxItems": 20
}' |
apify call labrat011/satellite-operator-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,labrat011/satellite-operator-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/ffzSoxGQNw4PuH3kv/builds/V6FWpKqDbxDCY62MB/openapi.json
