# Satellite Tracking Data: Orbits, Constellations, Launches (`scrapemint/satellite-tracking-data`) Actor

Keyless orbital data for objects in space. Pick a constellation, a catalogue number or a satellite name and get altitude at apogee and perigee, orbital period, inclination and orbit class worked out from the raw elements, plus launch year, years in orbit and how old the elements themselves are.

- **URL**: https://apify.com/scrapemint/satellite-tracking-data.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 satellite rows

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Satellite Tracking Data: Orbits, Constellations, Launches

What is in orbit right now, and what each object is actually doing up there. The public catalogue publishes raw orbital elements, which are precise and unreadable. This turns them into the numbers people ask for: how high, how fast, how long an orbit takes, and what kind of orbit it is. No key, no login, no proxy.

### What you get

| Field | Meaning |
| --- | --- |
| `name`, `noradCatalogId`, `internationalDesignator` | The object and its two official identifiers |
| `apogeeAltitudeKm`, `perigeeAltitudeKm`, `meanAltitudeKm` | How high, at the top and bottom of the orbit |
| `orbitalPeriodMinutes`, `orbitsPerDay` | How long one lap takes |
| `orbitType`, `inclinationDegrees`, `inclinationClass` | Low earth, geostationary and so on, and whether the orbit is polar, sun synchronous or equatorial |
| `launchYear`, `launchNumberOfYear`, `yearsInOrbit` | Read from the international designator |
| `constellation` | Starlink, OneWeb, Qianfan, GPS and the rest |
| `dragTerm` | How strongly the atmosphere is pulling it down |
| `elementEpoch`, `elementAgeDays`, `elementsStale` | How fresh the underlying measurements are |

**Constellations mode** returns one row per constellation: how many objects, the altitude band they occupy, average inclination and period, and the launch years they span. A single row summarises Starlink's 10,827 objects.

### Example input

```json
{
  "mode": "satellites",
  "group": "last-30-days",
  "maxResults": 150
}
```

One specific object:

```json
{
  "mode": "satellites",
  "noradIds": ["25544"]
}
```

Everything geostationary:

```json
{
  "mode": "satellites",
  "group": "geo",
  "orbitClass": "geo"
}
```

### The maths, and how to check it

Altitude and period are derived from mean motion and eccentricity rather than taken from the source, because the source does not publish them. Two independent checks that the derivation is right:

- The space station returns a 419km mean altitude, a 92.95 minute period and a 51.632 degree inclination, which is exactly where it orbits.
- Geostationary objects return 35,786km and a 1,436 minute period, which is the textbook altitude and a sidereal day.

**Element age matters.** Orbital elements decay in accuracy: a position computed from month old elements can be wrong by many kilometres. Every row carries `elementAgeDays` and an `elementsStale` flag rather than presenting old measurements as current, and `maxElementAgeDays` filters them out.

### Groups

`last-30-days` for recent launches, plus `starlink`, `oneweb`, `kuiper`, `geo`, `gps-ops`, `galileo`, `beidou`, `glo-ops`, `iridium-NEXT`, `weather`, `noaa`, `goes`, `science`, `cubesat`, `planet`, `spire`, `stations`, `active` and others the catalogue publishes. An unknown group returns a free note quoting what the source said.

### Pricing

Pay per row, `$0.003`. The first 2 rows of every run are free. Unknown groups, unmatched names and filters that remove everything return a free note and are never charged.

Large constellations run to thousands of objects, so `maxResults` is the cost lever. Constellation mode summarises the whole set in a handful of rows.

### Attribution

Orbital data from CelesTrak.

### Related actors

- **Weather Scraper: Forecast, Current & History** and **Weather Alerts** for conditions under these orbits
- **Internet Infrastructure Data** for the terrestrial networks satellite operators connect to

# Actor input Schema

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

satellites = one row per object with its orbit worked out. constellations = one row per constellation with counts, typical altitude and the launch window it spans.

## `group` (type: `string`):

last-30-days for recent launches, or starlink, oneweb, kuiper, geo, gps-ops, galileo, beidou, iridium-NEXT, weather, noaa, goes, science, cubesat, planet, spire, stations, active. Any other group the catalogue publishes also works.

## `names` (type: `array`):

Match objects whose name contains these, e.g. ISS, HUBBLE, SENTINEL. Used on its own this searches the whole catalogue by name.

## `noradIds` (type: `array`):

Look up exact objects, e.g. 25544 for the space station. Overrides the group.

## `orbitClass` (type: `string`):

leo is under 2000km, meo is between that and geostationary, geo sits at about 35786km, heo is highly elliptical.

## `minAltitudeKm` (type: `integer`):

Mean altitude floor. 0 for no limit.

## `maxAltitudeKm` (type: `integer`):

Mean altitude ceiling. 0 for no limit.

## `launchedSince` (type: `integer`):

Keep only objects launched in or after this year, read from the international designator. 0 for no limit.

## `maxElementAgeDays` (type: `integer`):

Drop objects whose orbital elements are older than this. Anything over about 30 days is too stale to compute a reliable position from. 0 keeps everything.

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

Cap on rows returned. Large constellations run to thousands of objects.

## Actor input object example

```json
{
  "mode": "satellites",
  "group": "last-30-days",
  "names": [],
  "noradIds": [],
  "orbitClass": "all",
  "minAltitudeKm": 0,
  "maxAltitudeKm": 0,
  "launchedSince": 0,
  "maxElementAgeDays": 0,
  "maxResults": 150
}
```

# 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 = {
    "group": "last-30-days"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/satellite-tracking-data").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 = { "group": "last-30-days" }

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/satellite-tracking-data").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 '{
  "group": "last-30-days"
}' |
apify call scrapemint/satellite-tracking-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/satellite-tracking-data"
        }
    }
}

```

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/obwdsn0nQI3s5uzc5/builds/SfCVZsYKagcgwXVZc/openapi.json
