For installers

The API and the integrations

The same engine that prices the homeowner's roof is open over HTTP without a key, with OpenAPI 3.1 docs at /docs/api. The integrations connect your offers to HubSpot, Fortnox and Formify.

The API: the same engine, open, no key

GET /api/v1/pv-yield answers kWh/kWp per year and month for any point in Sweden × tilt × azimuth; POST /api/v1/simulation/battery-strategies runs a year of hourly flows for your own PV and use series with up to 25 battery × strategy cells. No key: 60 yield lookups and 10 simulations per minute per IP; a key raises both tenfold. OpenAPI 3.1, CORS open, yield answers cached for a day with an ETag.

Solar yield

Stockholm · 35° · 180° · 9.24 kWp

983 kWh/kWp · 9,085 kWh/year

GET /api/v1/pv-yield?lat=59.33&lng=18.07&tilt=35&azimuth=180&kwp=9.24

Battery and strategies

15,000 kWh/year · Battery sizes: 0 / 5 / 10 kWh

10 kWh · Own solar first — charge with surplus, use in the evening · SEK 2,600/year

Yearly savings from the battery compared with no battery, at SE3 spot prices. The numbers come from the API response.

POST /api/v1/simulation/battery-strategies

Full documentation OpenAPI

Per minute: without a key / with a key Yield lookups 60 / 600 Simulations 10 / 100 Battery cells 50 / 500

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.

Example
Roof 9,707 kWh Home and car 8,089 kWh Battery 424 kWh Sold to the grid 1,194 kWh Bought from the grid for the home: 29,225 kWh

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.

Per minute: without a key / with a key Yield lookups 60 / 600 Simulations 10 / 100 Battery cells 50 / 500

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.

HubSpot logoFortnox logo

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.

The branded client link on a phone: Demo Sol AB's price card for the roof.

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.

In numbers

Endpoints
GET /pv-yield, /matrix, /meta; POST /pv-yield/batch (50 points); POST /simulation, /simulation/battery-strategies
No key, per IP per minute
60 lookups, 10 matrix, 10 simulations, 50 cells
With a key, per minute
600 lookups, 60 matrix, 100 simulations, 500 cells
Battery strategies per call
Up to 25 size × strategy cells
Yield caching
Cache-Control max-age 86 400 and an ETag; 304 on match
Dataset
PVGIS 5.3, about 25 km grid, 19 tilts × 36 azimuths, Sweden
Contract
OpenAPI 3.1 at /api/v1/pv-yield/openapi.json, docs at /docs/api
Integrations
HubSpot, Fortnox, Formify, embed + SDK; subscription only