Documentation

API Documentation

Programmatic access to satellite interference analysis and coverage data.

New to Vega? Start with our Getting Started guide.

Base URL https://vega.space/api/v1

Quick Start

1

Create an account

Sign up at vega.space and track at least one satellite. The ISS (ZARYA) is free for all users.

2

Get your API token

Go to API Tokens in your account settings, create a new token, and copy it. Or authenticate programmatically via POST /auth with your email and password.

3

Make your first request

Use the token as a Bearer header. The typical workflow is: (a) list your tracked satellites to get IDs, (b) list your ground stations to get coordinates, (c) query interference timeseries for each satellite × station pair. Try the curl commands below or grab a client library in your language.

# Set your API token (from vega.space/api_tokens or POST /auth)
export TOKEN="your_api_token_here"

# Verify authentication
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/me"

# List your tracked satellites
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/tracked_satellites"

# List your ground stations
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/ground_stations"

# Pull interference timeseries (full 7-day window)
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://vega.space/api/v1/interference/timeseries?tracked_satellite_id=1&lat=37.76&lon=-122.44"

Authentication

All API requests (except health checks) require authentication via Bearer token. There are two ways to get a token:

Option 1: Web UI (Recommended)

Go to API Tokens in your account settings, click Create, give it a name, and copy the token. Tokens created this way don't expire unless you revoke them.

Option 2: POST /auth

POST /api/v1/auth
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "your-password"
}

Response:

{
  "token": "Aha8iPmNDFr76K6jhweaLEHf",
  "user": {
    "id": 1,
    "email": "user@example.com",
    "first_name": "John",
    "last_name": "Doe"
  }
}

Using the Token

Include the token in all subsequent requests:

Authorization: Bearer YOUR_API_TOKEN

Get Current User

GET /api/v1/me

Revoke Token

DELETE /api/v1/auth

Tracked Satellites

Tracked satellites are the satellites your account monitors for interference. Each has an id (used as tracked_satellite_id in interference queries) and a nested satellite object with name, NORAD number, orbital class, and altitude.

GET /api/v1/tracked_satellites

List all tracked satellites for your account.

Optional Parameters

ParameterTypeDescription
name string Filter by satellite name (partial match)

Example Response

{
  "data": {
    "tracked_satellites": [
      {
        "id": 1,
        "satellite": {
          "name": "ISS (ZARYA)",
          "norad_number": 25544,
          "orbital_class": "LEO",
          "altitude_km": 415.8,
          "operator": "NASA/Roscosmos"
        }
      }
    ]
  },
  "meta": { "request_id": "...", "timestamp": "..." }
}

Important: Use the top-level id (not satellite.id) as tracked_satellite_id in interference queries.

GET /api/v1/tracked_satellites/:id

Get a specific tracked satellite by ID, including membership details.

Ground Stations

Ground stations are your receiver locations on Earth. Use their coordinates with interference queries, or reference them by ID with the ground-station-specific endpoints.

GET /api/v1/ground_stations

List all ground stations for your account.

Example Response

{
  "data": {
    "ground_stations": [
      {
        "id": 1706,
        "name": "KSAT - Troll",
        "latitude": "-72.011389",
        "longitude": "2.535",
        "elevation_meters": 1275,
        "active": true
      }
    ]
  },
  "meta": { "request_id": "...", "timestamp": "..." }
}

Heads up: latitude and longitude are returned as strings, not numbers. If you're using a strongly-typed language (Rust, Go, Java, C++), parse them explicitly: parseFloat(lat) / lat.parse::<f64>().

POST /api/v1/ground_stations

Create a new ground station.

Request Body

FieldTypeRequiredDescription
name string Yes Station name
latitude float Yes Latitude (-90 to 90)
longitude float Yes Longitude (-180 to 180)
description string No Station description
elevation_meters float No Altitude above sea level
GET /ground_stations/:id

Get a specific ground station

PATCH /ground_stations/:id

Update a ground station

DELETE /ground_stations/:id

Delete a ground station. Returns 200 with the deleted station object, or 404 if not found.

Interference Analysis

Enterprise Access Required

These endpoints require an active Enterprise satellite subscription. Returns 403 otherwise.

GET /api/v1/interference/at_point

Returns the interference intensity at a specific geographic coordinate and timestamp.

Parameters

