Hoppa till innehållet
Customs Check
RegistreraSkapa konto

Utvecklare

API för tullkontroll

Samma kontroll som på den här webbplatsen, anropad från din egen programvara. Du skickar ett ärende som JSON och får en poäng av 100, de blockerande punkterna, varningarna och de rekommenderade åtgärderna — med stabila avvikelsekoder och meddelanden på EU:s 24 officiella språk.

Det här är ett server-till-server-API. En API-nyckel är en hemlighet. Anrop från en webbläsare stöds inte och inga CORS-huvuden skickas på autentiserade rutter: en nyckel som hamnar i en webbläsare är en läckt nyckel.

Översikt

API:et ger tillgång till validerarens kontrollmotor: fjorton övergripande regler, fem Taric-regler, fyra regler om fullständiga dokument och de validerare som hör till varje deklarationssystem. Det skickar ingenting: det kontrollerar format och samstämmighet i ditt ärende, att koderna finns i nomenklaturen och, vid import till EU, de Taric-åtgärder som gäller för ursprunget (antidumpning, kontroller, förmåner, tullsats), innan du förbereder deklarationen.

Alla rutter har sin version som prefix. Upptäcktsrutterna och specifikationen är öppna: en integratör eller en agent kan läsa schemat innan den har en nyckel.

RuttRollAutentisering
POST/v1/checksKontrollerar ett ärende och returnerar hela rapportenNyckel krävs
POST/v1/checks/batchKontrollerar upp till 25 ärenden i ett anropNyckel krävs
GET/v1/meReturnerar aktuell nyckel och dess kvot, utan att förbruka denNyckel krävs
GET/v1/declaration-typesListar de deklarationstyper som känns igenÖppen
GET/v1/declaration-types/{type}Beskriver de fält som förväntas för en typÖppen
GET/v1/openapi.jsonOpenAPI 3.1-specifikationen för detta APIÖppen

Autentisering

API:et autentiserar med en bearer-token. Token visas bara en gång, vid skapandet: endast dess avtryck sparas, så en förlorad nyckel ersätts, aldrig återskapas.

Du kan ha tre aktiva nycklar samtidigt, vilket låter dig rotera en nyckel utan att avbryta din integration: skapa den nya, rulla ut den och återkalla sedan den gamla.

  1. 01Skapa en nyckel från ditt konto, under ”API-nycklar”.
  2. 02Skicka den i Authorization-huvudet i varje begäran.
  3. 03Återkalla den vid läcka: avbrottet sker omedelbart och innehållet i de ärenden som skickats med nyckeln rensas direkt.
Authorization: Bearer cc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Första kontrollen

Ett ärende består av en typ, ett huvud och varurader. Alla värden är strängar: motorn sköter tolkningen. Fältnamnen upptäcks vid körning, typ för typ.

Svaret kommer direkt; det finns inget att fråga efter i efterhand.

Begäran
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" }
  }'

Att läsa svaret

Varje avvikelse bär både en maskinidentitet och en läsbar mening. Bygg din logik på maskinidentiteten: den ändras inte utan ett versionsbyte.

severity · code · path · rule
Stabilt kontraktStabila. Nya koder kan tillkomma; befintliga byter inte namn utan ett versionsbyte.
field · message · text
Endast visningÖversatta för visning. De kan omformuleras när som helst — jämför dem aldrig i din kod.
engine.version
Ändras så snart en regeländring flyttar poängen för ett oförändrat ärende. Arkivera den tillsammans med dina rapporter.

Fältet ”path” speglar formen på din begäran, så att du kan koppla en avvikelse direkt till motsvarande fält i ditt eget gränssnitt.

header.<fält> · items.<n>.<fält> · 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" }
}

Upptäck fälten

Deklarationstyper och deras fält är öppna, ingen nyckel behövs. Det är rutten för att bygga ett formulär, mata en mappning från ditt affärssystem eller ge en agent schemat den ska fylla i.

Namnen som returneras här är exakt de nycklar som ska användas i huvudet och i varje varurad. Alternativlistor returneras upplösta och översatta; lägg till parametern för att utelämna dem om svaret känns 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"

Satsvis behandling

Upp till 25 ärenden per anrop. Svaret är alltid en framgång så snart satsen accepterats, och varje post bär sin egen status: ett felformat ärende fäller aldrig de andra.

Om den återstående kvoten inte täcker alla giltiga poster avvisas hela satsen i stället för att behandlas delvis — du behöver aldrig gissa var behandlingen stannade.

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 och verktyg

Förutom REST-vägarna kan samma motor och samma data nås från en AI-assistent, via en Model Context Protocol-server (MCP), och från en API-klient, via en färdig Postman-samling. Båda använder API-nyckeln och den dagliga kvoten som beskrivs ovan.

MCP-server

MCP-servern låter en assistent slå upp tullkoder, läsa EU:s importtull för en kod, kontrollera ett EORI-, moms- eller AEO-nummer i de officiella registren och kontrollera ett deklarationsutkast, utan att du skriver en enda rad bindningskod. Den svarar på POST /api/mcp, med JSON-svar.

Den är tillståndslös och talar båda generationerna av protokollet: revisionen 2026-07-28, där varje förfrågan bär sin version, och de tidigare revisionerna, som inleds med ett initialize-anrop. Anslutning, upptäckt och listning av verktygen kostar ingenting; varje verktygsanrop förbrukar en enhet av nyckelns dagliga kvot.

