JouloDocs

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.

GET
/partner/replacement-offers
AuthorizationBearer <token>

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

customer_ref?string

The pseudonymous reference of one of your customers, from GET /partner/customers. Leave it out for the catalogue.

Match^[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"
}