Parameter Type Required Description
tracked_satellite_id integer Yes ID of your tracked satellite
lat float Yes Latitude (-90 to 90 degrees)
lon float Yes Longitude (-180 to 180 degrees)
timestamp string Yes ISO8601 timestamp
frequency_band string No Filter by band (e.g., Ka, Ku). Default: all
include_cell_id boolean No Include HEALPix cell ID in response

Response:

{
  "data": {
    "intensity": 5,
    "timestamp": "2025-12-06T08:05:00Z",
    "risk_level": "low",
    "nside": 64,
    "cell_resolution_deg": 0.9161,
    "frequency_band": "Ka"
  },
  "meta": {
    "request_id": "a702aa12-8922-4e3f-8b27-a6c4748a257f",
    "timestamp": "2025-12-09T10:30:00Z"
  }
}

Response Fields

Field Type Description
intensity integer Number of potentially interfering satellites
timestamp string Snapped timestamp (discrete 60-second intervals)
risk_level string low, moderate, high, severe
nside integer HEALPix resolution parameter
cell_resolution_deg float Approximate cell size in degrees
cell_id integer HEALPix cell ID (only if include_cell_id=true)
GET /api/v1/interference/timeseries

Returns interference intensity over time for a specific geographic coordinate within a time range. Maximum window: 7 days (10,080 data points at 1-minute resolution).

Parameters

Parameter Type Required Description
tracked_satellite_id integer Yes ID of your tracked satellite
lat float Yes Latitude (-90 to 90 degrees)
lon float Yes Longitude (-180 to 180 degrees)
start_time string No Start of time range (ISO8601). Omit for full analysis window.
end_time string No End of time range (ISO8601). Omit for full analysis window.
frequency_band string No Filter by band. Default: all

Maximum time range is 7 days (10,080 data points at 1-minute resolution). Omitting start_time and end_time returns the full analysis window — this is the recommended approach for pulling complete data.

Response (truncated — full window returns 10,080 points):

{
  "data": {
    "lat": 37.7558,
    "lon": -122.4449,
    "start_time": "2026-03-14T12:00:00Z",
    "end_time": "2026-03-21T12:00:00Z",
    "data_points": 10080,
    "nside": 64,
    "cell_resolution_deg": 0.9161,
    "frequency_band": "all",
    "timeseries": [
      { "timestamp": "2026-03-14T12:00:00Z", "intensity": 0, "risk_level": "low" },
      { "timestamp": "2026-03-14T12:01:00Z", "intensity": 0, "risk_level": "low" },
      ...
      { "timestamp": "2026-03-16T03:42:00Z", "intensity": 25, "risk_level": "high" },
      { "timestamp": "2026-03-16T03:43:00Z", "intensity": 28, "risk_level": "high" },
      { "timestamp": "2026-03-16T03:44:00Z", "intensity": 22, "risk_level": "high" },
      ...
      { "timestamp": "2026-03-21T11:59:00Z", "intensity": 0, "risk_level": "low" }
    ]
  },
  "meta": {
    "request_id": "c5f8e321-4b2a-4d8f-9c7e-1a2b3c4d5e6f",
    "timestamp": "2026-03-14T12:00:01Z"
  }
}

What the numbers mean in practice

The intensity value is the number of potentially interfering satellites visible from that location at that moment. Most data points will be 0 (no interference). Nonzero values cluster around satellite pass times. For example, an ISS (LEO) pass over San Francisco might produce ~193 nonzero points out of 10,080 (1.9%), while a NAVSTAR (MEO) satellite may show ~3,400 nonzero points (33%) due to its wider visibility cone.

See Risk Level Thresholds below for how intensity maps to risk classification.

Practical Notes

  • Set HTTP timeouts to at least 60 seconds. Full 7-day queries for MEO satellites (e.g., NAVSTAR) with high interference density can take 30+ seconds to return. The default timeout in many HTTP clients (5–10s) will cause failures. Our client libraries use 120s.
  • Some frequency bands may return 0 data points. Not every satellite has interference data in every band. For example, an S-band satellite may return data only for the S band, while Ka, Ku, X, and C return empty timeseries. This is expected — use GET /interference/available_frequency_bands to check which bands have data before querying.
  • Use frequency_band=all (the default) to get aggregate interference across all bands, then query individual bands only for the ones that have data.
GET /api/v1/interference/ground_station_timeseries

Returns interference during satellite passes over a specific ground station.

Parameters

