Gå til indhold
Customs Check
TilmeldOpret konto

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.

RuteRolleGodkendelse
POST/v1/checksKontrollerer en sag og returnerer den fulde rapportNøgle påkrævet
POST/v1/checks/batchKontrollerer op til 25 sager i ét kaldNøgle påkrævet
GET/v1/meReturnerer den aktuelle nøgle og dens kvote uden at bruge af denNøgle påkrævet
GET/v1/declaration-typesViser de angivelsestyper, der genkendesOffentlig
GET/v1/declaration-types/{type}Beskriver de felter, der forventes for en typeOffentlig
GET/v1/openapi.jsonOpenAPI 3.1-specifikationen for dette APIOffentlig

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.

  1. 01Opret en nøgle fra din konto under „API-nøgler“.
  2. 02Send den i Authorization-headeren i hver anmodning.
  3. 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Fø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.

Anmodning
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

Svar
{
  "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_declarationKontrollé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_typesDe understøttede angivelsessystemer med myndighed, region og forventede dokumenter.
describe_declaration_typeHeader- og varefelterne for en type, så du kan opbygge input til check_declaration.
search_hs_codesKandidater i den kombinerede nomenklatur ud fra en varebeskrivelse på et af EU's 24 sprog.
describe_hs_codeOm en kode på 4 til 10 cifre findes i den gældende nomenklatur, med dens officielle sti og ordlyd.
lookup_import_dutyEU-importtold for en kode ud fra Kommissionens TARIC-data: told for tredjelande, præferencer for en oprindelse, kvoter, antidumping og kontroller.
search_chemicalEt 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_balanceResterende 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_eoriFormatet på et EORI-nummer og dets status i det officielle register (Europa-Kommissionen, HMRC).
validate_vatFormatet på et EU-momsnummer og dets gyldighed i VIES, med det registrerede navn, hvor det er offentliggjort.
check_rexFormatet på et REX-nummer for en registreret eksportør og dets status i Kommissionens REX-database (gyldigt, tilbagekaldt eller ukendt), med datoer.
screen_sanctionsEn 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_aeoSø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 samlingen

Kvote

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.

Svar
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 437
X-RateLimit-Reset: 1789603200
X-RateLimit-Policy: 500;w=86400

Fejl

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"
  }
}
StatuscodeBetydning
400invalid_jsonBrødteksten er ikke gyldig JSON.
422invalid_requestJSON er gyldig, men indholdet er ikke. Detaljerne udpeger det fejlbehæftede felt.
401missing_credentialsAuthorization-header mangler eller er misdannet.
401invalid_keyUkendt nøgle.
401key_revokedTilbagekaldt nøgle.
403account_suspendedKontoen bag nøglen er suspenderet.
415unsupported_media_typeIndholdstypen er ikke JSON.
413payload_too_largeAnmodningens brødtekst er for stor.
429rate_limit_exceededDaglig kvote nået. Se Retry-After-headeren.
500internal_errorEn 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.