JouloDocs
CpoApi

Sandbox

Test the Integrated API against Joulo's staging environment • no real machtigingen, no ERE registration, no payouts.

Sandbox

The sandbox is a full copy of the Integrated API running on Joulo's staging environment. Build and test your integration here before you touch production.

Base URL

https://api-staging.joulo.nl/functions/v1/api

Tokens come from the staging token endpoint:

POST https://api-staging.joulo.nl/functions/v1/oauth-token

The endpoints, scopes, request and response shapes are identical to production • only the host differs. Swap the base URL and your integration moves environments.

Get sandbox credentials

Sandbox credentials are separate from production credentials: a production client_id does not work on the sandbox and vice versa. Ask your Joulo contact for a sandbox client • you receive a client_id and client_secret scoped to your own test partner.

What the sandbox does not do

The sandbox is deliberately inert. Accounts, mandate links and charging data behave exactly like production, but nothing leaves the environment:

  • No ERE registration. Nothing is ever submitted to the NEa from the sandbox. A test machtiging has no legal effect and does not bind an EAN.
  • No EAN register. The sandbox never calls the Dutch EAN register. It answers from the EAN you send instead: its last four digits pick matched, unverified or mismatched. See test values and helpers.
  • No payouts. No payment provider is connected.
  • No email. Customers you create receive nothing. The sandbox keeps each mail, and GET /sandbox/v1/mail shows it to you.
  • No charger-backend syncs. Session data enters through the API endpoints you call, or from a virtual charger you connect with a sandbox helper.

The flip side: never test against production. A machtiging signed on production is a legal act that binds that EAN to Joulo, even when it was meant as a test.

Test data

Invent it. Names, email addresses, IBANs, EANs and addresses may all be fictional. Keep the EAN 18 digits and starting with 871: the format rules still apply, and the real Dutch prefix keeps your test payloads valid on production too.

The EAN's last four digits decide the address check. An EAN ending in 0003 returns 422 ean_address_mismatch, just as production does when the EAN does not belong to the address. Any EAN without a test ending is accepted as matched. The full list is on test values and helpers.

Ids are per environment

The sandbox runs its own database. Every id you see there is local to it: catalog_charger_id, account_id, connection_id, charger_id. The same charger model therefore has a different catalog_charger_id on the sandbox than on production. Resolve or look up ids per environment, and never ship a sandbox id in production code.

POST /v1/mandate-links returns a URL on the website that belongs to the environment you called. On the sandbox that host is staging.joulo.nl:

{
  "url": "https://staging.joulo.nl/machtiging/cpo/d002de08…"
}

Deliver the URL exactly as you receive it. The token lives in the sandbox database, so the same token on joulo.nl reports the link as invalid.

Data lifetime

Sandbox data is kept indefinitely but carries no guarantees. We reset the environment on request rather than on a schedule, and we announce a reset to active integrators beforehand.