Setup guides → Anything else
Anything else
There will always be more inverters than adapters — obscure brands, old firmware, hybrid setups, somebody's Victron. Rather than turn you away, send the readings yourself. A shell script, a Home Assistant automation, a Node-RED flow or a cron job is enough, and everything downstream works identically.
Feeding the author's own site continuously since July 2026.
The endpoint
POST https://api.sunplug.app/ingest/site
Authorization: Bearer <your API key>
Content-Type: application/json
{
"tsms": 1785759034000,
"production_kw": 4.2,
"net_import_kw": -3.1,
"consumption_kw": 1.1,
"battery_discharge_kw": 0.0,
"battery_soc": 0.62
}
Your key is in the app under Settings → Equipment → Anything else.
The fields
The one thing to get right
Export must be negative. Everything balances:
consumption = production + net_import + battery_discharge. Get
the grid sign backwards and Sunplug will believe you are importing 3 kW on a
sunny afternoon and refuse to charge — with no error, because each number is
individually plausible.
If you can only measure two of the three, send those and leave the third out; it will be derived. Sending a wrong third value is worse than sending none.
An example
curl -sS -X POST https://api.sunplug.app/ingest/site \
-H "Authorization: Bearer $SUNPLUG_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"tsms\": $(($(date +%s) * 1000)),
\"production_kw\": 4.2,
\"net_import_kw\": -3.1,
\"consumption_kw\": 1.1}"
How often
As often as you can, up to about every five seconds. Faster data directly improves tracking — every thirty seconds versus every five minutes is the difference between following a cloud edge and reacting to it. There is no penalty for duplicates or slightly out-of-order readings.
Coming from another service?
The field names, units and sign conventions here are deliberately close to what other solar-charging services accept, so a bridge you already wrote should be a change of URL rather than a rewrite.
Checking it works
The dashboard shows a data age beside the live figures; it should settle to whatever interval you are sending at. If it climbs, your posts are failing — read the response body rather than the status code, since a rejection names the offending field.
Written one of these? Tell me — I would rather ship an adapter than have you maintain a script.