Three inputs, all in formats you already have. This page is the whole integration guide.
One row per sample, in the file your ground segment already exports. Recognised as they come: Yamcs parameter exports (qualified names, raw and monitoring columns, tab-separated), OpenC3 COSMOS Data Extractor files (full or short item headers, Matlab comment header), Grafana CSV downloads, InfluxDB annotated CSV, SatNOGS exports, and plain CSV or TSV with a decimal point or comma; also xlsx, Parquet, JSON and a zip of any of these. Column names are matched to their role, so vbatt, batt_v, /EPS/HK/BatteryVoltage and EPS HK BATT_V all work; a separate charge and discharge current, or several panel currents, are combined. Units are checked by magnitude and can be set by hand: millivolts, milliamps, kelvin. Timestamps may be ISO 8601, Unix seconds, milliseconds, microseconds or nanoseconds, Excel serial days, or seconds from an epoch you give. Before anything runs you see every column, what we think it is and why, the unit, the time base, the sign convention of the current and a 24-hour preview, and you can correct any of it. The corrected mapping is remembered for the next file with the same columns.
| Column | Required | Notes |
|---|---|---|
timestamp | yes | ISO 8601 (UTC), Unix seconds/ms/µs/ns, Excel serial days, or seconds from a stated epoch. |
battery_voltage | yes | Pack voltage, V or mV. |
battery_current | yes | A or mA, or a charge current and a discharge current as two columns. Sign convention is detected from the eclipse pattern or the voltage slope; you can also state it. |
battery_temp | optional | °C, K or m°C. Improves aging estimates a lot. |
array_current | optional | Total array current, A or mA, or one column per panel (they are summed). Enables array health and shadow detection. |
soc | optional | Onboard state-of-charge estimate, % or fraction. Used for comparison only. |
eclipse | optional | 1 in shadow, 0 in sunlight (or a sunlit flag). Pins the current sign. |
Minimum useful length: a few hours. Best: weeks to months, at any cadence between 1 s and 4 min. Gaps are fine and are reported. Up to 8 MB without an account, 64 MB with a workspace key; zip large files.
The pack is learned from the file itself: its capacity from the discharges it holds (gaps of a few minutes are bridged when the load did not change), its resistance from every current step — eclipse entry and exit, a load switching — and the state of charge is re-zeroed wherever the open-circuit voltage is known. The rated capacity and the bench resistance are the starting point, not the answer. When the file carries an on-board state of charge, the last fifth of it is scored with the pack learned from the first four fifths, and that error is printed next to the nominal pack's.
Pass telemetry works too. Give the NORAD id (or your own element-set history) and every sample is placed on its orbit: you get the trend of the end-of-eclipse voltage at constant load, temperature and eclipse length, with its range and a verdict — the health trend a ground station can measure from a few samples per pass, months of passes being the only requirement.
The report leaves as a PDF made on the server from the same numbers you see on screen — verdict, figures with their ranges, findings with their physical reason, charts, method — with the file, its hash, the date and the engine version on the page, so what you forward is exactly what was computed.
With the orbit in hand the report also looks ahead: the end-of-eclipse voltage the station will see in 7 and in 30 days, from the eclipse length of every coming orbit and what the history says a minute of eclipse costs, with a band calibrated on the same forecast issued from earlier dates.
The forecast needs the orbit and a short description of the power system. The orbit is altitude, inclination and the node; a two-line element set; a CCSDS Orbit Mean-Elements Message (OMM, as JSON, KVN or XML, exactly as CelesTrak serves it); or a CCSDS Orbit Ephemeris Message (OEM) from your flight dynamics, in an inertial or Earth-fixed frame. Presets exist for common battery packs and platform classes; every value can be overwritten.
CSV or JSON, one row per activity, or an iCalendar (.ics) pass schedule from your ground-station network: each event becomes an activity, passes and contacts are treated as committed downlinks, and the event summary sets the type. In CSV the first four columns and an end or a duration are required.
| Column | Notes |
|---|---|
activity_id | Your identifier for the task. |
satellite_id | Your identifier for the satellite; it must match the name given in the forecast. |
type | IMAGING, DOWNLINK, CALIBRATION, MAINTENANCE, MANEUVER, or your own. Downlinks are treated as committed: never moved or dropped. |
start_utc | ISO 8601 UTC, with end_utc or duration_s. |
power_w | Average power during the task, in watts. |
priority, value | Optional. Priority 1 is highest. Value in euros is what the task is worth; it drives cost-versus-value decisions. |
earliest_utc, latest_utc | Optional. The window inside which the optimiser may move the task. Without a window the task stays where it is. |
Give the end-of-mission date, the rule (FCC 5-year, ESA Zero Debris, 25-year or your own) and the disposal plan as a short list of activities: power, minutes, how many times, how far apart. Templates cover a drag sail, electric manoeuvres and passivation. Battery, array and orbit are taken from steps 1 and 2; safe-mode load and attitude in disposal are yours to set.
The answer is a table by year to the deadline: projected state of health with its range, effective array power, energy generated and needed per orbit in the worst eclipse, usable energy against the deepest draw, and the share of projected cases with margin. From it: the last safe start date, the passivation time, and the energy share of the disposal probability. It is printable as a “power at disposal” page.
The validation figures behind every number on this site, each with its control arm and its held-out test, are in the white paper.
A connector reads telemetry where it already lives, so the analysis repeats itself without anyone exporting a file. Three sources today: Yamcs (the parameter archive of one instance), OpenC3 COSMOS (decommutated items over its streaming API) and Grafana (any datasource behind it, with your own query). You name the channel for each role — battery voltage, current, temperature, array or panel currents — test it, and choose a window and a cadence.
Each pull fetches the last window, runs the battery analysis with the satellite's pack and threshold, saves the summary to the satellite and raises alerts. Nothing raw is stored: the telemetry is read, analysed and dropped. Scheduled pulls run from a scheduler you control that calls the poll endpoint with your key, so Apsia never holds an open session into your ground segment. Tokens stay on the server and are never returned.
Grafana can also read Apsia: three endpoints return flat rows (health history, forecasts, alerts) for the JSON API or Infinity datasource with your key as a header, so state of health and open alerts sit on the dashboards your operators already watch. Connectors are read-only. Recommendations go back as files in your formats, through the API, or on those dashboards.
The free analysis needs no account. A workspace key adds memory: each analysis is saved to its satellite, with the column mapping and the power sheet. The fleet view lists every satellite with its latest health, fade, months to end of life, array status and open alerts; each satellite keeps a history of health with ranges, resistance and the trend across analyses.
Alerts fire when a saved analysis crosses a rule: health below the end-of-life threshold, a knee in the fade, a dead panel, a step loss of array current, a forecast that breaches the reserve, resistance growth, or no analysis for N days. Rules can be fleet-wide or per satellite, with an e-mail address.
The same key gives programmatic access to the four operations (analyse, forecast, check, propose), in JSON, with CSV and JSON exports. Keys come with a pilot or subscription and can be rotated or revoked. University teams get an academic key by verifying a university e-mail in the app.
Enterprise customers run Apsia as a container inside their own infrastructure. It exposes the same operations on your network, needs no outbound connection, and receives updates as signed images. Nothing leaves your perimeter.
Housekeeping telemetry only: voltages, currents, temperatures. Never payload data, never commands. Processing in the European Union. The free analysis stores nothing after the run; workspaces store summaries and reports, not raw telemetry. Full note on the security page.
The reports use the vocabulary of the European space battery standards, so a finding reads the same in your test reports and in ours.