Publish your first station
import { GoodchargeStation } from '@goodcharge/sdk';
const station = new GoodchargeStation({ apiKey: process.env.GOODCHARGE_API_KEY! });
await station.publish({
metadata: {
gps_coordinates: { latitude: 45.764, longitude: 4.835 },
address: '1 place Bellecour',
city: 'Lyon',
postal_code: '69002',
country: 'FR',
private: { level: 'public' },
},
charging_points: [{ plug_type: 'type_2', power: 22, status: 'free' }],
pricing: { connection_fee: 0.5, price_per_kilowatt_hour: 0.35, currency: 'EUR' },
});
// When a car plugs in:
await station.updatePoints([{ position: 1, status: 'occupied' }]);
// When nothing changes, keep the station alive (goodcharge flags it after 15 minutes of silence):
const stop = station.startHeartbeat({ onError: console.error });
Calls on one GoodchargeStation are serialised: each one waits for whichever call is already in flight to settle before it starts its own first attempt, so a retried write can never land after a newer call, and a heartbeat never races an app call. There is nothing to await or lock yourself — just call the methods in order.
What happens next
publish returns { state }. Right after this first publish, state.dot is orange: every station of an operator shows orange until the review of that operator's first station that sent data is decided. Once that first station is approved, later stations go green as soon as they are published — they are not reviewed individually.
From here, keeping occupancy fresh with updatePoints and the heartbeat is a guide of its own, and the full method-by-method reference documents publish, updatePoints, heartbeat, get, and startHeartbeat.