Programadores
API de verificação aduaneira
A mesma verificação deste site, invocada a partir do seu software. Envia um processo em JSON e recebe uma pontuação sobre 100, os pontos bloqueantes, os alertas e as ações recomendadas — com códigos de anomalia estáveis e mensagens traduzidas nas 24 línguas oficiais da União Europeia.
Esta é uma API servidor-a-servidor. Uma chave de API é um segredo. As chamadas a partir de um navegador não são suportadas e não é enviado qualquer cabeçalho CORS nas rotas autenticadas: uma chave que chega a um navegador é uma chave divulgada.
Panorâmica
A API expõe o motor de controlo do validador: catorze regras transversais, cinco regras TARIC, quatro regras de completude documental e os validadores próprios de cada sistema declarativo. Não transmite nada: verifica o formato e a coerência do seu processo, a existência dos códigos na nomenclatura e, para uma importação na UE, as medidas TARIC aplicáveis à origem (antidumping, controlos, preferências, taxa de direito), antes de preparar a declaração.
Todas as rotas têm o prefixo da sua versão. As rotas de descoberta e a especificação são públicas: um integrador, ou um agente, pode ler o esquema antes sequer de ter uma chave.
| Rota | Função | Autenticação |
|---|---|---|
| POST/v1/checks | Verifica um processo e devolve o relatório completo | Chave necessária |
| POST/v1/checks/batch | Verifica até 25 processos numa chamada | Chave necessária |
| GET/v1/me | Devolve a chave atual e a sua quota, sem a consumir | Chave necessária |
| GET/v1/declaration-types | Lista os tipos de declaração reconhecidos | Pública |
| GET/v1/declaration-types/{type} | Descreve os campos esperados para um tipo | Pública |
| GET/v1/openapi.json | A especificação OpenAPI 3.1 desta API | Pública |
Autenticação
A API autentica-se com um token portador. O token é mostrado uma única vez, na criação: apenas a sua impressão é guardada, pelo que uma chave perdida substitui-se, nunca se recupera.
Pode manter três chaves ativas em simultâneo, o que permite rodar uma chave sem interromper a sua integração: crie a nova, coloque-a em produção e revogue a antiga.
- 01Crie uma chave a partir da sua conta, em «Chaves de API».
- 02Envie-a no cabeçalho Authorization de cada pedido.
- 03Revogue-a se houver fuga: o corte é imediato e o conteúdo dos processos submetidos com essa chave é purgado de imediato.
Authorization: Bearer cc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPrimeira verificação
Um processo é composto por um tipo, um cabeçalho e linhas de mercadorias. Todos os valores são cadeias de texto: o motor encarrega-se de as interpretar. Os nomes dos campos descobrem-se em tempo de execução, tipo a tipo.
A resposta chega de imediato; depois não há nada a consultar.
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" }
}'Ler a resposta
Cada anomalia traz ao mesmo tempo uma identidade de máquina e uma frase legível. Construa a sua lógica sobre a identidade de máquina: não muda sem uma mudança de versão.
- severity · code · path · rule
- Contrato estávelEstáveis. Podem surgir novos códigos; os existentes não são renomeados sem uma mudança de versão.
- field · message · text
- Apenas visualizaçãoTraduzidos para exibição. Podem ser reformulados a qualquer momento: nunca os compare no seu código.
- engine.version
- Muda assim que uma evolução das regras altera a pontuação de um processo inalterado. Arquive-a com os seus relatórios.
O campo «path» reflete a forma do seu pedido, pelo que pode ligar uma anomalia diretamente ao campo correspondente na sua própria interface.
header.<campo> · items.<n>.<campo> · 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" }
}Descobrir os campos
Os tipos de declaração e os seus campos são públicos, não é necessária chave. É a rota a usar para construir um formulário, alimentar um mapeamento a partir do seu ERP, ou dar a um agente o esquema que tem de preencher.
Os nomes devolvidos aqui são exatamente as chaves a usar no cabeçalho e em cada linha de mercadoria. As listas de opções chegam resolvidas e traduzidas; acrescente o parâmetro para as omitir se a resposta lhe parecer pesada.
# 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"Processamento em lote
Até 25 processos por chamada. A resposta é sempre um sucesso assim que o lote é aceite, e cada entrada traz o seu próprio estado: um processo mal formado nunca faz falhar os restantes.
Se a quota restante não cobrir todas as entradas válidas, o lote inteiro é recusado em vez de processado parcialmente — nunca terá de adivinhar onde o processamento parou.
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": [] } ] }'Agentes e ferramentas
Além das rotas REST, o mesmo motor e os mesmos dados são acessíveis a partir de um assistente de IA, através de um servidor Model Context Protocol (MCP), e de um cliente de API, através de uma coleção Postman pronta. Ambos usam a chave de API e a quota diária descritas acima.
Servidor MCP
O servidor MCP permite a um assistente pesquisar códigos aduaneiros, ler o direito de importação da UE de um código, verificar um número EORI, de IVA ou AEO nos registos oficiais e verificar um rascunho de declaração, sem que escreva uma única linha de código de ligação. Responde em POST /api/mcp, com respostas JSON.
É sem estado e fala as duas gerações do protocolo: a revisão 2026-07-28, em que cada pedido transporta a sua versão, e as revisões anteriores, que se abrem com uma chamada initialize. A ligação, a descoberta e a listagem das ferramentas não custam nada; cada chamada de uma ferramenta consome uma unidade da quota diária da chave.
A autenticação é o mesmo token bearer da API REST. Um cliente que só suporta o início de sessão OAuth, como os conectores web do claude.ai, ainda não consegue ligar-se: use um cliente que permita definir um cabeçalho.
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 | Verifica um rascunho de declaração: pontuação em 100, nível e cada problema com o campo e a ação. Não conserva o conteúdo do ficheiro, salvo se pedido. |
| list_declaration_types | Os sistemas de declaração suportados, com autoridade, região e documentos esperados. |
| describe_declaration_type | Os campos de cabeçalho e de artigo de um tipo, para construir a entrada de check_declaration. |
| search_hs_codes | Códigos candidatos da Nomenclatura Combinada a partir da descrição de um produto, em qualquer das 24 línguas da UE. |
| describe_hs_code | Se um código de 4 a 10 dígitos existe na nomenclatura em vigor, com o seu caminho e texto oficiais. |
| lookup_import_duty | Direito de importação da UE de um código a partir dos dados TARIC da Comissão: direito de países terceiros, preferências para uma origem, contingentes, antidumping e controlos. |
| search_chemical | Uma substância química por número CAS, número CUS ou nome no inventário ECICS da Comissão: o código da nomenclatura combinada dado para cada entrada, a verificar. |
| get_quota_balance | Saldo restante de um contingente pautal da UE na base QUOTA da Comissão, a partir do seu número de ordem ou de um código e de uma origem: saldo, estado (aberto, crítico, bloqueado, esgotado), período e hora da leitura. |
| validate_eori | Formato de um número EORI e o seu estado no registo oficial (Comissão Europeia, HMRC). |
| validate_vat | Formato de um número de IVA da UE e a sua validade no VIES, com o nome registado quando publicado. |
| check_rex | Formato de um número REX de exportador registado e a sua situação na base de dados REX da Comissão (válido, revogado ou desconhecido), com as respetivas datas. |
| screen_sanctions | Uma empresa, pessoa ou navio face às listas de sanções da UE, da ONU, do Reino Unido e dos Estados Unidos, atualizadas todos os dias: cada correspondência com a sua pontuação, forte ou parcial. |
| search_aeo | Pesquisa na base de dados da Comissão de Operadores Económicos Autorizados pelo nome da empresa. |
- Os códigos aduaneiros são propostas retiradas do texto da nomenclatura. Só o declarante, ou uma informação pautal vinculativa da alfândega, pode confirmar uma classificação.
- Os direitos são indicativos: condições, exclusões por país e contingentes esgotados não são avaliados. Cada resposta traz a data de referência do extrato TARIC, atualizado todos os meses.
- Um registo que não responde é comunicado como indisponível, nunca como número inválido. Nunca é enviado nada à alfândega.
Coleção Postman
A coleção é gerada a partir da especificação OpenAPI, pelo que coincide sempre com ela: um pedido por rota, agrupados por etiqueta, com um esqueleto de corpo para cada POST. Importe-a no Postman, preencha a variável apiKey (guardada como segredo) e os pedidos ficam prontos a enviar.
Transferir a coleçãoQuota
Cada chave dispõe de 500 verificações por dia de calendário UTC. O estado atual viaja com cada resposta autenticada, pelo que nunca precisa de uma chamada adicional para o conhecer.
As chamadas recusadas também contam: um cliente que insiste com pedidos inválidos limita-se a si próprio. A quota é definida por chave — escreva-nos se precisar de mais.
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 437
X-RateLimit-Reset: 1789603200
X-RateLimit-Policy: 500;w=86400Erros
As mensagens de erro estão apenas em inglês: são mensagens de protocolo, destinadas a programadores. Só o conteúdo de negócio é traduzido.
Cada resposta traz um identificador de pedido, repetido no corpo. Cite-o quando nos contactar — leva-nos diretamente à chamada.
{
"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"
}
}| Estado | code | Significado |
|---|---|---|
| 400 | invalid_json | O corpo não é JSON válido. |
| 422 | invalid_request | O JSON é válido mas o seu conteúdo não. O detalhe indica o campo em falta. |
| 401 | missing_credentials | Cabeçalho Authorization ausente ou mal formado. |
| 401 | invalid_key | Chave desconhecida. |
| 401 | key_revoked | Chave revogada. |
| 403 | account_suspended | A conta proprietária da chave está suspensa. |
| 415 | unsupported_media_type | O tipo de conteúdo não é JSON. |
| 413 | payload_too_large | Corpo do pedido demasiado grande. |
| 429 | rate_limit_exceeded | Quota diária atingida. Consulte o cabeçalho Retry-After. |
| 500 | internal_error | Erro do nosso lado. Tente de novo e comunique-nos com o identificador de pedido. |
Dados e conservação
Os processos enviados pela API são dados dos seus clientes: guardamos o mínimo possível e tem um interruptor para não guardar nada.
- Envie «store» como false e nenhum conteúdo do processo será escrito: apenas a pontuação e os códigos de anomalia são conservados.
- Caso contrário, o conteúdo dos processos é purgado ao fim de 30 dias.
- Revogar uma chave purga de imediato o conteúdo dos processos que submeteu.
- O tratamento decorre em Frankfurt e a base de dados está alojada na União Europeia.
- Nenhum ficheiro é carregado pela API: apenas declara que documentos possui.
200 items · 256 KB · 25 / batch · reference ≤ 64
O que esta API não é
A verificação é uma ajuda à preparação. Não constitui uma validação pela administração aduaneira, não submete nada e não substitui as obrigações regulamentares aplicáveis à sua operação.
Os códigos aduaneiros são verificados quanto ao formato, à existência na nomenclatura e, nas importações na UE, face às medidas TARIC da sua origem, nunca quanto à classificação da mercadoria: um código existente continua a ser um código a verificar. As medidas TARIC são indicativas (extração mensal da Comissão Europeia): exclusões de países, contingentes esgotados e direitos condicionais não são avaliados.