# EUDR API Integration - Documentação Técnica > **Versão**: 1.4 > **Data**: Fevereiro 2026 > **Baseado em**: EUDR API EO Specifications v1.4 (22 Julho 2025) ## 📋 Índice 1. [Visão Geral](#visão-geral) 2. [Ambientes](#ambientes) 3. [Autenticação](#autenticação) 4. [Serviços da API](#serviços-da-api) 5. [Conformance Tests](#conformance-tests) 6. [Estrutura XML/SOAP](#estrutura-xmlsoap) 7. [GeoJSON para Geolocalização](#geojson-para-geolocalização) 8. [Unidades de Medida](#unidades-de-medida) 9. [Regras de Validação](#regras-de-validação) 10. [Códigos de Erro](#códigos-de-erro) 11. [Fluxo de Integração DuOrigin](#fluxo-de-integração-duorigin) --- ## Visão Geral A API EUDR permite a submissão e gestão de DDS (Due Diligence Statements) de forma automatizada via **SOAP/WSDL** (machine-to-machine). O DuOrigin atua como intermediário entre o operador e a API oficial da UE. ### Arquitetura ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Operador │────▶│ DuOrigin │────▶│ EUDR API │ │ (Frontend) │ │ (Backend) │ │ (EU Server) │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ Formulário SOAP Client SOAP/WSDL Web UI NestJS XML Messages ``` ### Serviços Disponíveis | Serviço | Descrição | Versões | |---------|-----------|---------| | `Echo` | Teste de conexão/autenticação | V1 | | `submitDDS` | Submissão de nova DDS | V1, V2 | | `amendDDS` | Alteração de DDS existente | V1, V2 | | `retractDds` | Cancelar/Retirar DDS | V1, V2 | | `getDDSInfo` | Obter status e referência de DDS | V1, V2 | | `getStatementByIdentifiers` | Obter dados completos de DDS | V1, V2 | | `getReferencedDds` | Obter DDS referenciadas na cadeia | V2 | --- ## Ambientes ### Production (Produção) - **URL Base**: `https://webgate.ec.europa.eu/tracesnt/` - **Uso**: DDS com valor legal - **Requisito**: Passar todos os Conformance Tests (CF1-CF7) ### Acceptance Cloud (Testes) - **URL Base**: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/` - **Uso**: Testes funcionais e Conformance Tests - **WebServiceClientId de Teste**: `eudr-test` ### URLs dos WSDLs **ACCEPTANCE (Testes):** - Submission WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV1.wsdl` - Submission V2: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV2.wsdl` - Retrieval WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV1.wsdl` - Retrieval V2: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV2.wsdl` - Echo WS: `https://acceptance.eudr.webcloud.ec.europa.eu/tracesnt/services/EudrEchoService.wsdl` **PRODUCTION (Produção):** - Submission WS: `https://webgate.ec.europa.eu/tracesnt/services/EudrSubmissionServiceV1.wsdl` - Retrieval WS: `https://webgate.ec.europa.eu/tracesnt/services/EudrRetrievalServiceV1.wsdl` - (Echo não disponível em produção) --- ## Autenticação A API utiliza **WS-Security UsernameToken com Digest** (HTTPS obrigatório). ### Estrutura do Header de Segurança ```xml 2026-02-09T12:00:00.000Z 2026-02-09T12:05:00.000Z EU_LOGIN_USERNAME BASE64_DIGEST BASE64_NONCE 2026-02-09T12:00:00.000Z ``` ### Cálculo do Password Digest ``` Password = Base64( SHA-1( Nonce + Created + AuthenticationKey ) ) ``` Onde: - **Nonce**: 16 bytes aleatórios em Base64 - **Created**: Timestamp ISO 8601 - **AuthenticationKey**: Chave obtida no TRACES NT ### Campos Obrigatórios no SOAP Envelope ```xml eudr-test ``` --- ## Serviços da API ### 1. Echo Test (CF1) Teste de conexão - disponível apenas em ambientes de teste. **Endpoint**: `{EUDR_URL}/services/EudrEchoService#testEcho` **Request:** ```xml Test message ``` **Response:** ```xml Test message ``` ### 2. Submit DDS (CF2) Submissão de nova Declaração de Due Diligence. **Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#submitDDS` **Request (V2):** ```xml eudr-test IMPORT false REF-2026-001 Empresa Exemplo Ltda Rua Principal, 100 01000-000 São Paulo BR BR12345678901234 1201 Soybeans for export 50000 5 BR Fazenda Exemplo {"type":"FeatureCollection","features":[...]} ``` **Response:** ```xml 550e8400-e29b-41d4-a716-446655440000 ``` ### 3. Get DDS Info (CF3) Obter status e número de referência. **Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getDdsInfo` **Request por UUID:** ```xml eudr-test 550e8400-e29b-41d4-a716-446655440000 ``` **Response:** ```xml 550e8400-e29b-41d4-a716-446655440000 AVAILABLE EUDR-2026-0001234 VN123456789 REF-2026-001 ... ... ``` ### 4. Amend DDS (CF5) Alterar DDS em status AVAILABLE. **Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#amendDDS` **Nota**: A mensagem é semelhante a submitDDS, mas inclui o UUID da DDS a ser alterada. ### 5. Retract DDS (CF6) Cancelar/Retirar DDS. **Endpoint**: `{EUDR_URL}/services/EudrSubmissionServiceV2#retractDds` **Request:** ```xml eudr-test 550e8400-e29b-41d4-a716-446655440000 ``` ### 6. Get Statement By Identifiers (CF7) Obter dados completos de uma DDS usando Reference + Verification Number. **Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getStatementByIdentifiers` ### 7. Get Referenced DDS (CF7) Obter DDS referenciadas na cadeia de suprimentos (V2 only). **Endpoint**: `{EUDR_URL}/services/EudrRetrievalServiceV2#getReferencedDds` --- ## Conformance Tests Sequência obrigatória para acesso à produção: | CF | Nome | Descrição | Obrigatório | |----|------|-----------|-------------| | CF1 | Echo Test | Conexão e autenticação | ✅ | | CF2 | Submit DDS | Submissão de DDS | ✅ | | CF3 | Get DDS Info | Obter referência/status | ✅ | | CF4 | Error Handling | Gestão de erros | ✅ | | CF5 | Amend DDS | Alteração de DDS | Opcional | | CF6 | Retract DDS | Retirada de DDS | Opcional | | CF7 | Get DDS Data | Obter dados completos | Opcional | ### Fluxo de Certificação 1. Registrar operador no TRACES NT (Acceptance) 2. Obter credenciais de Web Service 3. Executar CF1 (Echo) - validar autenticação 4. Executar CF2 (Submit) - submeter DDS de teste 5. Executar CF3 (Get Info) - obter referência 6. Executar CF4 - testar cenários de erro 7. Solicitar acesso à produção via email para SANTE-TRACES@ec.europa.eu --- ## Estrutura XML/SOAP ### Envelope SOAP Completo ```xml ``` ### Namespaces | Prefixo | URI | |---------|-----| | soap | http://schemas.xmlsoap.org/soap/envelope/ | | wsse | http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd | | wsu | http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd | | v21 | http://ec.europa.eu/tracesnt/eudr/v2.1 | | v4 | http://ec.europa.eu/tracesnt/commons/v4 | --- ## GeoJSON para Geolocalização A geolocalização é enviada como string JSON dentro do campo `GeoLocation`. ### Estrutura GeoJSON para EUDR ```json { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-47.123456, -23.456789] }, "properties": { "plotId": "PLOT-001", "area": 3.5, "harvestDate": "2025-06-15" } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[ [-47.100, -23.400], [-47.100, -23.500], [-47.200, -23.500], [-47.200, -23.400], [-47.100, -23.400] ]] }, "properties": { "plotId": "PLOT-002" } } ] } ``` ### Regras de Geolocalização - **Latitude**: -90 a +90 - **Longitude**: -180 a +180 - **Precisão máxima**: 6 casas decimais (sistema arredonda automaticamente) - **Área máxima para Point (não-gado)**: 4 hectares - **Área mínima**: 0.1 hectare (0.0001 km²) - **Polígonos**: Mínimo 4 pontos, não podem ter auto-interseção - **Tamanho máximo por DDS**: 25 MB --- ## Unidades de Medida ### Para Import/Export | HS Code | Tipo | Descrição | |---------|------|-----------| | 010221, 010229 | NAR (p/st) | Número de itens | | 4011, 4013 | NAR (p/st) | Número de itens | | 4403, 4406, 4408, 4410-4413 | MTQ (m³) | Metro cúbico | | 4701, 4702, 4704, 4705 | KSD (kg 90% sdt) | Kg substância 90% seca | **Campos obrigatórios Import/Export:** - Net Mass (Kg): Sempre obrigatório - Supplementary Unit: Obrigatório se HS Code estiver na lista acima ### Para Domestic/Trade Combinações válidas: 1. Net Mass + Percentage estimate (0-25%) 2. Supplementary unit type + quantity 3. Ambos **Tipos de Supplementary Unit:** | Código | Display | Descrição | |--------|---------|-----------| | KSD | KSD (kg 90% sdt) | Kg substância 90% seca | | MTK | MTK (m²) | Metro quadrado | | MTQ | MTQ (m³) | Metro cúbico | | MTR | MTR (m) | Metro | | NAR | NAR (p/st) | Número de itens | | NPR | NPR (pa) | Número de pares | --- ## Regras de Validação ### Operador | Regra | Descrição | |-------|-----------| | Activity Type | Obrigatório; não pode mudar em amend | | EORI | Obrigatório para IMPORT/EXPORT | | Non-EU Operator | Apenas IMPORT permitido | | Authorized Rep | Deve informar dados do operador representado | ### Commodities | Regra | Descrição | |-------|-----------| | Mínimo | Pelo menos 1 commodity por DDS | | Máximo | 100 commodities por DDS | | Description | Obrigatório para cada commodity | | Net Mass | Obrigatório para IMPORT/EXPORT | | HS Code | Deve ser válido (Annex I EUDR) | | Timber | Requer scientific name + common name | ### Geolocalização | Regra | Descrição | |-------|-----------| | Obrigatória | Se não houver Referenced DDS | | Tamanho máximo | 25 MB por DDS | | Producers por commodity | Máximo 1000 | | Producers por DDS | Máximo 10.000 | | Área para Point | Obrigatória; default 4ha; máx 4ha (não-gado) | ### DDS Referenciadas | Regra | Descrição | |-------|-----------| | Máximo | 2000 por DDS | | Status | Deve estar AVAILABLE ou ARCHIVED | | Auto-referência | DDS não pode referenciar a si mesma | --- ## Códigos de Erro ### Erros de Autenticação/Schema | Código HTTP | Descrição | |-------------|-----------| | 401 | Credenciais inválidas | | 403 | Sem permissão | | 500 | Erro de schema XML | ### Erros de Negócio | Código | Descrição | |--------|-----------| | EUDR_WEBSERVICE_USER_NOT_EUDR_OPERATOR | Usuário não registrado como operador EUDR | | EUDR_WEBSERVICE_USER_FROM_MANY_OPERATOR | Usuário pertence a mais de um operador | | EUDR_WEBSERVICE_USER_ACTIVITY_NOT_ALLOWED | Atividade não permitida para o perfil | | EUDR_OPERATOR_EORI_FOR_ACTIVITY_MISSING | EORI obrigatório para IMPORT/EXPORT | | EUDR_BEHALF_OPERATOR_NOT_PROVIDED | Operador representado não informado | | EUDR_BEHALF_OPERATOR_CITY_POSTALCODE_EMPTY_OR_INVALID | Cidade/CEP inválidos | | EUDR_ACTIVITY_TYPE_NOT_COMPATIBLE | Atividade incompatível com perfil | | EUDR_COMMODITIES_HS_CODE_INVALID | HS Code inválido | | EUDR_COMMODITIES_DESCRIPTOR_NET_MASS_EMPTY | Net Mass obrigatório | | EUDR_COMMODITIES_DESCRIPTOR_QUANTITY_MISSING | Quantidade obrigatória | | EUDR_COMMODITITY_PRODUCER_COUNTRY_CODE_INVALID | Código de país inválido | | EUDR_COMMODITIES_PRODUCER_GEO_EMPTY | Geolocalização obrigatória | | EUDR_COMMODITIES_PRODUCER_GEO_INVALID | GeoJSON inválido | | EUDR_COMMODITIES_PRODUCER_GEO_LATITUDE_INVALID | Latitude fora do range | | EUDR_COMMODITIES_PRODUCER_GEO_LONGITUDE_INVALID | Longitude fora do range | | EUDR_COMMODITIES_PRODUCER_GEO_INVALID_GEOMETRY | Geometria inválida | | EUDR_COMMODITIES_PRODUCER_GEO_AREA_INVALID | Área inválida (0.1-4 ha) | | EUDR_MAXIMUM_GEO_SIZE_REACHED | Tamanho máximo excedido (25MB) | | EUDR_REFERENCED_STATEMENT_NOT_FOUND | DDS referenciada não encontrada | | EUDR_MAXIMUM_REFERENCED_DDS_REACHED | Máximo de DDS referenciadas excedido | | EUDR_API_AMEND_ACTIVITY_TYPE_CHANGE_NOT_ALLOWED | Não pode mudar activity type | | EUDR_API_AMEND_OR_WITHDRAW_DDS_NOT_POSSIBLE | DDS referenciada ou prazo expirado | | EUDR_API_AMEND_NOT_ALLOWED_FOR_STATUS | Status não permite alteração | | EUDR_API_NO_DDS | DDS não encontrada | --- ## Fluxo de Integração DuOrigin ### 1. Cadastro de Operador ``` Operador → DuOrigin UI → Salvar empresa com EORI, endereço, etc. ``` ### 2. Submissão de DDS ``` 1. Operador preenche formulário DDS no DuOrigin 2. Sistema valida dados localmente 3. DuOrigin chama eudr-api.service.submitDDS() 4. Recebe UUID e armazena no banco 5. Polling getDDSInfo() para obter Reference Number 6. Atualiza status no DuOrigin ``` ### 3. Acompanhamento ``` 1. DuOrigin faz polling periódico de getDDSInfo() 2. Atualiza status (SUBMITTED → AVAILABLE/REJECTED) 3. Notifica operador se houver CA message ``` ### 4. Alterações ``` 1. Operador solicita alteração 2. DuOrigin valida prazo e referências 3. Chama amendDDS() com dados completos 4. Atualiza registro local ``` ### 5. Retirada ``` 1. Operador solicita cancelamento/retirada 2. DuOrigin valida status e referências 3. Chama retractDds() com UUID 4. Atualiza status para WITHDRAWN/CANCELLED ``` --- ## Contatos - **Suporte Técnico**: SANTE-TRACES@ec.europa.eu (título deve começar com "EUDR API") - **Política**: ENV-DEFORESTATION@ec.europa.eu - **Website**: https://environment.ec.europa.eu/topics/forests/deforestation/regulation-implementation_en --- *Documentação gerada para DuOrigin v2 - Fevereiro 2026*