API Documentation
Programmatic access to satellite interference analysis and coverage data.
New to Vega? Start with our Getting Started guide.
https://vega.space/api/v1
Quick Start
Create an account
Sign up at vega.space and track at least one satellite. The ISS (ZARYA) is free for all users.
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.
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.
/api/v1/tracked_satellites
List all tracked satellites for your account.
Optional Parameters
| Parameter | Type | Description |
|---|---|---|
| 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.
/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.
/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>().
/api/v1/ground_stations
Create a new ground station.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| 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 |
/ground_stations/:id
Get a specific ground station
/ground_stations/:id
Update a ground station
/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.
/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) |
/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
Sband, whileKa,Ku,X, andCreturn empty timeseries. This is expected — useGET /interference/available_frequency_bandsto 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.
/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) |
/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) |
/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
/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"
}
/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
}
}
/api/v1/coverage_analysis_runs/:id/interference_cells/by_epoch/:epoch_index
Returns all interference cells for a specific epoch (timestep).
/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 →
| Language | HTTP Library | Install | Run |
|---|---|---|---|
| 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:
| Variable | Required | Description |
|---|---|---|
| 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.