Parameter Type Required Description
tracked_satellite_id integer Yes ID of your tracked satellite
ground_station_id integer Yes ID of your ground station
start_time string No Start of time range (ISO8601)
end_time string No End of time range (ISO8601)
GET /api/v1/interference/all_ground_stations

Returns interference at all ground stations on your account for a tracked satellite.

Parameters

Parameter Type Required Description
tracked_satellite_id integer Yes ID of your tracked satellite
start_time string No Start of time range (ISO8601)
end_time string No End of time range (ISO8601)
GET /api/v1/interference/available_frequency_bands

Returns the list of frequency bands that have interference data for a tracked satellite.

Parameters

Parameter Type Required Description
tracked_satellite_id integer Yes ID of your tracked satellite

Response:

{
  "data": {
    "tracked_satellite_id": 84,
    "coverage_analysis_run_id": 875,
    "frequency_bands": [
      {
        "name": "Ka",
        "min_ghz": 26.5,
        "max_ghz": 40.0,
        "range_ghz": "26.5-40.0 GHz"
      },
      {
        "name": "Ku",
        "min_ghz": 12.0,
        "max_ghz": 18.0,
        "range_ghz": "12.0-18.0 GHz"
      },
      { "name": "all", "min_ghz": null, "max_ghz": null }
    ]
  },
  "meta": { "request_id": "...", "timestamp": "..." }
}

Understanding Intensity & Risk Levels

The intensity value is the number of potentially interfering satellites whose signal footprint overlaps the queried location at that moment. An intensity of 25 means 25 satellites could cause RF interference at that point in time. The risk_level maps intensity to an operational severity:

Level Intensity Range Description
low 0–9 Minimal interference
moderate 10–19 Some potential interference
high 20–29 Significant interference
severe 30+ Critical interference level

Coverage Analysis

GET /api/v1/coverage_analysis_runs/:id

Returns details of a coverage analysis run.

Response:

{
  "id": 875,
  "status": "completed",
  "start_time": "2025-12-06T08:00:00Z",
  "end_time": "2025-12-13T08:00:00Z",
  "mesh_resolution": 64,
  "time_step_seconds": 60,
  "created_at": "2025-12-06T00:00:00Z"
}
GET /api/v1/coverage_analysis_runs/:id/interference_cells

Returns paginated interference cell data for a coverage run.

Parameters

Parameter Default Max Description
page 1 Page number
per_page 100 1,000 Items per page

Response:

{
  "interference_cells": [
    {
      "id": 12345,
      "epoch_index": 0,
      "nside": 64,
      "ipix": 42048,
      "ordering": "NESTED",
      "value": 5
    }
  ],
  "pagination": {
    "current_page": 1,
    "total_pages": 100,
    "total_count": 10000,
    "per_page": 100
  }
}
GET /api/v1/coverage_analysis_runs/:id/interference_cells/by_epoch/:epoch_index

Returns all interference cells for a specific epoch (timestep).

GET /api/v1/coverage_analysis_runs/:id/interference_cells/time_series

Returns interference over time for a specific HEALPix cell.

Parameters

Parameter Type Required Description
ipix integer Yes HEALPix pixel index
nside integer Yes HEALPix resolution parameter

Response:

{
  "ipix": 42048,
  "nside": 64,
  "data_points": 720,
  "time_series": [
    { "epoch_index": 0, "value": 5, "timestamp": "2025-12-06T08:00:00Z" },
    { "epoch_index": 1, "value": 4, "timestamp": "2025-12-06T08:01:00Z" }
  ]
}

Frequency Bands

The following frequency bands are supported. Use the available_frequency_bands endpoint to see which bands have data for a specific satellite.

Band Frequency Range Common Use
VHF 0.03–0.3 GHz Voice, telemetry
UHF 0.3–1.0 GHz Mobile satellite
L 1.0–2.0 GHz GPS, mobile
S 2.0–4.0 GHz Weather radar
C 4.0–8.0 GHz Fixed satellite
X 8.0–12.0 GHz Military, radar
Ku 12.0–18.0 GHz TV broadcast
K 18.0–26.5 GHz Satellite uplink
Ka 26.5–40.0 GHz High-throughput
V 40.0–75.0 GHz High capacity
W 75.0–110.0 GHz Experimental
all All bands Aggregate interference

Cell Resolution

