Ga naar inhoud

Sandbox

De sandbox draait dezelfde code als productie: dezelfde validatie, dezelfde state machine, dezelfde hash-keten, dezelfde gebeurtenissen en webhooks. Wat verschilt: er gaat niets naar echte providers, er wordt niets gefactureerd, en je mag simuleren.

Basis-URL https://api.eftisandbox.app
Key-prefix sk_test_
Console console.eftisandbox.app
OpenAPI https://api.eftisandbox.app/openapi.json

Test- en live-data staan volledig los. Een sk_test_-key ziet nooit live-zendingen, en omgekeerd; een id uit de ene modus bestaat niet in de andere. Een live-route aanroepen met een organisatie die daar nog niet voor is vrijgegeven, geeft live_not_enabled. Andersom geldt hetzelfde: de simulatieroutes bestaan alleen in test-mode en antwoorden met een sk_live_-key met test_mode_only.

In de echte wereld tekent een chauffeur op zijn telefoon en een geadresseerde aan de laadklep. In de sandbox speelt POST /v1/test/shipments/{id}/simulate die rollen voor je, zodat je je integratie kunt testen zonder iemand een link te sturen.

Actie Body Wat er gebeurt
sign { "action": "sign", "role": "carrier" } Legt een handtekening vast voor die rol, met methode api, ondertekenaar “Sandbox <rol>” en evidence.simulated: true
deliver { "action": "deliver" } Levert af, inclusief de handtekeningen die daarvoor nog nodig waren
remark { "action": "remark", "type": "damage" } Voegt een voorbehoud toe
auto { "action": "auto" } Loopt de hele levenscyclus af tot delivered

auto is de interessantste: hij start een achtergrondproces dat de zending uitgeeft, na een paar minuten de vervoerder laat tekenen, en daarna de geadresseerde laat tekenen met een voorbehoud — elke stap via dezelfde services als een echte zending. Je krijgt dus dezelfde gebeurtenissen, dezelfde PDF’s en dezelfde webhooks als live. GET /v1/test/shipments/{id}/simulation toont de voortgang.

Wil je dat automatisch bij elke nieuwe zending, zet dan metadata.sandbox_auto: true bij het aanmaken; auto start dan vanzelf na uitgifte.

Drie corridors die elk iets anders laten zien. Ze zijn zo gekozen dat het regelregister er verschillend op reageert; zie Landvereisten.

Beide landen zijn partij bij het e-CMR-Protocol, dus er komt geen papier aan te pas en er zijn geen blokkerende bevindingen.

Terminal window
curl -X POST https://api.eftisandbox.app/v1/shipments \
-H "Authorization: Bearer $FREIGHTAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"reference": "DEMO-NL-DE",
"consignor": { "name": "Van Dijk Logistiek", "address": { "line1": "Havenweg 12", "postal_code": "3089 JH", "city": "Rotterdam", "country": "NL" } },
"carrier": { "name": "Sandbox Transport", "address": { "line1": "Industrieweg 4", "postal_code": "5222 AL", "city": "s-Hertogenbosch", "country": "NL" } },
"consignee": { "name": "Muller Handel GmbH", "address": { "line1": "Hafenstrasse 7", "postal_code": "47119", "city": "Duisburg", "country": "DE" } },
"pickup": { "address": { "line1": "Havenweg 12", "postal_code": "3089 JH", "city": "Rotterdam", "country": "NL" } },
"delivery": { "address": { "line1": "Hafenstrasse 7", "postal_code": "47119", "city": "Duisburg", "country": "DE" } },
"goods": [{ "description": "Palletized machine parts", "packages": 8, "package_type": "pallet", "gross_weight_kg": 1840 }]
}'

België ratificeerde het e-CMR-Protocol nooit. Verander country in de geadresseerde en de afleveradres naar BE en je krijgt er een bevinding bij: de Benelux-pilot vraagt om een door de NIWO erkende provider. Laat provider weg en de routing kiest er zelf een.

Zet adr: true op een goederenregel en POST /v1/shipments/validate vraagt om het UN-nummer, de juiste vervoersnaam, de gevarenklasse en de verpakkingsgroep. Handig om je foutafhandeling te testen: je krijgt een 422 met een errors-array per veld.

Terminal window
curl -X POST https://api.eftisandbox.app/v1/shipments/validate \
-H "Authorization: Bearer $FREIGHTAPI_KEY" \
-H "Content-Type: application/json" \
-d '{ "goods": [{ "description": "Paint", "packages": 2, "gross_weight_kg": 40, "adr": true }] }'

Voor je live mag, willen we zien dat je integratie de dingen aankan die in productie misgaan — niet alleen de gelukkige route. De console houdt daarom per organisatie bij welke scenario’s je in test-mode hebt aangetoond:

Scenario Wat je aantoont
create_shipment Een zending aanmaken
validate_with_error_handled Een 422 ontvangen en daarna een geldige create doen
issue Uitgeven
signature_via_link Een handtekening via een tekenlink
delivery_with_pod Afleveren met een ePOD
webhook_endpoint_configured Een endpoint ingesteld
webhook_echo_verified Een ping beantwoord met een kloppende freightapi-echo-header
webhook_delivery_succeeded Een echte levering met een 2xx
idempotency_key_used Idempotency-Key gebruikt op een POST
integrity_checked De hash-keten opgevraagd
pdf_downloaded Een PDF gedownload
auto_sandbox_run Een zending via auto laten doorlopen

Zodra alle twaalf scenario’s zijn afgevinkt, is je organisatie ready_for_live en kun je in de console live aanvragen. Vrijgeven blijft een menselijke handeling; er gaat niets automatisch aan.

  • Echte providers. Externe eCMR-platformen worden nooit aangeroepen; de mock-provider doet alsof. Een echte koppeling met een provider test je pas in productie.
  • Facturatie en limieten. De ratelimits liggen in test lager (600 per minuut tegen 1.200 live), dus een load-test in de sandbox zegt niets over live.
  • Bewaartermijnen. Sandbox-data kan worden opgeruimd. Bewaar niets wat je nodig hebt.