Autentiseringen är samma bearer-token som i REST-API:et. En klient som bara stöder OAuth-inloggning, som claude.ai:s webbkopplingar, kan ännu inte ansluta: använd en klient där du kan ange 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_declarationKontrollera ett deklarationsutkast: poäng av 100, nivå och varje problem med fältet och åtgärden. Sparar inte filens innehåll om det inte begärs.
list_declaration_typesDe deklarationssystem som stöds, med myndighet, region och förväntade handlingar.
describe_declaration_typeHuvud- och varufälten för en typ, för att bygga indata till check_declaration.
search_hs_codesKandidatkoder i den kombinerade nomenklaturen utifrån en varubeskrivning, på något av EU:s 24 språk.
describe_hs_codeOm en kod på 4 till 10 siffror finns i den gällande nomenklaturen, med dess officiella sökväg och lydelse.
lookup_import_dutyEU:s importtull för en kod ur kommissionens TARIC-data: tull för tredjeland, preferenser för ett ursprung, kvoter, antidumpning och kontroller.
search_chemicalEtt kemiskt ämne efter CAS-nummer, CUS-nummer eller namn i kommissionens ECICS-förteckning: den kod i kombinerade nomenklaturen som anges för varje post, att kontrollera.
get_quota_balanceÅterstående saldo för en EU-tullkvot i kommissionens QUOTA-databas, utifrån löpnumret eller en kod och ett ursprung: saldo, tillstånd (öppen, kritisk, blockerad, förbrukad), period och tidpunkt för avläsningen.
validate_eoriFormatet på ett EORI-nummer och dess status i det officiella registret (Europeiska kommissionen, HMRC).
validate_vatFormatet på ett EU-momsnummer och dess giltighet i VIES, med det registrerade namnet där det publiceras.
check_rexFormatet på ett REX-nummer för en registrerad exportör och dess status i kommissionens REX-databas (giltigt, återkallat eller okänt), med datum.
screen_sanctionsEtt företag, en person eller ett fartyg mot sanktionslistorna från EU, FN, Storbritannien och USA, uppdaterade varje dag: varje träff med sin poäng, stark eller partiell.
search_aeoSök i kommissionens databas över godkända ekonomiska operatörer på företagsnamn.
  • Tullkoder är förslag hämtade ur nomenklaturens lydelse. Bara deklaranten, eller ett bindande klassificeringsbesked från tullen, kan bekräfta en klassificering.
  • Tullsatser är vägledande: villkor, landsundantag och förbrukade kvoter utvärderas inte. Varje svar bär referensdatumet för TARIC-utdraget, som uppdateras varje månad.
  • Ett register som inte svarar rapporteras som otillgängligt, aldrig som ett ogiltigt nummer. Ingenting skickas någonsin till tullen.

Postman-samling

Samlingen genereras ur OpenAPI-specifikationen och stämmer därför alltid överens med den: en förfrågan per väg, grupperade efter tagg, med ett body-skelett för varje POST. Importera den i Postman, fyll i variabeln apiKey (sparad som hemlighet) så är förfrågningarna redo att skickas.

Ladda ned samlingen

Kvot

Varje nyckel har 500 kontroller per UTC-kalenderdag. Aktuell status följer med varje autentiserat svar, så du behöver aldrig ett extra anrop för att läsa den.

Avvisade anrop räknas också: en klient som loopar på ogiltiga begäranden strypar sig själv. Kvoten sätts per nyckel — skriv till oss om du behöver mer.

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

Fel

Felmeddelanden finns bara på engelska: de är protokollmeddelanden riktade till utvecklare. Endast sakinnehållet översätts.

Varje svar bär ett begärans-id som upprepas i kroppen. Ange det när du kontaktar oss — det leder oss rakt till anropet.

{
  "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"
  }
}
StatuscodeBetydelse
400invalid_jsonKroppen är inte giltig JSON.
422invalid_requestJSON är giltig men innehållet är det inte. Detaljerna pekar ut det felaktiga fältet.
401missing_credentialsAuthorization-huvudet saknas eller är felformat.
401invalid_keyOkänd nyckel.
401key_revokedÅterkallad nyckel.
403account_suspendedKontot som äger nyckeln är avstängt.
415unsupported_media_typeInnehållstypen är inte JSON.
413payload_too_largeBegärans kropp är för stor.
429rate_limit_exceededDagskvoten är nådd. Se Retry-After-huvudet.
500internal_errorEtt fel hos oss. Försök igen och rapportera det med begärans-id:t.

Data och lagring

Ärenden som skickas via API:et är dina kunders data: vi sparar så lite som möjligt, och du har en strömbrytare för att inte spara något alls.

  • Skicka ”store” som false så skrivs inget ärendeinnehåll alls: bara poängen och avvikelsekoderna bevaras.
  • Annars rensas ärendeinnehållet efter 30 dagar.
  • Att återkalla en nyckel rensar omedelbart innehållet i de ärenden den skickat in.
  • Behandlingen sker i Frankfurt och databasen ligger i Europeiska unionen.
  • Ingen fil laddas upp via API:et: du anger bara vilka handlingar du har.

200 items · 256 KB · 25 / batch · reference ≤ 64

Vad detta API inte är

Kontrollen hjälper dig att förbereda. Den utgör ingen validering från tullmyndigheten, den lämnar inte in något och den ersätter inte de regelkrav som gäller för din transaktion.

Tullkoder kontrolleras för format, för att de finns i nomenklaturen och, vid import till EU, mot Taric-åtgärderna för deras ursprung, aldrig för klassificeringen av varan: en befintlig kod är fortfarande en kod att verifiera. Taric-åtgärderna är vägledande (månatligt uttag från Europeiska kommissionen): landundantag, uttömda kvoter och villkorade tullar bedöms inte.