Interference analysis uses HEALPix for spatial discretization. Multiple coordinates within the same cell return identical intensity values.

nside Cell Size Approx. km (equator)
32 1.83° 203 km
64 0.92° 102 km
128 0.46° 51 km
256 0.23° 25 km

Error Handling

HTTP Status Codes

Code Meaning
200 Success
400 Bad Request — invalid parameters
401 Unauthorized — invalid or missing token
403 Forbidden — insufficient permissions (e.g., Enterprise required)
404 Not Found — resource doesn't exist or timestamp outside window
422 Unprocessable Entity — validation error
429 Too Many Requests — rate limit exceeded
500 Internal Server Error

Error Response Format

{
  "error": {
    "code": "TIMESTAMP_OUTSIDE_WINDOW",
    "message": "timestamp outside analysis window",
    "details": {
      "valid_range": {
        "start": "2025-12-06T08:00:00Z",
        "end": "2025-12-13T08:00:00Z"
      }
    }
  },
  "meta": {
    "request_id": "a702aa12-...",
    "timestamp": "2025-12-09T10:30:00Z"
  }
}

The meta.request_id is useful for debugging and support inquiries.

Rate Limits

Endpoint Limit Window
Interference API 100 requests 1 minute
Other API 100 requests 1 hour

When you exceed the limit, the API returns 429 Too Many Requests immediately — requests are rejected, not queued. The response body contains the wait time:

HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1699876543
Retry-After: 45

{"error": {"code": "RATE_LIMITED", "message": "Rate limit exceeded"}, "retry_after": 45}

Check X-RateLimit-Remaining on every response to monitor your budget. When it hits 0, wait until Retry-After seconds have elapsed before making more requests. The per-band timeseries queries in the client libraries make 6 requests per satellite × station pair (1 aggregate + 5 bands), so plan accordingly.

SDKs & Client Libraries

Official client libraries are available in seven languages. Each includes a reusable API client class and a ready-to-run script that discovers your satellites and ground stations, then pulls interference timeseries data.

Browse & download all client libraries →

LanguageHTTP LibraryInstallRun
Python requests pip install -r requirements.txt python pull_interference.py
JavaScript axios npm install npm start
Go net/http (stdlib) go mod tidy go run .
Rust reqwest (blocking) cargo run
Java java.net.http (stdlib) javac *.java java PullInterference
C++ libcurl make ./vega_test
MATLAB webread/webwrite (stdlib) pull_interference

Quick Start (Any Language)

# 1. Clone the client library repository
# Download client libraries from https://vega.space/api-clients/
# Each language directory contains a README, client class, and runnable script
cd python/    # (or javascript/, go/, rust/, java/, cpp/, matlab/)

# 2. Copy the environment template and add your credentials
cp .env.example .env      # (MATLAB: cp env.example env.local)
# Edit .env — set VEGA_API_TOKEN  (or both VEGA_EMAIL + VEGA_PASSWORD)

# 3. Install dependencies (if needed) and run
pip install -r requirements.txt
python pull_interference.py

Configuration

All client libraries use the same environment variables:

