Udviklere
API til toldkontrol
Samme kontrol som på dette site, kaldt fra din egen software. Du sender en sag som JSON og får en score ud af 100, de blokerende punkter, advarslerne og de anbefalede handlinger — med stabile afvigelseskoder og beskeder på EU's 24 officielle sprog.
Dette er en server-til-server-API. En API-nøgle er en hemmelighed. Kald fra en browser understøttes ikke, og der sendes ingen CORS-headere på godkendte ruter: en nøgle, der havner i en browser, er en lækket nøgle.
Overblik
API'et giver adgang til validatorens kontrolmotor: fjorten tværgående regler, fem TARIC-regler, fire regler om fuldstændige dokumenter og de validatorer, der hører til hvert angivelsessystem. Det sender intet: det kontrollerer formatet og sammenhængen i din sag, om koderne findes i nomenklaturen og, ved import til EU, de TARIC-foranstaltninger, der gælder for oprindelsen (antidumping, kontrol, præferencer, toldsats), før du forbereder angivelsen.
Alle ruter har deres version som præfiks. Opdagelsesruterne og specifikationen er offentlige: en integrator eller en agent kan læse skemaet, før vedkommende har en nøgle.
| Rute | Rolle | Godkendelse |
|---|---|---|
| POST/v1/checks | Kontrollerer en sag og returnerer den fulde rapport | Nøgle påkrævet |
| POST/v1/checks/batch | Kontrollerer op til 25 sager i ét kald | Nøgle påkrævet |
| GET/v1/me | Returnerer den aktuelle nøgle og dens kvote uden at bruge af den | Nøgle påkrævet |
| GET/v1/declaration-types | Viser de angivelsestyper, der genkendes | Offentlig |
| GET/v1/declaration-types/{type} | Beskriver de felter, der forventes for en type | Offentlig |
| GET/v1/openapi.json | OpenAPI 3.1-specifikationen for dette API | Offentlig |
Godkendelse
API'et godkender med et bearer-token. Tokenet vises kun én gang, ved oprettelsen: kun aftrykket gemmes, så en mistet nøgle erstattes, aldrig genskabes.
Du kan have tre aktive nøgler ad gangen, så du kan rotere en nøgle uden at afbryde din integration: opret den nye, rul den ud, og tilbagekald derefter den gamle.
- 01Opret en nøgle fra din konto under „API-nøgler“.
- 02Send den i Authorization-headeren i hver anmodning.
- 03Tilbagekald den ved lækage: afbrydelsen er øjeblikkelig, og indholdet af de sager, der er indsendt med nøglen, slettes med det samme.
Authorization: Bearer cc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFørste kontrol
En sag består af en type, et hoved og varelinjer. Alle værdier er tekststrenge: motoren står for at fortolke dem. Feltnavnene opdages ved kørsel, type for type.
Svaret kommer med det samme; der er intet at spørge om bagefter.
curl https://www.customs-check.com/api/v1/checks \
-H "Authorization: Bearer $CUSTOM_CHECK_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "import-export",
"reference": "PO-2026-114",
"header": {
"flow": "IM",
"shipmentCountry": "CN",
"destinationCountry": "FR",
"incoterm": "FOB",
"companyName": "Acme SAS",
"companyCountry": "FR",
"eori": "FR12345678900012",
"transportMode": "sea",
"currency": "USD",
"invoiceTotal": "12500"
},
"items": [
{
"description": "Leather sport shoes",
"hsCode": "6403990000",
"quantity": "500",
"value": "12500",
"origin": "VN",
"grossMass": "850",
"netMass": "800"
}
],
"documents": { "commercialInvoice": "available", "packingList": "missing" }
}'At læse svaret
Hver afvigelse bærer både en maskinidentitet og en læsbar sætning. Byg din logik på maskinidentiteten: den ændrer sig ikke uden et versionsskift.
- severity · code · path · rule
- Stabil kontraktStabile. Nye koder kan komme til; eksisterende omdøbes ikke uden et versionsskift.
- field · message · text
- Kun visningOversat til visning. De kan omformuleres når som helst — sammenlign dem aldrig i din kode.
- engine.version
- Ændrer sig, så snart en regelændring flytter scoren for en uændret sag. Arkivér den sammen med dine rapporter.
Feltet „path“ spejler formen på din anmodning, så du kan knytte en afvigelse direkte til det tilsvarende felt i din egen grænseflade.
header.<felt> · items.<n>.<felt> · documents.<category> · global
{
"id": "4c749e25-3408-48f9-b3ca-b18a7ad84681",
"createdAt": "2026-09-16T12:46:13.186Z",
"type": "import-export",
"locale": "en",
"reference": "PO-2026-114",
"score": 90,
"level": "good",
"counts": { "errors": 0, "warnings": 2, "infos": 1 },
"documents": { "commercialInvoice": "available", "packingList": "missing" },
"issues": [
{
"severity": "warning",
"code": "docPackingListMissing",
"path": "documents.packingList",
"rule": "DOC-002",
"params": null,
"field": "Packing list",
"message": "Packing list not provided",
"text": "Packing list not provided"
},
{
"severity": "warning",
"code": "docTransportMissing",
"path": "documents.transportDocument",
"rule": "DOC-003",
"params": null,
"field": "Transport document (B/L, AWB, CMR)",
"message": "Transport document not provided",
"text": "Transport document not provided"
}
],
"actions": [
{ "severity": "warning", "code": "docPackingListMissing",
"path": "documents.packingList", "text": "Add: Packing list" }
],
"tips": [
{
"severity": "info",
"code": "taricControlsPossible",
"path": "items.0.hsCode",
"rule": "RULE-017",
"params": { "measures": "Import control - CITES ; Import control on seal products" },
"field": "Product 1 — HS / commodity code (if known)",
"message": "Possible import controls depending on the goods (Import control - CITES ; Import control on seal products): check whether they apply.",
"text": "Product 1 — HS / commodity code (if known): Possible import controls depending on the goods (Import control - CITES ; Import control on seal products): check whether they apply."
}
],
"engine": { "version": "1.6.0", "rules": 25, "taric": "2026-10-01" }
}Opdag felterne
Angivelsestyper og deres felter er offentlige, og der kræves ingen nøgle. Det er ruten til at bygge en formular, fodre en mapning fra dit ERP eller give en agent det skema, den skal udfylde.
Navnene her er præcis de nøgler, der skal bruges i hovedet og i hver varelinje. Valglister returneres opslåede og oversatte; tilføj parameteren for at udelade dem, hvis svaret virker tungt.
# The 8 declaration types
curl "https://www.customs-check.com/api/v1/declaration-types?locale=en"
# The fields of one type
curl "https://www.customs-check.com/api/v1/declaration-types/h7?locale=en"
# Same, without the resolved option lists
curl "https://www.customs-check.com/api/v1/declaration-types/h7?options=false"Batchbehandling
Op til 25 sager pr. kald. Svaret er altid en succes, når batchen er accepteret, og hver post bærer sin egen status: én misdannet sag får aldrig de andre til at fejle.
Dækker den resterende kvote ikke alle gyldige poster, afvises hele batchen frem for at blive delvist behandlet — du skal aldrig gætte, hvor behandlingen stoppede.
curl https://www.customs-check.com/api/v1/checks/batch \
-H "Authorization: Bearer $CUSTOM_CHECK_KEY" \
-H "Content-Type: application/json" \
-d '{ "checks": [ { "type": "h7", "header": {}, "items": [] } ] }'Agenter og værktøjer
Ud over REST-ruterne er den samme motor og de samme data tilgængelige fra en AI-assistent via en Model Context Protocol-server (MCP) og fra en API-klient via en færdig Postman-samling. Begge bruger API-nøglen og den daglige kvote, der er beskrevet ovenfor.
MCP-server
MCP-serveren lader en assistent slå toldkoder op, læse EU-importtolden for en kode, kontrollere et EORI-, moms- eller AEO-nummer i de officielle registre og kontrollere et udkast til en angivelse uden at du skriver en eneste linje limkode. Den svarer på POST /api/mcp med JSON-svar.
Den er tilstandsløs og taler begge generationer af protokollen: revisionen 2026-07-28, hvor hver forespørgsel bærer sin version, og de tidligere revisioner, der åbner med et initialize-kald. Forbindelse, opdagelse og visning af værktøjerne er gratis; hvert værktøjskald bruger én enhed af nøglens daglige kvote.
Godkendelsen er samme bearer-token som i REST-API'et. En klient, der kun understøtter OAuth-login, som f.eks. claude.ai's webconnectors, kan endnu ikke oprette forbindelse: brug en klient, hvor du kan angive en header.
POST https://www.customs-check.com/api/mcp
claude mcp add --transport http customs-check https://www.customs-check.com/api/mcp \
--header "Authorization: Bearer $CUSTOM_CHECK_KEY"| check_declaration | Kontrollér et udkast til en angivelse: score ud af 100, niveau og hver fejl med feltet og handlingen. Gemmer ikke filens indhold, medmindre du beder om det. |
| list_declaration_types | De understøttede angivelsessystemer med myndighed, region og forventede dokumenter. |
| describe_declaration_type | Header- og varefelterne for en type, så du kan opbygge input til check_declaration. |
| search_hs_codes | Kandidater i den kombinerede nomenklatur ud fra en varebeskrivelse på et af EU's 24 sprog. |
| describe_hs_code | Om en kode på 4 til 10 cifre findes i den gældende nomenklatur, med dens officielle sti og ordlyd. |
| lookup_import_duty | EU-importtold for en kode ud fra Kommissionens TARIC-data: told for tredjelande, præferencer for en oprindelse, kvoter, antidumping og kontroller. |
| search_chemical | Et kemisk stof efter CAS-nummer, CUS-nummer eller navn i Kommissionens ECICS-fortegnelse: den kode i den kombinerede nomenklatur, der er angivet for hver post, til kontrol. |
| get_quota_balance | Resterende saldo for et EU-toldkontingent i Kommissionens QUOTA-database, ud fra løbenummeret eller en kode og en oprindelse: saldo, tilstand (åbent, kritisk, blokeret, opbrugt), periode og tidspunkt for aflæsningen. |
| validate_eori | Formatet på et EORI-nummer og dets status i det officielle register (Europa-Kommissionen, HMRC). |
| validate_vat | Formatet på et EU-momsnummer og dets gyldighed i VIES, med det registrerede navn, hvor det er offentliggjort. |
| check_rex | Formatet på et REX-nummer for en registreret eksportør og dets status i Kommissionens REX-database (gyldigt, tilbagekaldt eller ukendt), med datoer. |
| screen_sanctions | En virksomhed, person eller et skib mod sanktionslisterne fra EU, FN, Storbritannien og USA, opdateret hver dag: hvert match med sin score, stærkt eller delvist. |
| search_aeo | Søg i Kommissionens database over godkendte økonomiske operatører efter virksomhedsnavn. |
- Toldkoder er forslag hentet fra nomenklaturens ordlyd. Kun angiveren eller en bindende tariføroplysning fra toldvæsenet kan bekræfte en klassificering.
- Told er vejledende: betingelser, landeudelukkelser og opbrugte kvoter vurderes ikke. Hvert svar bærer referencedatoen for TARIC-udtrækket, som opdateres månedligt.
- Et register, der ikke svarer, rapporteres som utilgængeligt, aldrig som et ugyldigt nummer. Der sendes aldrig noget til toldvæsenet.
Postman-samling
Samlingen genereres ud fra OpenAPI-specifikationen, så den altid stemmer overens med den: én forespørgsel pr. rute, grupperet efter tag, med et skelet til body for hver POST. Importér den i Postman, udfyld variablen apiKey (gemt som hemmelighed), og forespørgslerne er klar til at blive sendt.
Download samlingenKvote
Hver nøgle har 500 kontroller pr. UTC-kalenderdag. Den aktuelle status følger med hvert godkendt svar, så du behøver aldrig et ekstra kald for at kende den.
Afviste kald tæller også med: en klient, der kører i ring på ugyldige anmodninger, bremser sig selv. Kvoten fastsættes pr. nøgle — skriv til os, hvis du har brug for mere.
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 437
X-RateLimit-Reset: 1789603200
X-RateLimit-Policy: 500;w=86400Fejl
Fejlbeskeder er kun på engelsk: det er protokolbeskeder henvendt til udviklere. Kun det faglige indhold er oversat.
Hvert svar bærer et anmodnings-id, der gentages i brødteksten. Angiv det, når du kontakter os — det fører os direkte til kaldet.
{
"error": {
"code": "invalid_request",
"message": "The request body failed validation.",
"details": [
{ "path": "items.0.quantity", "message": "expected a string" }
],
"requestId": "2bbb0946-6178-4b54-921c-b28f794c44bd"
}
}| Status | code | Betydning |
|---|---|---|
| 400 | invalid_json | Brødteksten er ikke gyldig JSON. |
| 422 | invalid_request | JSON er gyldig, men indholdet er ikke. Detaljerne udpeger det fejlbehæftede felt. |
| 401 | missing_credentials | Authorization-header mangler eller er misdannet. |
| 401 | invalid_key | Ukendt nøgle. |
| 401 | key_revoked | Tilbagekaldt nøgle. |
| 403 | account_suspended | Kontoen bag nøglen er suspenderet. |
| 415 | unsupported_media_type | Indholdstypen er ikke JSON. |
| 413 | payload_too_large | Anmodningens brødtekst er for stor. |
| 429 | rate_limit_exceeded | Daglig kvote nået. Se Retry-After-headeren. |
| 500 | internal_error | En fejl hos os. Prøv igen, og meld den til os med anmodnings-id'et. |
Data og opbevaring
Sager sendt via API'et er dine kunders data: vi gemmer så lidt som muligt, og du har en kontakt til slet ikke at gemme noget.
- Send „store“ som false, og intet sagsindhold skrives: kun scoren og afvigelseskoderne bevares.
- Ellers slettes sagsindholdet efter 30 dage.
- At tilbagekalde en nøgle sletter straks indholdet af de sager, den har indsendt.
- Behandlingen sker i Frankfurt, og databasen er hostet i Den Europæiske Union.
- Ingen fil uploades via API'et: du oplyser kun, hvilke dokumenter du har.
200 items · 256 KB · 25 / batch · reference ≤ 64
Hvad dette API ikke er
Kontrollen hjælper med forberedelsen. Den udgør ikke en godkendelse fra toldmyndighederne, den indsender intet, og den erstatter ikke de regler, der gælder for din transaktion.
Toldkoder kontrolleres for format, for om de findes i nomenklaturen og, ved import til EU, mod TARIC-foranstaltningerne for deres oprindelse, aldrig for tariferingen af varen: en eksisterende kode er stadig en kode, der skal verificeres. TARIC-foranstaltningerne er vejledende (månedligt udtræk fra Europa-Kommissionen): landeundtagelser, opbrugte kontingenter og betingede toldsatser vurderes ikke.