PV yield: GET /api/v1/pv-yield
GET /api/v1/pv-yield answers the specific yield in kWh/kWp per year and per month, the plane-of-array irradiation, the local optimum and the orientation factor for any point in Sweden × tilt × azimuth, and with a kwp parameter the annual and monthly kWh. The dataset is PVGIS 5.3 monthly irradiation per roughly 25 km grid node pushed through the solar-core engine for 19 tilts × 36 azimuths; a lookup interpolates between the four surrounding nodes and in tilt steps of 5° and azimuth steps of 10°. Compass azimuth (0 = N, 180 = S), 14 % system loss by default, free horizon. /pv-yield/matrix returns the whole tilt × azimuth matrix, /pv-yield/batch takes up to 50 points in one POST, /pv-yield/meta describes the dataset, and /pv-yield/openapi.json is the contract.
Simulation: POST /api/v1/simulation
POST /api/v1/simulation runs one non-leap year hour by hour for your own PV series (8 760 hourly values, or one typical day per month) and use series (hourly values, or a yearly kWh spread with the household model plus EV km per day), with a battery that starts at its floor on 1 January and carries its state from day to day. Prices are the se_spot preset — last year's day-ahead profile of the price area with supplier markup, grid fee, energy tax and VAT — or your own: a flat number, a month × hour profile or 8 760 values. POST /api/v1/simulation/battery-strategies runs the same house for up to 25 battery size × strategy cells — self consumption, arbitrage, peak shaving and combined — and every call also runs the house without a battery, so the savings are the difference.
Limits, caching and docs
Without a key: 60 yield lookups, 10 matrix calls, 10 simulation requests and 50 simulation cells per minute per IP address. With an x-api-key: 600 lookups, 60 matrix calls, 100 requests and 500 cells; one key opens both APIs. Every yield answer carries Cache-Control public, max-age 86 400 and an ETag from the dataset version and the normalised parameters, so a repeated GET with If-None-Match answers 304. CORS is open. Nothing at request time touches the database, a subprocess or an external service: the dataset lives in memory and the simulation is CPU only, with at most 2 simulation requests at a time per node (a third gets 503 and Retry-After 1). The docs page is /docs/api.
HubSpot and Fortnox
HubSpot: a prospect with an email is looked up as a contact by that email, or created, and a deal is created and associated with it; when the prospect changes, the deal is updated. The calculation data arrives as numsolar_ properties on the deal: address, latitude and longitude, panel count and title, total kW, inverter count and title, battery kWh, charger count, roof sides, adults in the household and the house's main fuse. Fortnox: the offer becomes an invoice where each row carries the house-work type of its line's subsidy class — SOLARCELLS, STORAGESELFPRODUCEDELECTRICITY or CHARGINGSTATIONELECTRICVEHICLE — and the tax-reduction amounts are summed per work type and split between the adults as the offer's grön teknik deduction was, one part per started 50 000 kr unless you configured another split.

Formify and your website
Formify: the agreement goes out for e-signature from the offer; Numsolar registers a webhook for created, opened, signed, completed, revoked and deleted, each signee's status and signing time are stored on the offer's agreement, and the signed document comes back as an attachment on the offer. Your website: the configurator as an embed at /embedded/<slug> with your packages, the SDK documented at /docs/sdk, and the public link /i/<your slug> for ads. The integrations are part of the subscription; the free listing has the public API and the listing, not the integrations.
What the API is not, yet
The public API covers yield and simulation. There is no organisation-scoped API for your leads, offers or prospects, no webhooks from Numsolar to your systems and no per-organisation API keys; the x-api-key tier is a rate-limit tier for the public endpoints. Your leads reach you by email, in the inbox and through HubSpot.