VariableRequiredDescription
VEGA_API_TOKEN No* Pre-existing API token (recommended)
VEGA_EMAIL No* Your Vega account email
VEGA_PASSWORD No* Your Vega account password
VEGA_BASE_URL No API base URL (default: https://vega.space/api/v1)

*Either VEGA_API_TOKEN or both VEGA_EMAIL + VEGA_PASSWORD are required.

Typical API Workflow

POST /auth  (or use API token)
  → GET /tracked_satellites     → get satellite IDs
  → GET /ground_stations        → get station lat/lon
  → GET /interference/timeseries?tracked_satellite_id=ID&lat=LAT&lon=LON

cURL

# Set your token
export TOKEN="your_api_token_here"

# Check auth
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/me"

# List your satellites
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/tracked_satellites"

# List your ground stations
curl -s -H "Authorization: Bearer $TOKEN" "https://vega.space/api/v1/ground_stations"

# Pull interference timeseries (full 7-day window, omit start/end)
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://vega.space/api/v1/interference/timeseries?tracked_satellite_id=1&lat=37.76&lon=-122.44"

# Filter by frequency band
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://vega.space/api/v1/interference/timeseries?tracked_satellite_id=1&lat=37.76&lon=-122.44&frequency_band=Ka"

Python

Requires requests and python-dotenv: pip install requests python-dotenv

import requests

BASE_URL = "https://vega.space/api/v1"
TOKEN = "YOUR_API_TOKEN"
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {TOKEN}"})

# List tracked satellites
sats = session.get(f"{BASE_URL}/tracked_satellites").json()
for sat in sats["data"]["tracked_satellites"]:
    info = sat["satellite"]
    print(f"ID: {sat['id']}  Name: {info['name']}  NORAD: {info['norad_number']}")

# List ground stations
stations = session.get(f"{BASE_URL}/ground_stations").json()
for gs in stations["data"]["ground_stations"]:
    print(f"ID: {gs['id']}  Name: {gs['name']}  Lat: {gs['latitude']}  Lon: {gs['longitude']}")

# Pull interference timeseries (full 7-day window)
resp = session.get(f"{BASE_URL}/interference/timeseries", params={
    "tracked_satellite_id": 1,
    "lat": 37.76,
    "lon": -122.44,
})
data = resp.json()["data"]
ts = data["timeseries"]
intensities = [p["intensity"] for p in ts]
print(f"Points: {len(ts)}, Max: {max(intensities)}, Mean: {sum(intensities)/len(intensities):.4f}")

# Filter by frequency band
resp = session.get(f"{BASE_URL}/interference/timeseries", params={
    "tracked_satellite_id": 1,
    "lat": 37.76,
    "lon": -122.44,
    "frequency_band": "Ka",
})

JavaScript / Node.js

Requires axios: npm install axios

import axios from "axios";

const BASE_URL = "https://vega.space/api/v1";
const TOKEN = "YOUR_API_TOKEN";
const http = axios.create({
  baseURL: BASE_URL,
  headers: { Authorization: `Bearer ${TOKEN}` },
});

// List tracked satellites
const { data: satResp } = await http.get("/tracked_satellites");
for (const sat of satResp.data.tracked_satellites) {
  console.log(`ID: ${sat.id}  Name: ${sat.satellite.name}`);
}

// List ground stations
const { data: gsResp } = await http.get("/ground_stations");
for (const gs of gsResp.data.ground_stations) {
  console.log(`${gs.name} (${gs.latitude}, ${gs.longitude})`);
}

// Pull interference timeseries (full 7-day window)
const { data: tsResp } = await http.get("/interference/timeseries", {
  params: { tracked_satellite_id: 1, lat: 37.76, lon: -122.44 },
});
const ts = tsResp.data.timeseries;
const intensities = ts.map((p) => p.intensity);
console.log(`Points: ${ts.length}, Max: ${Math.max(...intensities)}`);

Go

Uses Go standard library net/http. Requires Go 1.21+.

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

func main() {
    baseURL := "https://vega.space/api/v1"
    token := "YOUR_API_TOKEN"

    // Helper: authenticated GET
    get := func(path string) []byte {
        req, _ := http.NewRequest("GET", baseURL+path, nil)
        req.Header.Set("Authorization", "Bearer "+token)
        resp, _ := http.DefaultClient.Do(req)
        defer resp.Body.Close()
        body, _ := io.ReadAll(resp.Body)
        return body
    }

    // List tracked satellites
    fmt.Println(string(get("/tracked_satellites")))

    // Pull interference timeseries
    body := get("/interference/timeseries?tracked_satellite_id=1&lat=37.76&lon=-122.44")
    var result map[string]interface{}
    json.Unmarshal(body, &result)
    fmt.Println("Response:", string(body))
}

Rust

Uses reqwest with blocking feature. Add to Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }

use reqwest::blocking::Client;

fn main() {
    let client = Client::builder().timeout(std::time::Duration::from_secs(120)).build().unwrap();
    let base = "https://vega.space/api/v1";
    let token = "YOUR_API_TOKEN";

    // List tracked satellites
    let resp = client.get(format!("{}/tracked_satellites", base))
        .bearer_auth(token)
        .send().unwrap().text().unwrap();
    println!("{}", resp);

    // Pull interference timeseries
    let resp = client.get(format!("{}/interference/timeseries", base))
        .bearer_auth(token)
        .query(&[("tracked_satellite_id", "1"), ("lat", "37.76"), ("lon", "-122.44")])
        .send().unwrap().text().unwrap();
    println!("{}", resp);
}

Java

Uses Java 11+ java.net.http (no external dependencies).

import java.net.URI;
import java.net.http.*;

