Joulo's replacement offer
Joulo's own offer for replacing a laadstation without a MID meter by one with a MID meter, installed, with the old one traded in: the same products and prices as joulo.nl/vervangen. Without customer_ref you get the catalogue. With a customer_ref from GET /partner/customers you get the offer for that customer: offer is the laadstation of the same brand as their current one, alternatives are other laadstations that replace that brand, a regional one only when the customer's postal code lies in its service area. Only a customer with mid_status no_mid gets an offer. A customer who has not linked a laadstation yet connects one first. Joulo stays the seller. Ordering through the API follows in a later release; until then the customer orders on joulo.nl/vervangen. A partner in the ambassadeur work model gets 403: the brand of a laadstation is not theirs to see.
Partner API key, sent as Authorization: Bearer <key>. Production keys start with jpk_live_ and work only on https://api.joulo.nl. Sandbox keys start with jpk_test_ and work only on https://api-staging.joulo.nl. Sandbox keys minted before September 2026 also start with jpk_live_. A key used on the wrong host returns 401 with a detail. A key is bound to one partner and reaches only the Partner API routes. Any other route returns 404 when it does not exist. A route that needs a scope the key lacks, such as GET /sessions, returns 403 with error: Insufficient scope and a required_scope. Every other route returns 403 with error: partner_api_key_scope. Mint and revoke keys in the partner portal. A partner has one active key at a time.
In: header
Query Parameters
The pseudonymous reference of one of your customers, from GET /partner/customers. Leave it out for the catalogue.
^[0-9a-f]{8}$Response Body
curl -X GET "https://api.joulo.nl/functions/v1/api/partner/replacement-offers?customer_ref=string"{
"customer_ref": "3f9a1c2e",
"mid_status": "no_mid",
"current_brand": "zaptec",
"available": true,
"reason": null,
"offer": {
"product_slug": "vervanging-zaptec-go-2",
"name": "Zaptec Go 2, geplaatst",
"brand": "zaptec",
"brand_label": "Zaptec",
"price_cents": 119900,
"trade_in_cents": 10000,
"installation_included": true,
"hardware_via_joulo": false,
"lead_time_days": null,
"valid_until": "2027-01-01",
"same_brand": true,
"regional": false,
"covered": true,
"replaces_brands": [
"zaptec"
],
"image_url": "https://joulo.nl/images/partner-stores/zaptec-go-2.webp",
"options": [
{
"product_slug": "vervanging-zaptec-go-2-p1",
"name": "Zaptec Go 2 met P1-dongle, geplaatst",
"price_cents": 134900
}
]
},
"alternatives": [
{
"product_slug": "vervanging-bluebird-bluesky",
"name": "BlueBird Power BlueSky, geplaatst",
"brand": "bluesky",
"brand_label": "BlueSky",
"price_cents": 89900,
"trade_in_cents": 0,
"installation_included": true,
"hardware_via_joulo": false,
"lead_time_days": null,
"valid_until": "2027-01-01",
"same_brand": false,
"regional": true,
"covered": true,
"replaces_brands": [
"easee",
"zaptec",
"wallbox",
"tesla"
],
"image_url": "https://joulo.nl/images/partner-stores/bluebird-bluesky.webp",
"options": [
{
"product_slug": "vervanging-bluebird-bluesky-p1",
"name": "BlueBird Power BlueSky met P1-dongle, geplaatst",
"price_cents": 92500
}
]
}
]
}{
"error": "customer_ref must be the 8-character reference from GET /partner/customers"
}{
"error": "Missing or invalid API token"
}{
"error": "Not available for your partner type"
}{
"error": "Customer not found"
}{
"error": "Failed to fetch replacement offers"
}