JouloDocs

List ERE positions per EAN

Returns the ERE position for one compliance year for every attributed customer with an EAN on the profile, ordered by EAN and then customer_ref. An energy supplier also gets every customer who picked it as their supplier. It sees a customer only while it is their energy company in Joulo: a customer who switches supplier moves to the feed of the new one. A customer linked only through that choice has no row in GET /partner/customers and has source supplier_choice. A customer can turn off sharing with the supplier they picked. They then drop out of that supplier's feed on the next request. Remove their EAN from your own copy as well. A customer who made themselves invisible to partners (a GDPR objection) has no row here. Figures are the customer's net amounts, read from a cache that refreshes about every hour (computed_at). A partner in the ambassadeur or installateur work model gets 403: an EAN identifies an address.

GET
/partner/ere-positions
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

year?integer

Compliance year. Values outside 2026 to 2100 are clamped. A missing or non-numeric value gives the default.

Default2026
Range2026 <= value <= 2100
limit?integer

Page size. Values outside 1 to 500 are clamped. 0 or a non-number gives the default.

Default200
Range1 <= value <= 500
offset?integer

Number of rows to skip. Negative values count as 0.

Default0
Range0 <= value

Response Body

curl -X GET "https://api.joulo.nl/functions/v1/api/partner/ere-positions?year=2026&limit=200&offset=0"
{
  "positions": [
    {
      "ean": "string",
      "customer_ref": "string",
      "external_ref": "string",
      "external_ref_match": "claim",
      "label": "string",
      "source": "partner_upload",
      "registration_status": "string",
      "ean_validation_status": "matched",
      "ere_eligible": true,
      "mid_status": "mid",
      "replacement_offer": {
        "name": "string",
        "brand": "string",
        "price_eur": 0,
        "list_price_eur": 0,
        "url": "http://example.com",
        "image_url": "string",
        "same_brand": true
      },
      "compliance_year": 0,
      "registered_ere": 0,
      "allocatable_ere": 0,
      "pending_ere": 0,
      "expected_net_eur": 0,
      "realized_net_eur": 0,
      "ytd_expected_net_eur": 0,
      "quarters": [
        {
          "quarter": "string",
          "registered_ere": 0,
          "sold_ere": 0,
          "unsold_ere": 0,
          "price_per_ere": 0,
          "realized_net_eur": 0,
          "net_eur_by_status": {
            "paid": 0,
            "payable": 0,
            "reserved": 0
          },
          "final": true
        }
      ],
      "computed_at": "2019-08-24T14:15:22Z"
    }
  ],
  "limit": 0,
  "offset": 0,
  "count": 0,
  "compliance_year": 0
}
{
  "error": "Missing or invalid API token"
}
{
  "error": "Not available for your partner type"
}
{
  "error": "No partner is linked to this API key"
}
{
  "error": "Too many requests",
  "retry_after_seconds": 3
}
{
  "error": "Failed to fetch ERE positions"
}
{
  "error": "Authentication is temporarily unavailable, try again shortly"
}