public class VegaExample {
    static final String BASE = "https://vega.space/api/v1";
    static final String TOKEN = "YOUR_API_TOKEN";
    static final HttpClient client = HttpClient.newHttpClient();

    static String get(String path) throws Exception {
        HttpRequest req = HttpRequest.newBuilder()
            .uri(URI.create(BASE + path))
            .header("Authorization", "Bearer " + TOKEN)
            .GET().build();
        return client.send(req, HttpResponse.BodyHandlers.ofString()).body();
    }

    public static void main(String[] args) throws Exception {
        // List tracked satellites
        System.out.println(get("/tracked_satellites"));

        // Pull interference timeseries
        System.out.println(get("/interference/timeseries"
            + "?tracked_satellite_id=1&lat=37.76&lon=-122.44"));
    }
}

C++

Requires C++17 and libcurl. Compile with: g++ -std=c++17 main.cpp -lcurl -o vega_test

#include <curl/curl.h>
#include <string>
#include <iostream>

static size_t write_cb(void* p, size_t sz, size_t n, void* ud) {
    ((std::string*)ud)->append((char*)p, sz * n);
    return sz * n;
}

std::string get(const std::string& url, const std::string& token) {
    std::string body;
    CURL* curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
    struct curl_slist* h = curl_slist_append(nullptr, ("Authorization: Bearer " + token).c_str());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, h);
    curl_easy_perform(curl);
    curl_slist_free_all(h);
    curl_easy_cleanup(curl);
    return body;
}

int main() {
    std::string base = "https://vega.space/api/v1";
    std::string token = "YOUR_API_TOKEN";

    // List tracked satellites
    std::cout << get(base + "/tracked_satellites", token) << std::endl;

    // Pull interference timeseries
    std::cout << get(base + "/interference/timeseries"
        "?tracked_satellite_id=1&lat=37.76&lon=-122.44", token) << std::endl;
}

MATLAB

Uses built-in webread/webwrite. Requires R2016b+.

base_url = 'https://vega.space/api/v1';
token = 'YOUR_API_TOKEN';
opts = weboptions('HeaderFields', {'Authorization', ['Bearer ' token]}, ...
                   'ContentType', 'json', 'Timeout', 30);

% List tracked satellites
sats = webread([base_url '/tracked_satellites'], opts);
for i = 1:length(sats.data.tracked_satellites)
    s = sats.data.tracked_satellites(i);
    fprintf('ID: %d  Name: %s\n', s.id, s.satellite.name);
end

% Pull interference timeseries (full 7-day window)
data = webread([base_url '/interference/timeseries'], ...
    'tracked_satellite_id', '1', 'lat', '37.76', 'lon', '-122.44', opts);
intensities = [data.data.timeseries.intensity];
fprintf('Points: %d, Max: %d, Mean: %.4f\n', length(intensities), max(intensities), mean(intensities));

Example Output

All client libraries produce consistent output when run:

--- Step 1: Authenticating ---
  Using pre-configured API token

--- Step 2: Fetching user info via /me ---
  Status: 200
  User: Test Vega (ID: 23)

--- Step 3: Listing tracked satellites via /tracked_satellites ---
  Found 2 tracked satellite(s)
    ID: 1  Name: ISS (ZARYA)  NORAD: 25544  Class: LEO  Alt: 415.8 km
    ID: 3  Name: NAVSTAR 84 (USA 545)  NORAD: 64202  Class: MEO  Alt: 20181.8 km

--- Step 4: Listing ground stations via /ground_stations ---
  Found 2 ground station(s)
    ID: 1706  Name: KSAT - Troll  Lat: -72.011389  Lon: 2.535
    ID: 1704  Name: San Francisco  Lat: 37.7558  Lon: -122.4449

--- Step 5: Querying interference timeseries ---
============================================================
  ISS (ZARYA) (sat 1)  x  San Francisco (lat: 37.7558, lon: -122.4449)
============================================================
  Analysis window: 2026-03-14T12:00:00Z -> 2026-03-21T12:00:00Z
  Data points:     10080
  Frequency band:  all
  Max intensity:   28
  Mean intensity:  0.4013
  Nonzero points:  193 of 10080 (1.9%)

  Per-band summary:
      S band: 10080 pts, nonzero=193, max=25, mean=0.3721

All API responses include an X-Request-Id header for debugging and support inquiries. Contact us if you need help with integration.