Editie 2026 · boekingen, zendingen en voorraad koppelen aan je eigen systeem
Wat is de publieke API
4
Toegang en API sleutels
7
Token ophalen
11
Endpoints en statussen
14
Boekingen aanmaken en bijwerken
18
Zendingen en voorraad
22
Fouten en opnieuw proberen
26
Testen in Swagger en veelgestelde vragen
30
1
Wat is depublieke API
1. Wat is de publieke API
API handleiding4
!
De publieke API is live vanaf eind november 2026. Tot die tijd kun je met deze handleiding je koppeling alvast voorbereiden. De adressen, velden en werking in deze handleiding zijn de definitieve versie 1. Je hoeft niets aan te vragen: vanaf eind november 2026 staat de API automatisch in je eigen account onder het kopje Automation, waar je zelf je sleutels aanmaakt.
Met de publieke API doet je eigen software rechtstreeks verzoeken aan het Import4You platform. Je kunt boekingen en zendingen aanmaken en je kunt boekingen, zendingen, voorraad en statustijdlijnen van je eigen bedrijf uitlezen. Je ziet alleen gegevens van je eigen bedrijf.
Boekingen
Aanmaken, bijwerken, volgen
Nieuwe import uit China boeken, handelsfactuur meesturen, producten wijzigen en de statustijdlijn uitlezen.
Voorraad
Uitlezen
Wat er van jou in ons magazijn in Hapert staat, per product en per pallet, met de verzendhistorie.
Zendingen
Aanmaken, volgen
Een zending uit je voorraad naar een eigen adres, een LVB locatie, een fulfilment center of ons magazijn, met status en leverdatum.
1. Wat is de publieke API
API handleiding5
Alle adressen staan op https://api.import4you.nl. De paden in deze handleiding zijn relatief aan de basis /public-api/v1.
Waarvoor
Adres
Swagger (interactieve documentatie)
https://api.import4you.nl/public-api/documentation
OpenAPI JSON (importeren in een REST client)
https://api.import4you.nl/public-api/openapi
Basis van alle endpoints
https://api.import4you.nl/public-api/v1
Token ophalen
POST https://api.import4you.nl/public-api/v1/oauth/token
1
Sleutel maken
In het platform, met de rechten die je nodig hebt
2
Token ophalen
client_id en client_secret inwisselen, 15 minuten geldig
3
Verzoek doen
Met de token als Bearer in de Authorization header
4
Antwoord verwerken
JSON met data, paginering en een X-Request-ID
Iedereen kan Swagger openen, maar je ziet pas gegevens na het inloggen met een sleutel van je eigen bedrijf. Je ziet nooit gegevens van een ander bedrijf.
Velden die eindigen op _at zijn tijdstippen in UTC, bijvoorbeeld 2026-06-30T09:22:22Z. Velden die eindigen op _date zijn kalenderdatums, bijvoorbeeld 2026-07-02. Verschuif die niet naar een andere tijdzone.
2
Toegang enAPI sleutels
2. Toegang en API sleutels
API handleiding7
Leest de echte gegevens van je bedrijf. Alles wat schrijft (boeking aanmaken, bijwerken, zending aanmaken) draait als dry run: het verzoek wordt volledig gecontroleerd, maar er wordt niets opgeslagen, geen bestand bewaard en geen voorraad gereserveerd. In het antwoord staat dry_run: true.
Voert alles echt uit. Een boeking die je aanmaakt, komt bij ons in behandeling. Een parameter in je verzoek kan dit gedrag niet veranderen: het type sleutel bepaalt of het echt is.
Een sleutel die verloopt, wordt ingetrokken of een nieuw secret krijgt, maakt alle tokens van die sleutel direct ongeldig.
2. Toegang en API sleutels
API handleiding8
Bij het maken van een sleutel kies je welke rechten hij krijgt. Lezen en schrijven zijn losse rechten: een schrijfrecht geeft niet automatisch leesrecht. Verander je de rechten van een sleutel, dan gelden die pas voor nieuwe tokens.
Recht
Wat je ermee mag
Endpoints
bookings:read
Boekingen lezen
GET /bookings, /bookings/{uuid}, /bookings/{uuid}/events
bookings:write
Boekingen aanmaken en bijwerken
POST /bookings, POST /bookings/{uuid}/update
shipments:read
Zendingen lezen
GET /shipments, /shipments/{id}, /shipments/{id}/events
shipments:write
Zendingen aanmaken
POST /shipments
stock:read
Voorraad lezen
GET /stock, /stock/{id}
Je wilt voorraad bekijken, daaruit een zending maken en die zending daarna volgen. Dan heeft je sleutel stock:read, shipments:write en shipments:read nodig.
Wil je alleen boekingen opvragen en hun tijdlijn volgen, dan is bookings:read genoeg. Een leessleutel kan niets aanmaken of wijzigen.
2. Toegang en API sleutels
API handleiding9
Per sleutel kun je een lijst met IP adressen opgeven die de sleutel mogen gebruiken. Een lege lijst betekent: elk adres mag, inloggen met de sleutel blijft natuurlijk verplicht. Vul je wel adressen in, gebruik dan het publieke adres van het systeem dat de verzoeken doet.
Gebruik het publieke IP van je internetverbinding. Bij het maken van een sleutel vult het platform dat adres al voor je in; je kunt het aanpassen of weghalen.
Vraag je hostingpartij of beheerder naar het uitgaande publieke IP van de server, inclusief een eventuele NAT gateway. Het IP van je laptop helpt hier niet.
Vraag de dienst naar zijn uitgaande adressen en voeg elk adres apart toe als de verzoeken van meer dan één adres kunnen komen.
Controleer het uitgaande publieke IP van het systeem dat het verzoek doet, inclusief VPN, proxy of IPv6. Pas de lijst van de sleutel aan in het platform, sla op en probeer opnieuw. Let op: VPN, mobiel internet of een andere wifi verandert je publieke IP.
3
Tokenophalen
3. Token ophalen
API handleiding11
Je sleutel gebruik je nooit rechtstreeks bij een endpoint. Je wisselt hem in voor een Bearer token (OAuth 2.0 client credentials). Die token stuur je mee in de Authorization header van elk verzoek.
POST /public-api/v1/oauth/token HTTP/1.1 Host: api.import4you.nl Accept: application/json Content-Type: application/x-www-form-urlencoded X-Request-ID: koppeling-auth-001 grant_type=client_credentials &client_id=<CLIENT_ID> &client_secret=<CLIENT_SECRET>
De drie velden gaan als formuliervelden (x-www-form-urlencoded) en moeten URL gecodeerd zijn. Een REST client doet dat voor je als je de velden los invult. HTTP Basic authenticatie met client_id en client_secret werkt ook.
{ "token_type": "Bearer", "expires_in": 900, "access_token": "<ACCESS_TOKEN>" }
GET /public-api/v1/bookings?per_page=20 HTTP/1.1 Host: api.import4you.nl Authorization: Bearer <ACCESS_TOKEN> Accept: application/json
15min
Geldig
Een token verloopt na 900 seconden. Er is geen refresh token: vraag gewoon een nieuwe aan.
1sleutel
Rechten staan vast
De token krijgt de rechten die op de sleutel staan. Een scope in je verzoek wordt genegeerd.
0×
Portaal login
Een inlogtoken van het platform werkt niet op de API. Alleen een API sleutel.
3. Token ophalen
API handleiding12
Vraag niet voor elk verzoek een nieuwe token. Bewaar hem in het geheugen en vraag een nieuwe zodra hij bijna verloopt of je een 401 krijgt.
Een eigen kenmerk per verzoek, bijvoorbeeld boeking-2026-11-10-0001. Je krijgt hem terug in het antwoord. Noem hem bij vragen aan support, dan vinden wij je verzoek direct terug.
Controleer of de token verlopen is, of de sleutel nog geldig is en of API toegang voor je bedrijf aanstaat. Een verkeerd of oud secret geeft bij het token endpoint invalid_client.
const basis = "https://api.import4you.nl/public-api/v1"; let token = null, sc-camel-verloopt-op = 0; async function haalToken() { const body = new URLSearchParams({ grant_type: "client_credentials", client_id: process.env.I4Y_CLIENT_ID, client_secret: process.env.I4Y_CLIENT_SECRET, }); const res = await fetch(basis + "/oauth/token", { method: "POST", headers: { Accept: "application/json" }, body, }); if (!res.ok) throw new Error("token " + res.status); const data = await res.json(); token = data.access_token; sc-camel-verloopt-op = Date.now() + (data.expires_in - 60) * 1000; } async function api(pad, opties = {}) { if (!token || Date.now() > verlooptOp) await haalToken(); return fetch(basis + pad, { ...opties, headers: { Authorization: "Bearer " + token, Accept: "application/json", ...(opties.headers || {}) }, }); }
4
Endpoints enstatussen
4. Endpoints en statussen
API handleiding14
Relatief aan https://api.import4you.nl/public-api/v1. GET leest, POST maakt aan of wijzigt.
Endpoint
Recht
Succes
Wat het doet
POST /oauth/token
geen
200
Token ophalen met client_id en client_secret
GET /bookings
bookings:read
200
Lijst van je boekingen, met paginering en filters op status en aanmaakdatum
POST /bookings
bookings:write
201
Boeking aanmaken (multipart met handelsfactuur)
GET /bookings/{uuid}
bookings:read
200
Eén boeking met producten, datums, levering en facturen
POST /bookings/{uuid}/update
bookings:write
200
Boeking bijwerken: factuurgegevens, documenten en eventueel producten
GET /bookings/{uuid}/events
bookings:read
200
Statustijdlijn van een boeking, met cursor
GET /shipments
shipments:read
200
Lijst van zendingen uit je voorraad
POST /shipments
shipments:write
201
Zending aanmaken uit voorraad (JSON, of multipart met bestanden)
GET /shipments/{id}
shipments:read
200
Eén zending
GET /shipments/{id}/events
shipments:read
200
Statustijdlijn van een zending
GET /stock
stock:read
200
Je huidige voorraad in ons magazijn, met zoekfilters
GET /stock/{id}
stock:read
200
Eén voorraadregel met verzendhistorie
4. Endpoints en statussen
API handleiding15
Een lijst geeft data en meta.pagination (page, per_page, total, total_pages). Standaard: pagina 1, 50 per pagina (maximaal 100), nieuwste eerst.
GET /bookings?page=1&per_page=20 &filter[status]=in_transit &filter[created_from]=2026-11-01T00:00:00Z { "data": [ { "id": "SI4Y-000123", "status": "in_transit", ... } ], "meta": { "pagination": { "page": 1, "per_page": 20, "total": 3, "total_pages": 1 } } }
GET /bookings/SI4Y-000123/events?per_page=50 { "data": [ { "event_code": "created", "status": null, "occurred_at": "2026-07-01T08:00:00Z", "recorded_at": "2026-07-01T08:00:02Z", "source": "client_api" }, { "event_code": "status_changed", "status": "in_transit", "occurred_at": "2026-07-25T08:12:00Z", "recorded_at": "2026-07-25T08:12:03Z", "source": "carrier" } ], "meta": { "next_cursor": "..." } }
Geef bij de volgende aanvraag after=<meta.next_cursor> mee. Bewaar de laatste cursor die niet null was en vraag daarmee periodiek verder; null betekent dat er nu niets nieuws is. Gebeurtenissen staan in de volgorde van vastleggen, dus een latere regel kan een eerdere occurred_at hebben. Filteren kan met event_code[]=status_changed.
4. Endpoints en statussen
API handleiding16
De API gebruikt vaste Engelse statuscodes. Die blijven in versie 1 gelijk, ook als de naam in het platform verandert.
Status
Betekenis
Status
Betekenis
registered
Boeking ontvangen
out_for_delivery
Onderweg naar je adres
collecting
Wordt opgehaald of aangeleverd in China
delivered
Afgeleverd
goods_received
Goederen binnen bij onze agent
stored_in_warehouse
Opgeslagen in ons magazijn
ready_to_ship
Klaar voor vertrek
in_storage
In opslag
in_transit
Onderweg naar Nederland
payment
Wacht op betaling
arrived_at_destination
Aangekomen in de haven, hub of luchthaven
completed
Afgerond
customs_clearance
Bij de douane
declined
Afgewezen
registered (aangemaakt) → prepared (klaargezet in het magazijn) → in_delivery (onderweg) → delivered (afgeleverd).
available (beschikbaar om te verzenden) of unavailable. Een voorraadregel toont ook boxes_count, pallets, dozen per pallet en de volledige verzendhistorie, nieuwste eerst.
De webhook stuurt de statusnaam zoals het platform die toont (bijvoorbeeld "Collection"), niet deze API code. Wil je de API code, haal dan na een webhook de boeking op via GET /bookings/{uuid}.
5
Boekingenaanmaken
5. Boekingen aanmaken en bijwerken
API handleiding18
POST /bookings met Content-Type: multipart/form-data, want de handelsfactuur gaat als bestand mee. Geneste velden schrijf je met haakjes, zoals products[0][description]. Laat je HTTP client de multipart boundary zelf zetten.
Veld
Waarde
transport_type *
sea, rail of air
incoterm *
Bijvoorbeeld FCA, EXW of FOB
personal_ref *
Je eigen kenmerk, komt terug in elk antwoord
invoice_number *
Nummer van de handelsfactuur
warehouse_ref
Naam van onze agent in China, bijvoorbeeld Shenzhen. Of custom_warehouse met een vrije naam
supplier[...] *
name, email, phone (7 tot 30 cijfers, zonder +), address[street], [house_number], [place], [postcode]
delivery[...] *
type (bijvoorbeeld lvb of custom_address), address[...], location_ref, dhl, dhl_insurance, receiver_name
documents[commercial_invoice] *
[reference] (een UUID die je zelf kiest) en [file] (pdf, maximaal 15 MiB). Optioneel: packing_list, msds_file
products[n][...] *
description, hs_code, total_value, quantity_boxes, gross_weight, cbm; optioneel ean_code, items_per_boxes, box_size, subs
Overig
is_dangerous, note, invoice_value, invoice_date, container_type, is_fiscal_representation (alleen bij België)
* verplicht. Bedragen, gewicht en CBM stuur je als tekst met punt, zoals "500.00" en "1.5", zodat er niets afrondt.
Authorization: Bearer <ACCESS_TOKEN> Idempotency-Key: boeking-2026-11-10-0001 X-Request-ID: verzoek-2026-11-10-0001
transport_type=sea incoterm=FCA personal_ref=REF-4471 invoice_number=INV-2026-118 supplier[name]=Supplier Ltd supplier[email]=sales@supplier.cn supplier[phone]=8675512345678 supplier[address][street]=Supplier St supplier[address][house_number]=10 supplier[address][place]=Shenzhen supplier[address][postcode]=518000 delivery[type]=custom_address delivery[address][street]=Dock Road delivery[address][house_number]=5 delivery[address][postcode]=3011AA delivery[address][place]=Rotterdam delivery[address][country]=NL documents[commercial_invoice][reference]= 11111111-1111-4111-8111-111111111111 documents[commercial_invoice][file]=@factuur.pdf products[0][description]=Widget products[0][hs_code]=8501100000 products[0][total_value]=500.00 products[0][quantity_boxes]=10 products[0][gross_weight]=25.5 products[0][cbm]=1.5
5. Boekingen aanmaken en bijwerken
API handleiding19
Bij succes krijg je 201 met de boeking zoals wij hem hebben opgeslagen: het publieke nummer, de status, alle producten met hun UUID's, de datums en later ook de facturen.
{ "data": { "id": "SI4Y-000123", "status": "registered", "personal_ref": "REF-4471", "transport_type": "sea", "incoterm": "FCA", "is_paid": false, "is_open": true, "dates": { "created_at": "2026-11-10T09:22:22Z", "estimated_departure_date": null, "estimated_arrival_date": null, "planned_delivery_date": null }, "products": [ { "id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10", "description": "Widget", "hs_code": "8501100000", "total_value": "500.00", "quantity_boxes": 10, "gross_weight": "25.50000", "cbm": "1.50000", "subs": [] } ], "invoices": [] } }
Je krijgt ook 201, maar met "dry_run": true en ID's die beginnen met dryrun_. Die ID's zijn stabiel voor dezelfde inhoud, maar je kunt ze nooit gebruiken als echte verwijzing. Er wordt niets opgeslagen en geen bestand bewaard.
Vertrek, aankomst en leverdatum zijn bij het aanmaken nog leeg. Ze komen in dates zodra wij ze weten. Volg ze via GET /bookings/{uuid}, de tijdlijn of de webhook.
Zodra wij factureren, staat de factuur in invoices: type (booking of fcl_additional_costs), bedrag, vervaldatum, status (pending_payment, paid, draft) en een downloadlink naar de pdf. Zie ook de handleiding Betalingen en facturen.
Zet is_fiscal_representation=true als je onze fiscale vertegenwoordiging wilt. Het veld doet alleen iets als het leverland België is.
5. Boekingen aanmaken en bijwerken
API handleiding20
POST /bookings/{uuid}/update, ook multipart en ook met een Idempotency-Key. Je kunt factuurgegevens, documenten en de producten aanpassen. Let goed op de drie regels hieronder, ze bepalen wat er met de bestaande gegevens gebeurt.
Stuur documents[commercial_invoice] bij elke update opnieuw mee. Een documenttype dat je niet meestuurt (bijvoorbeeld de paklijst) wordt verwijderd.
Laat je products weg, dan blijven de producten zoals ze zijn. Stuur je products mee, ook als lege lijst, dan vervangt dat de volledige productlijst: producten die ontbreken, worden verwijderd.
Doe dezelfde update eerst met je testsleutel. Je krijgt dan 200 met de huidige boeking terug zonder dat er iets verandert, maar wel met alle controles op je verzoek.
POST /public-api/v1/bookings/SI4Y-000123/update Authorization: Bearer <ACCESS_TOKEN> Idempotency-Key: update-SI4Y-000123-02 Content-Type: multipart/form-data invoice_number=INV-2026-118B documents[commercial_invoice][reference]= 22222222-2222-4222-8222-222222222222 documents[commercial_invoice][file]=@factuur-v2.pdf
Geen products meegestuurd, dus de producten blijven staan.
Bij delivery[type]=custom_address telt alleen delivery[address]. Een meegestuurde location_ref wordt dan genegeerd, ook bij de controle. Het adres zelf moet wel compleet en geldig zijn.
6
Zendingenen voorraad
6. Zendingen en voorraad
API handleiding22
GET /stock geeft alles wat van jou in ons magazijn in Hapert staat en beschikbaar is: per product, met subproducten, pallets en de verzendhistorie. De ID's uit dit antwoord heb je nodig om een zending te maken.
GET /public-api/v1/stock?filter[search]=Widget&per_page=50 { "data": [ { "id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10", "status": "available", "booking_uuid": "SI4Y-000123", "personal_ref": "REF-4471", "received_date": "2026-07-01", "boxes_count": 8, "start_boxes": 10, "pallets": 2, "boxes_per_pallet": 4, "items_per_boxes": 10, "box_size": { "length": 40, "width": 20, "height": 30 }, "sub_products": [ { "id": "07a76692-3f9a-4f01-8e6f-b24c56e713af", "description": "Widget A", "ean_code": "12345678", "warehouse_boxes": 8 } ], "shipments": [ { "id": "11c9e90a-7b44-4e89-9b8d-2d72b7993a41", "boxes_count": 2, "created_at": "2026-07-10T09:00:00Z" } ] } ], "meta": { "pagination": { "page": 1, "per_page": 50, "total": 1, "total_pages": 1 } } }
Filters zoeken op "bevat", letterlijk: filter[search] (omschrijving), filter[personal_ref], filter[booking_uuid] en filter[ean_code]. Meerdere filters samen betekent "en".
Voorraad die nog niet is geaccepteerd, op nul staat of geblokkeerd is, staat niet in de lijst. Een onbekend of andermans ID geeft altijd dezelfde 404.
6. Zendingen en voorraad
API handleiding23
POST /shipments met JSON, of multipart als je bestanden meestuurt (zoals een LVB leverlijst of paklijst). Ook hier is een Idempotency-Key verplicht.
POST /public-api/v1/shipments Authorization: Bearer <ACCESS_TOKEN> Idempotency-Key: zending-2026-11-10-0007 Content-Type: application/json { "personal_ref": "REF-88213", "delivery": { "type": "custom_address", "planned_delivery_date": "2026-11-14", "address": { "street": "Dock Road", "house_number": "5", "postcode": "3011AA", "place": "Rotterdam", "country": "NL" }, "receiver_name": "Jane Doe", "is_need_call": true, "comment": "Eerst bellen" }, "products": [ { "stock_item_id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10", "boxes_count": 0, "subs": [ { "stock_sub_id": "07a76692-3f9a-4f01-8e6f-b24c56e713af", "boxes": 2 } ] } ] }
Veld
Waarde
delivery.type *
custom_address (eigen adres), lvb, fulfillment_center of i4y_warehouse
delivery.planned_delivery_date *
Gewenste leverdatum, jjjj-mm-dd
delivery.location_ref
Verplicht bij lvb en fulfillment_center: het ID van een locatie uit je platform. Bij een eigen adres wordt het genegeerd
delivery.address
street, house_number, postcode, place, country, optioneel addition, truck_size, warehouse_name
products[].stock_item_id *
Het id uit /stock, uniek binnen het verzoek
products[].boxes_count *
Aantal dozen. Met subs: 0 (dan is het de som van de subs) of precies die som
products[].subs[]
stock_sub_id uit sub_products[].id plus boxes
document_references[]
reference (UUID) en file, bijvoorbeeld een LVB leverlijst, maximaal 15 MiB per bestand
6. Zendingen en voorraad
API handleiding24
GET /shipments/{id} geeft de actuele stand, GET /shipments/{id}/events de tijdlijn met dezelfde cursor als bij boekingen.
GET /public-api/v1/shipments/11c9e90a-7b44-4e89-9b8d-2d72b7993a41 { "data": { "id": "11c9e90a-7b44-4e89-9b8d-2d72b7993a41", "status": "in_delivery", "personal_ref": "REF-88213", "created_at": "2026-11-10T09:00:00Z", "status_updated_at": "2026-11-13T07:30:00Z", "prepare_status_updated_at": "2026-11-12T15:10:00Z", "delivered_at": null, "is_stockitup": false, "delivery": { ... }, "products": [ { "id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10", "description": "Widget", "shipped_boxes": 2, "subs": [ { "id": "07a76692-3f9a-4f01-8e6f-b24c56e713af", "description": "Widget A", "shipped_boxes": 2 } ] } ] } }
1
registered
Zending aangemaakt
2
prepared
Klaargezet in Hapert
3
in_delivery
Onderweg
4
delivered
Afgeleverd
Vraag /shipments/{id}/events?after=<laatste cursor> op om nieuwe gebeurtenissen te krijgen. Elke statuswijziging staat er precies één keer in. Voor zendingen is er geen webhook, dus dit is de enige manier om de status te volgen.
Na een echte zending toont /stock het lagere boxes_count en een nieuwe regel in shipments voor die voorraad.
201 met de zending: een UUID als id, status registered, de leverafspraak en de producten met shipped_boxes. Met een testsleutel: dry_run: true, een nieuw dryrun_ ID per aanroep en geen reservering van voorraad. Een geslaagde dry run garandeert niet dat de voorraad er bij het echte verzoek nog is.
7
Fouten enopnieuwproberen
7. Fouten en opnieuw proberen
API handleiding26
Boeking aanmaken, boeking bijwerken en zending aanmaken vragen altijd een Idempotency-Key header, ook bij een dry run. Daarmee kun je na een time-out of netwerkfout hetzelfde verzoek gerust nog een keer sturen zonder dat er een dubbele boeking ontstaat.
Herhaal exact hetzelfde verzoek met dezelfde sleutel en dezelfde inhoud. Krijg je 409 idempotency.in_progress, dan loopt de eerste poging nog: wacht even en probeer dezelfde sleutel opnieuw. Gebruik nooit een nieuwe sleutel na een onbekende uitkomst, dan kun je een dubbele aanmaken.
Dezelfde sleutel, maar andere velden of andere bestandsbytes. Dat weigeren we. Alleen de document referentie UUID's mogen verschillen. Na 24 uur kan dezelfde sleutel weer een nieuwe bewerking starten.
Met een testsleutel bewaren we geen antwoorden en controleren we niet op conflicten. De header is wel verplicht, zodat je code gelijk is aan live.
HTTP/1.1 422 Unprocessable Content X-Request-ID: req_01HZXABC123 { "status": 422, "request_id": "req_01HZXABC123", "errors": [ { "code": "validation.failed", "message": "The given data was invalid.", "details": { "products.0.hs_code": ["verplicht"] }, "retryable": false } ] }
7. Fouten en opnieuw proberen
API handleiding27
Elke fout heeft status, request_id en een lijst errors met code, message, details en retryable. Fouten bij het token endpoint gebruiken error en error_description.
Antwoord
Controleer of doe dit
401 invalid_client (token endpoint)
Client_id of secret klopt niet, de sleutel is verlopen of ingetrokken, of API toegang voor je bedrijf staat uit.
401 request.unauthenticated
Geen of een verlopen Bearer token. Vraag een nieuwe token aan.
403 request.forbidden
Je sleutel mist het recht voor dit endpoint. Pas de rechten aan en vraag een nieuwe token.
403 company.disabled
API toegang voor je bedrijf staat uit. Neem contact op met Import4You als dit na november 2026 nog gebeurt.
403 client.ip_not_allowed
Het uitgaande IP staat niet op de lijst van de sleutel. Zie hoofdstuk 2.
404 request.not_found
Onbekend ID, of het hoort bij een ander bedrijf.
409 idempotency.conflict / idempotency.in_progress
Zie de vorige pagina. Kijk naar retryable.
422 validation.failed / reference.unknown
Kijk in details welk veld. Een verwijzing (locatie, voorraad, productindeling) moet van je eigen bedrijf zijn.
422 company.not_ready
Je bedrijfsgegevens zijn nog niet compleet, zoals adres of KvK uittreksel. Vul ze aan in het platform of mail ons.
422 stock.insufficient / stock.boltrics_blocked
Te weinig dozen, of de voorraad is tijdelijk geblokkeerd in het magazijnsysteem. De tweede heeft retryable: true: probeer later opnieuw.
429 rate_limit.exceeded
Te veel verzoeken. Verlaag de frequentie; de limiet geldt per sleutel én per bedrijf.
503 public_api.disabled
De API staat op deze omgeving uit. Neem contact op met Import4You.
Vragen aan support? Noem de X-Request-ID, het endpoint, het tijdstip en de HTTP status. Stuur nooit je secret, token of documenten mee.
7. Fouten en opnieuw proberen
API handleiding28
!
Live vanaf eind november 2026. Bouw en test je koppeling nu alvast tegen de documentatie. Vanaf dat moment staat de API automatisch in je account onder Automation en maak je daar je testsleutel.
8
Testen envragen
8. Testen in Swagger
API handleiding30
Swagger is de interactieve documentatie op https://api.import4you.nl/public-api/documentation. Je kunt er elk endpoint uitproberen met je eigen sleutel. De verzoeken zijn echt: met een livesleutel maak je dus echt een boeking aan.
Geneste bestanden zoals documents[commercial_invoice][file] kan Swagger niet altijd goed verpakken. Lukt het niet, gebruik dan een REST client of je eigen code met dezelfde veldnamen.
Importeer https://api.import4you.nl/public-api/openapi in je REST client, dan heb je alle endpoints, velden en voorbeelden meteen klaarstaan.
Dat toont alleen het antwoord. De token wordt dan niet bij andere endpoints gebruikt; daarvoor gebruik je altijd het Authorize venster.
8. Veelgestelde vragen
API handleiding31
De publieke API gaat eind november 2026 live. Je koppeling kun je nu al bouwen op basis van deze handleiding en de OpenAPI specificatie. Aanvragen is niet nodig: na november 2026 staat de API automatisch in je eigen account onder het kopje Automation.
Via de boeking webhook. Die stuurt een ondertekend POST verzoek naar jouw adres zodra de status of de verwachte leverdatum van een boeking verandert. Dat is een losse koppeling met eigen inloggegevens, zie de webhook handleiding.
Maak in het platform een nieuw secret aan voor de sleutel (roteren) of maak een nieuwe sleutel. Het oude secret en alle tokens ervan werken dan direct niet meer.
Ja, boekingen van elk type staan in de API. Bij FCL kan er een tweede factuur zijn met type fcl_additional_costs; die staat los van de boekingsfactuur in invoices.
Mail support@import4you.nl met je X-Request-ID, het endpoint en het tijdstip, of gebruik de contactpagina . De Engelstalige technische gids staat in Swagger onder "Public API integration guide".
Editie 2026 · boekingen, zendingen en voorraad koppelen aan je eigen systeem
De publieke API is live vanaf eind november 2026. Tot die tijd kun je met deze handleiding je koppeling alvast voorbereiden. De adressen, velden en werking in deze handleiding zijn de definitieve versie 1. Je hoeft niets aan te vragen: vanaf eind november 2026 staat de API automatisch in je eigen account onder het kopje Automation, waar je zelf je sleutels aanmaakt.
Met de publieke API doet je eigen software rechtstreeks verzoeken aan het Import4You platform. Je kunt boekingen en zendingen aanmaken en je kunt boekingen, zendingen, voorraad en statustijdlijnen van je eigen bedrijf uitlezen. Je ziet alleen gegevens van je eigen bedrijf.
Alle adressen staan op https://api.import4you.nl. De paden in deze handleiding zijn relatief aan de basis /public-api/v1.
| Waarvoor | Adres |
|---|---|
| Swagger (interactieve documentatie) | https://api.import4you.nl/public-api/documentation |
| OpenAPI JSON (importeren in een REST client) | https://api.import4you.nl/public-api/openapi |
| Basis van alle endpoints | https://api.import4you.nl/public-api/v1 |
| Token ophalen | POST https://api.import4you.nl/public-api/v1/oauth/token |
Iedereen kan Swagger openen, maar je ziet pas gegevens na het inloggen met een sleutel van je eigen bedrijf. Je ziet nooit gegevens van een ander bedrijf.
Velden die eindigen op _at zijn tijdstippen in UTC, bijvoorbeeld 2026-06-30T09:22:22Z. Velden die eindigen op _date zijn kalenderdatums, bijvoorbeeld 2026-07-02. Verschuif die niet naar een andere tijdzone.
Leest de echte gegevens van je bedrijf. Alles wat schrijft (boeking aanmaken, bijwerken, zending aanmaken) draait als dry run: het verzoek wordt volledig gecontroleerd, maar er wordt niets opgeslagen, geen bestand bewaard en geen voorraad gereserveerd. In het antwoord staat dry_run: true.
Voert alles echt uit. Een boeking die je aanmaakt, komt bij ons in behandeling. Een parameter in je verzoek kan dit gedrag niet veranderen: het type sleutel bepaalt of het echt is.
Bij het maken van een sleutel kies je welke rechten hij krijgt. Lezen en schrijven zijn losse rechten: een schrijfrecht geeft niet automatisch leesrecht. Verander je de rechten van een sleutel, dan gelden die pas voor nieuwe tokens.
| Recht | Wat je ermee mag | Endpoints |
|---|---|---|
bookings:read | Boekingen lezen | GET /bookings, /bookings/{uuid}, /bookings/{uuid}/events |
bookings:write | Boekingen aanmaken en bijwerken | POST /bookings, POST /bookings/{uuid}/update |
shipments:read | Zendingen lezen | GET /shipments, /shipments/{id}, /shipments/{id}/events |
shipments:write | Zendingen aanmaken | POST /shipments |
stock:read | Voorraad lezen | GET /stock, /stock/{id} |
Je wilt voorraad bekijken, daaruit een zending maken en die zending daarna volgen. Dan heeft je sleutel stock:read, shipments:write en shipments:read nodig.
Wil je alleen boekingen opvragen en hun tijdlijn volgen, dan is bookings:read genoeg. Een leessleutel kan niets aanmaken of wijzigen.
Per sleutel kun je een lijst met IP adressen opgeven die de sleutel mogen gebruiken. Een lege lijst betekent: elk adres mag, inloggen met de sleutel blijft natuurlijk verplicht. Vul je wel adressen in, gebruik dan het publieke adres van het systeem dat de verzoeken doet.
Gebruik het publieke IP van je internetverbinding. Bij het maken van een sleutel vult het platform dat adres al voor je in; je kunt het aanpassen of weghalen.
Vraag je hostingpartij of beheerder naar het uitgaande publieke IP van de server, inclusief een eventuele NAT gateway. Het IP van je laptop helpt hier niet.
Vraag de dienst naar zijn uitgaande adressen en voeg elk adres apart toe als de verzoeken van meer dan één adres kunnen komen.
Controleer het uitgaande publieke IP van het systeem dat het verzoek doet, inclusief VPN, proxy of IPv6. Pas de lijst van de sleutel aan in het platform, sla op en probeer opnieuw. Let op: VPN, mobiel internet of een andere wifi verandert je publieke IP.
Je sleutel gebruik je nooit rechtstreeks bij een endpoint. Je wisselt hem in voor een Bearer token (OAuth 2.0 client credentials). Die token stuur je mee in de Authorization header van elk verzoek.
POST /public-api/v1/oauth/token HTTP/1.1 Host: api.import4you.nl Accept: application/json Content-Type: application/x-www-form-urlencoded X-Request-ID: koppeling-auth-001 grant_type=client_credentials &client_id=<CLIENT_ID> &client_secret=<CLIENT_SECRET>
De drie velden gaan als formuliervelden (x-www-form-urlencoded) en moeten URL gecodeerd zijn. Een REST client doet dat voor je als je de velden los invult. HTTP Basic authenticatie met client_id en client_secret werkt ook.
{
"token_type": "Bearer",
"expires_in": 900,
"access_token": "<ACCESS_TOKEN>"
}
GET /public-api/v1/bookings?per_page=20 HTTP/1.1 Host: api.import4you.nl Authorization: Bearer <ACCESS_TOKEN> Accept: application/json
Vraag niet voor elk verzoek een nieuwe token. Bewaar hem in het geheugen en vraag een nieuwe zodra hij bijna verloopt of je een 401 krijgt.
Een eigen kenmerk per verzoek, bijvoorbeeld boeking-2026-11-10-0001. Je krijgt hem terug in het antwoord. Noem hem bij vragen aan support, dan vinden wij je verzoek direct terug.
Controleer of de token verlopen is, of de sleutel nog geldig is en of API toegang voor je bedrijf aanstaat. Een verkeerd of oud secret geeft bij het token endpoint invalid_client.
const basis = "https://api.import4you.nl/public-api/v1";
let token = null, verlooptOp = 0;
async function haalToken() {
const body = new URLSearchParams({
grant_type: "client_credentials",
client_id: process.env.I4Y_CLIENT_ID,
client_secret: process.env.I4Y_CLIENT_SECRET,
});
const res = await fetch(basis + "/oauth/token", {
method: "POST",
headers: { Accept: "application/json" },
body,
});
if (!res.ok) throw new Error("token " + res.status);
const data = await res.json();
token = data.access_token;
verlooptOp = Date.now() + (data.expires_in - 60) * 1000;
}
async function api(pad, opties = {}) {
if (!token || Date.now() > verlooptOp) await haalToken();
return fetch(basis + pad, {
...opties,
headers: { Authorization: "Bearer " + token,
Accept: "application/json", ...(opties.headers || {}) },
});
}
Relatief aan https://api.import4you.nl/public-api/v1. GET leest, POST maakt aan of wijzigt.
| Endpoint | Recht | Succes | Wat het doet |
|---|---|---|---|
| POST /oauth/token | geen | 200 | Token ophalen met client_id en client_secret |
| GET /bookings | bookings:read | 200 | Lijst van je boekingen, met paginering en filters op status en aanmaakdatum |
| POST /bookings | bookings:write | 201 | Boeking aanmaken (multipart met handelsfactuur) |
| GET /bookings/{uuid} | bookings:read | 200 | Eén boeking met producten, datums, levering en facturen |
| POST /bookings/{uuid}/update | bookings:write | 200 | Boeking bijwerken: factuurgegevens, documenten en eventueel producten |
| GET /bookings/{uuid}/events | bookings:read | 200 | Statustijdlijn van een boeking, met cursor |
| GET /shipments | shipments:read | 200 | Lijst van zendingen uit je voorraad |
| POST /shipments | shipments:write | 201 | Zending aanmaken uit voorraad (JSON, of multipart met bestanden) |
| GET /shipments/{id} | shipments:read | 200 | Eén zending |
| GET /shipments/{id}/events | shipments:read | 200 | Statustijdlijn van een zending |
| GET /stock | stock:read | 200 | Je huidige voorraad in ons magazijn, met zoekfilters |
| GET /stock/{id} | stock:read | 200 | Eén voorraadregel met verzendhistorie |
Een lijst geeft data en meta.pagination (page, per_page, total, total_pages). Standaard: pagina 1, 50 per pagina (maximaal 100), nieuwste eerst.
filter[status], filter[created_from], filter[created_to]filter[status], filter[created_from], filter[created_to]filter[search], filter[personal_ref], filter[booking_uuid], filter[ean_code] (bevat, letterlijk)GET /bookings?page=1&per_page=20
&filter[status]=in_transit
&filter[created_from]=2026-11-01T00:00:00Z
{
"data": [ { "id": "SI4Y-000123", "status": "in_transit", ... } ],
"meta": { "pagination": { "page": 1, "per_page": 20,
"total": 3, "total_pages": 1 } }
}
GET /bookings/SI4Y-000123/events?per_page=50
{
"data": [
{ "event_code": "created", "status": null,
"occurred_at": "2026-07-01T08:00:00Z",
"recorded_at": "2026-07-01T08:00:02Z", "source": "client_api" },
{ "event_code": "status_changed", "status": "in_transit",
"occurred_at": "2026-07-25T08:12:00Z",
"recorded_at": "2026-07-25T08:12:03Z", "source": "carrier" }
],
"meta": { "next_cursor": "..." }
}
SI4Y-000123. Producten en subproducten hebben eigen UUID's.stock_item_id en stock_sub_id bij een zending.WI4Y- nummer werkt hier niet.Geef bij de volgende aanvraag after=<meta.next_cursor> mee. Bewaar de laatste cursor die niet null was en vraag daarmee periodiek verder; null betekent dat er nu niets nieuws is. Gebeurtenissen staan in de volgorde van vastleggen, dus een latere regel kan een eerdere occurred_at hebben. Filteren kan met event_code[]=status_changed.
De API gebruikt vaste Engelse statuscodes. Die blijven in versie 1 gelijk, ook als de naam in het platform verandert.
| Status | Betekenis | Status | Betekenis |
|---|---|---|---|
registered | Boeking ontvangen | out_for_delivery | Onderweg naar je adres |
collecting | Wordt opgehaald of aangeleverd in China | delivered | Afgeleverd |
goods_received | Goederen binnen bij onze agent | stored_in_warehouse | Opgeslagen in ons magazijn |
ready_to_ship | Klaar voor vertrek | in_storage | In opslag |
in_transit | Onderweg naar Nederland | payment | Wacht op betaling |
arrived_at_destination | Aangekomen in de haven, hub of luchthaven | completed | Afgerond |
customs_clearance | Bij de douane | declined | Afgewezen |
registered (aangemaakt) → prepared (klaargezet in het magazijn) → in_delivery (onderweg) → delivered (afgeleverd).
available (beschikbaar om te verzenden) of unavailable. Een voorraadregel toont ook boxes_count, pallets, dozen per pallet en de volledige verzendhistorie, nieuwste eerst.
POST /bookings met Content-Type: multipart/form-data, want de handelsfactuur gaat als bestand mee. Geneste velden schrijf je met haakjes, zoals products[0][description]. Laat je HTTP client de multipart boundary zelf zetten.
| Veld | Waarde |
|---|---|
| transport_type * | sea, rail of air |
| incoterm * | Bijvoorbeeld FCA, EXW of FOB |
| personal_ref * | Je eigen kenmerk, komt terug in elk antwoord |
| invoice_number * | Nummer van de handelsfactuur |
| warehouse_ref | Naam van onze agent in China, bijvoorbeeld Shenzhen. Of custom_warehouse met een vrije naam |
| supplier[...] * | name, email, phone (7 tot 30 cijfers, zonder +), address[street], [house_number], [place], [postcode] |
| delivery[...] * | type (bijvoorbeeld lvb of custom_address), address[...], location_ref, dhl, dhl_insurance, receiver_name |
| documents[commercial_invoice] * | [reference] (een UUID die je zelf kiest) en [file] (pdf, maximaal 15 MiB). Optioneel: packing_list, msds_file |
| products[n][...] * | description, hs_code, total_value, quantity_boxes, gross_weight, cbm; optioneel ean_code, items_per_boxes, box_size, subs |
| Overig | is_dangerous, note, invoice_value, invoice_date, container_type, is_fiscal_representation (alleen bij België) |
* verplicht. Bedragen, gewicht en CBM stuur je als tekst met punt, zoals "500.00" en "1.5", zodat er niets afrondt.
Authorization: Bearer <ACCESS_TOKEN> Idempotency-Key: boeking-2026-11-10-0001 X-Request-ID: verzoek-2026-11-10-0001
transport_type=sea incoterm=FCA personal_ref=REF-4471 invoice_number=INV-2026-118 supplier[name]=Supplier Ltd supplier[email]=sales@supplier.cn supplier[phone]=8675512345678 supplier[address][street]=Supplier St supplier[address][house_number]=10 supplier[address][place]=Shenzhen supplier[address][postcode]=518000 delivery[type]=custom_address delivery[address][street]=Dock Road delivery[address][house_number]=5 delivery[address][postcode]=3011AA delivery[address][place]=Rotterdam delivery[address][country]=NL documents[commercial_invoice][reference]= 11111111-1111-4111-8111-111111111111 documents[commercial_invoice][file]=@factuur.pdf products[0][description]=Widget products[0][hs_code]=8501100000 products[0][total_value]=500.00 products[0][quantity_boxes]=10 products[0][gross_weight]=25.5 products[0][cbm]=1.5
Bij succes krijg je 201 met de boeking zoals wij hem hebben opgeslagen: het publieke nummer, de status, alle producten met hun UUID's, de datums en later ook de facturen.
{
"data": {
"id": "SI4Y-000123",
"status": "registered",
"personal_ref": "REF-4471",
"transport_type": "sea",
"incoterm": "FCA",
"is_paid": false,
"is_open": true,
"dates": {
"created_at": "2026-11-10T09:22:22Z",
"estimated_departure_date": null,
"estimated_arrival_date": null,
"planned_delivery_date": null
},
"products": [
{ "id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10",
"description": "Widget",
"hs_code": "8501100000",
"total_value": "500.00",
"quantity_boxes": 10,
"gross_weight": "25.50000",
"cbm": "1.50000",
"subs": [] }
],
"invoices": []
}
}
Je krijgt ook 201, maar met "dry_run": true en ID's die beginnen met dryrun_. Die ID's zijn stabiel voor dezelfde inhoud, maar je kunt ze nooit gebruiken als echte verwijzing. Er wordt niets opgeslagen en geen bestand bewaard.
Vertrek, aankomst en leverdatum zijn bij het aanmaken nog leeg. Ze komen in dates zodra wij ze weten. Volg ze via GET /bookings/{uuid}, de tijdlijn of de webhook.
Zodra wij factureren, staat de factuur in invoices: type (booking of fcl_additional_costs), bedrag, vervaldatum, status (pending_payment, paid, draft) en een downloadlink naar de pdf. Zie ook de handleiding Betalingen en facturen.
Zet is_fiscal_representation=true als je onze fiscale vertegenwoordiging wilt. Het veld doet alleen iets als het leverland België is.
POST /bookings/{uuid}/update, ook multipart en ook met een Idempotency-Key. Je kunt factuurgegevens, documenten en de producten aanpassen. Let goed op de drie regels hieronder, ze bepalen wat er met de bestaande gegevens gebeurt.
Stuur documents[commercial_invoice] bij elke update opnieuw mee. Een documenttype dat je niet meestuurt (bijvoorbeeld de paklijst) wordt verwijderd.
Laat je products weg, dan blijven de producten zoals ze zijn. Stuur je products mee, ook als lege lijst, dan vervangt dat de volledige productlijst: producten die ontbreken, worden verwijderd.
Doe dezelfde update eerst met je testsleutel. Je krijgt dan 200 met de huidige boeking terug zonder dat er iets verandert, maar wel met alle controles op je verzoek.
POST /public-api/v1/bookings/SI4Y-000123/update Authorization: Bearer <ACCESS_TOKEN> Idempotency-Key: update-SI4Y-000123-02 Content-Type: multipart/form-data invoice_number=INV-2026-118B documents[commercial_invoice][reference]= 22222222-2222-4222-8222-222222222222 documents[commercial_invoice][file]=@factuur-v2.pdf
Geen products meegestuurd, dus de producten blijven staan.
Bij delivery[type]=custom_address telt alleen delivery[address]. Een meegestuurde location_ref wordt dan genegeerd, ook bij de controle. Het adres zelf moet wel compleet en geldig zijn.
GET /stock geeft alles wat van jou in ons magazijn in Hapert staat en beschikbaar is: per product, met subproducten, pallets en de verzendhistorie. De ID's uit dit antwoord heb je nodig om een zending te maken.
GET /public-api/v1/stock?filter[search]=Widget&per_page=50
{
"data": [
{
"id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10",
"status": "available",
"booking_uuid": "SI4Y-000123",
"personal_ref": "REF-4471",
"received_date": "2026-07-01",
"boxes_count": 8,
"start_boxes": 10,
"pallets": 2,
"boxes_per_pallet": 4,
"items_per_boxes": 10,
"box_size": { "length": 40, "width": 20, "height": 30 },
"sub_products": [
{ "id": "07a76692-3f9a-4f01-8e6f-b24c56e713af",
"description": "Widget A",
"ean_code": "12345678",
"warehouse_boxes": 8 }
],
"shipments": [
{ "id": "11c9e90a-7b44-4e89-9b8d-2d72b7993a41",
"boxes_count": 2,
"created_at": "2026-07-10T09:00:00Z" }
]
}
],
"meta": { "pagination": { "page": 1, "per_page": 50,
"total": 1, "total_pages": 1 } }
}
boxes_count: dozen die er nu staan, start_boxes: dozen bij binnenkomstpallets en boxes_per_pallet: hoe het staat opgeslagensub_products: varianten binnen een product, elk met eigen ID en aantalshipments: alles wat al uit deze voorraad is verzonden, nieuwste eerstFilters zoeken op "bevat", letterlijk: filter[search] (omschrijving), filter[personal_ref], filter[booking_uuid] en filter[ean_code]. Meerdere filters samen betekent "en".
Voorraad die nog niet is geaccepteerd, op nul staat of geblokkeerd is, staat niet in de lijst. Een onbekend of andermans ID geeft altijd dezelfde 404.
POST /shipments met JSON, of multipart als je bestanden meestuurt (zoals een LVB leverlijst of paklijst). Ook hier is een Idempotency-Key verplicht.
POST /public-api/v1/shipments
Authorization: Bearer <ACCESS_TOKEN>
Idempotency-Key: zending-2026-11-10-0007
Content-Type: application/json
{
"personal_ref": "REF-88213",
"delivery": {
"type": "custom_address",
"planned_delivery_date": "2026-11-14",
"address": {
"street": "Dock Road", "house_number": "5",
"postcode": "3011AA", "place": "Rotterdam",
"country": "NL"
},
"receiver_name": "Jane Doe",
"is_need_call": true,
"comment": "Eerst bellen"
},
"products": [
{
"stock_item_id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10",
"boxes_count": 0,
"subs": [
{ "stock_sub_id": "07a76692-3f9a-4f01-8e6f-b24c56e713af",
"boxes": 2 }
]
}
]
}
| Veld | Waarde |
|---|---|
| delivery.type * | custom_address (eigen adres), lvb, fulfillment_center of i4y_warehouse |
| delivery.planned_delivery_date * | Gewenste leverdatum, jjjj-mm-dd |
| delivery.location_ref | Verplicht bij lvb en fulfillment_center: het ID van een locatie uit je platform. Bij een eigen adres wordt het genegeerd |
| delivery.address | street, house_number, postcode, place, country, optioneel addition, truck_size, warehouse_name |
| products[].stock_item_id * | Het id uit /stock, uniek binnen het verzoek |
| products[].boxes_count * | Aantal dozen. Met subs: 0 (dan is het de som van de subs) of precies die som |
| products[].subs[] | stock_sub_id uit sub_products[].id plus boxes |
| document_references[] | reference (UUID) en file, bijvoorbeeld een LVB leverlijst, maximaal 15 MiB per bestand |
GET /shipments/{id} geeft de actuele stand, GET /shipments/{id}/events de tijdlijn met dezelfde cursor als bij boekingen.
GET /public-api/v1/shipments/11c9e90a-7b44-4e89-9b8d-2d72b7993a41
{
"data": {
"id": "11c9e90a-7b44-4e89-9b8d-2d72b7993a41",
"status": "in_delivery",
"personal_ref": "REF-88213",
"created_at": "2026-11-10T09:00:00Z",
"status_updated_at": "2026-11-13T07:30:00Z",
"prepare_status_updated_at": "2026-11-12T15:10:00Z",
"delivered_at": null,
"is_stockitup": false,
"delivery": { ... },
"products": [
{ "id": "6f5e8f7a-3d4c-4b2a-9e1f-0a6b7c8d9e10",
"description": "Widget",
"shipped_boxes": 2,
"subs": [
{ "id": "07a76692-3f9a-4f01-8e6f-b24c56e713af",
"description": "Widget A", "shipped_boxes": 2 }
] }
]
}
}
Vraag /shipments/{id}/events?after=<laatste cursor> op om nieuwe gebeurtenissen te krijgen. Elke statuswijziging staat er precies één keer in. Voor zendingen is er geen webhook, dus dit is de enige manier om de status te volgen.
Na een echte zending toont /stock het lagere boxes_count en een nieuwe regel in shipments voor die voorraad.
201 met de zending: een UUID als id, status registered, de leverafspraak en de producten met shipped_boxes. Met een testsleutel: dry_run: true, een nieuw dryrun_ ID per aanroep en geen reservering van voorraad. Een geslaagde dry run garandeert niet dat de voorraad er bij het echte verzoek nog is.
Boeking aanmaken, boeking bijwerken en zending aanmaken vragen altijd een Idempotency-Key header, ook bij een dry run. Daarmee kun je na een time-out of netwerkfout hetzelfde verzoek gerust nog een keer sturen zonder dat er een dubbele boeking ontstaat.
Herhaal exact hetzelfde verzoek met dezelfde sleutel en dezelfde inhoud. Krijg je 409 idempotency.in_progress, dan loopt de eerste poging nog: wacht even en probeer dezelfde sleutel opnieuw. Gebruik nooit een nieuwe sleutel na een onbekende uitkomst, dan kun je een dubbele aanmaken.
Dezelfde sleutel, maar andere velden of andere bestandsbytes. Dat weigeren we. Alleen de document referentie UUID's mogen verschillen. Na 24 uur kan dezelfde sleutel weer een nieuwe bewerking starten.
Met een testsleutel bewaren we geen antwoorden en controleren we niet op conflicten. De header is wel verplicht, zodat je code gelijk is aan live.
HTTP/1.1 422 Unprocessable Content
X-Request-ID: req_01HZXABC123
{
"status": 422,
"request_id": "req_01HZXABC123",
"errors": [
{
"code": "validation.failed",
"message": "The given data was invalid.",
"details": { "products.0.hs_code": ["verplicht"] },
"retryable": false
}
]
}
Elke fout heeft status, request_id en een lijst errors met code, message, details en retryable. Fouten bij het token endpoint gebruiken error en error_description.
| Antwoord | Controleer of doe dit |
|---|---|
401 invalid_client (token endpoint) | Client_id of secret klopt niet, de sleutel is verlopen of ingetrokken, of API toegang voor je bedrijf staat uit. |
401 request.unauthenticated | Geen of een verlopen Bearer token. Vraag een nieuwe token aan. |
403 request.forbidden | Je sleutel mist het recht voor dit endpoint. Pas de rechten aan en vraag een nieuwe token. |
403 company.disabled | API toegang voor je bedrijf staat uit. Neem contact op met Import4You als dit na november 2026 nog gebeurt. |
403 client.ip_not_allowed | Het uitgaande IP staat niet op de lijst van de sleutel. Zie hoofdstuk 2. |
404 request.not_found | Onbekend ID, of het hoort bij een ander bedrijf. |
409 idempotency.conflict / idempotency.in_progress | Zie de vorige pagina. Kijk naar retryable. |
422 validation.failed / reference.unknown | Kijk in details welk veld. Een verwijzing (locatie, voorraad, productindeling) moet van je eigen bedrijf zijn. |
422 company.not_ready | Je bedrijfsgegevens zijn nog niet compleet, zoals adres of KvK uittreksel. Vul ze aan in het platform of mail ons. |
422 stock.insufficient / stock.boltrics_blocked | Te weinig dozen, of de voorraad is tijdelijk geblokkeerd in het magazijnsysteem. De tweede heeft retryable: true: probeer later opnieuw. |
429 rate_limit.exceeded | Te veel verzoeken. Verlaag de frequentie; de limiet geldt per sleutel én per bedrijf. |
503 public_api.disabled | De API staat op deze omgeving uit. Neem contact op met Import4You. |
retryable: true worden later opnieuw geprobeerd, de rest komt bij een mens terechtLive vanaf eind november 2026. Bouw en test je koppeling nu alvast tegen de documentatie. Vanaf dat moment staat de API automatisch in je account onder Automation en maak je daar je testsleutel.
Swagger is de interactieve documentatie op https://api.import4you.nl/public-api/documentation. Je kunt er elk endpoint uitproberen met je eigen sleutel. De verzoeken zijn echt: met een livesleutel maak je dus echt een boeking aan.
Geneste bestanden zoals documents[commercial_invoice][file] kan Swagger niet altijd goed verpakken. Lukt het niet, gebruik dan een REST client of je eigen code met dezelfde veldnamen.
Importeer https://api.import4you.nl/public-api/openapi in je REST client, dan heb je alle endpoints, velden en voorbeelden meteen klaarstaan.
Dat toont alleen het antwoord. De token wordt dan niet bij andere endpoints gebruikt; daarvoor gebruik je altijd het Authorize venster.
De publieke API gaat eind november 2026 live. Je koppeling kun je nu al bouwen op basis van deze handleiding en de OpenAPI specificatie. Aanvragen is niet nodig: na november 2026 staat de API automatisch in je eigen account onder het kopje Automation.
Via de boeking webhook. Die stuurt een ondertekend POST verzoek naar jouw adres zodra de status of de verwachte leverdatum van een boeking verandert. Dat is een losse koppeling met eigen inloggegevens, zie de webhook handleiding.
Maak in het platform een nieuw secret aan voor de sleutel (roteren) of maak een nieuwe sleutel. Het oude secret en alle tokens ervan werken dan direct niet meer.
Ja, boekingen van elk type staan in de API. Bij FCL kan er een tweede factuur zijn met type fcl_additional_costs; die staat los van de boekingsfactuur in invoices.
Mail support@import4you.nl met je X-Request-ID, het endpoint en het tijdstip, of gebruik de contactpagina. De Engelstalige technische gids staat in Swagger onder "Public API integration guide".