### Visão Geral da API de Faturação Eletrónica Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/index Apresenta a introdução, o propósito e a arquitetura geral da API de Faturação Eletrónica. ```APIDOC ## Introdução A API de Faturação Eletrónica define o conjunto de interfaces, regras e padrões técnicos necessários para a comunicação automática de documentos fiscais entre os softwares de faturação certificados e a Administração Tributária. O objetivo é garantir a integridade, autenticidade e rastreabilidade dos documentos através de mecanismos como assinatura digital JWS e controle de séries. A arquitetura é suportada por um modelo de processamento assíncrono, permitindo validações baseadas em filas de processamento, com consulta posterior (polling) ou envio de notificações callback (Disponível nas próximas versões). Este documento descreve a visão geral da API, o fluxo de integração ponta a ponta, o modelo de comunicação e os principais conceitos técnicos necessários para implementação correta da solução. ## Propósito da API A API de Faturação Eletrónica tem como objetivo permitir que softwares de faturação comuniquem em tempo real (ou quase real) todos os documentos fiscais à Administração Tributária, garantindo: * Integridade e autenticidade por meio de assinatura digital JWS. * Validação automática e retorno do estado do documento (válido ou inválido). * Sincronização entre os sistemas internos do contribuinte e a base fiscal. * Auditoria e rastreabilidade completa (com requestID, timestamps e histórico de processamento). ## Arquitectura Geral da API A arquitetura da solução é baseada no modelo de comunicação assíncrona: **Processamento Assíncrono** * O contribuinte envia o documento JSON. * A API devolve requestID imediatamente, confirmando apenas receção. * O documento entra na fila de processamento. * O contribuinte deve consultar (polling) ou aguardar callback. Este modelo suporta: * volumes grandes * redução de latência no front-end * isolamento de falhas **Mecanismos disponíveis:** Mecanismo | Como funciona ---|--- Polling | Cliente consulta a decisão final. Callback (se ativado) | A API faz POST para o endpoint do contribuinte quando o documento for validado. (Disponível nas próximas versões) ``` -------------------------------- ### POST /sigt/fe/v1/obterEstado Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/consultar Obtains the validation status of invoices previously transmitted. This service is intended to get the validation status of invoices previously transmitted through the registarFactura service, returning a success or failure indicator for obtaining the information, as well as the status of each invoice included in the request. ```APIDOC ## POST /sigt/fe/v1/obterEstado ### Description Obtains the validation status of invoices previously transmitted. This service is intended to get the validation status of invoices previously transmitted through the registarFactura service, returning a success or failure indicator for obtaining the information, as well as the status of each invoice included in the request. ### Method POST ### Endpoint https://sifphml.minfin.gov.ao/sigt/fe/v1/obterEstado ### Parameters #### Request Body - **schemaVersion** (string) - Required - Version of the service schema, example "1.0". - **submissionUUID** (string) - Required - Unique identifier for the submission. - **taxRegistrationNumber** (string) - Required - Taxpayer registration number. (maxlength: 15) - **submissionTimeStamp** (string) - Required - Submission timestamp in ISO 8601 format, examples: "2025-05-27T14:30:00Z" (UTC) or "2025-05-27T14:30:00-03:00" (with timezone information). - **softwareInfo** (object) - Required - Object with the Billing Software data. - **softwareInfoDetail** (object) - Required - Details about the software. - **productId** (string) - Required - Identifier for the software product. - **productVersion** (string) - Required - Version of the software product. - **softwareValidationNumber** (string) - Required - Software validation number. - **jwsSoftwareSignature** (string) - Required - Digital signature of the request using the issuer's private key through the RS256 algorithm (RSA + SHA-256). The fields used in the signature are: taxRegistrationNumber, requestID. (minlength: 256, maxlength: 256) - **requestID** (string) - Required - Identifier of the billing document registration request, value obtained when the registarFactura service call was successful. (maxlength: 15) ### Request Example ```json { "schemaVersion": "1.2", "submissionUUID": "a1b2c3d4-e5f6-7890-g1h2-i238j234k5122", "taxRegistrationNumber": "5001636863", "submissionTimeStamp": "2025-09-02T14:30:00Z", "softwareInfo": { "softwareInfoDetail": { "productId": "Meu ERP CERTO", "productVersion": "1.0.1", "softwareValidationNumber": "C_134" }, "jwsSoftwareSignature": "eyJ0eXAiOiJKT1NFIiwiYWxnIjoiUlMyNTYifQ.eyJwcm9kdWN0SWQiOiJNZXUgRVJQIENFUlRPIiwicHJvZHVjdFZlcnNpb24iOiIxLjAuMSIsInNvZnR3YXJlVmFsaWRhdGlvbk51bWJlciI6IkNfMTM0In0.VE3zkvOJOpqBfz4wpx4KCgcwOGgzGUP3MSMbaHCDnHhwOaeA6jlccBW9HjgQvg2tYCVVq0imrU_z0grEHNthhG4xD3afSOD1_RzvHs8Tc45dvztHJzB4gF0CAX-yIDwi7XcHiMRY0vkXOETBeHKewg0ktWSnZ7SLf4GxGzE7ry2u_pmhqhCPhxpa0oGQ_rBJUYkEAFg1OwaqjwvzCFgdT11r-XsHmnkcfJX_ktj59RWR_zgbytiCRtwCK9LNUflveS5GzUaCXbPn2deQ3F2hPldLECEa_ahwoapoK1LhkgOAVyPLJf6M1Cm09Le7rkdSaWQSW5BI_sPx5YaUaXkeqg" }, "requestID": "202500000000118" } ``` ### Response #### Success Response (200) - **requestID** (string) - Identifier of the request. - **resultCode** (string) - Code indicating the result of the operation. - **taxRegistrationNumber** (string) - Taxpayer registration number. - **documentStatusList** (array) - List of document statuses. - **requestErrorList** (array) - List of request errors. #### Response Example ```json { "requestID": "202500000000118", "resultCode": "2", "taxRegistrationNumber": "5001636863", "documentStatusList": [], "requestErrorList": [] } ``` #### Error Responses - **422** - Object errorEntry - Call resulted in an error, returning a message (code and description) for errors "E96" (call error, request still processing), "E97" (call error, premature request), "E95" (call error, NIF issuer different). - **429** - Object errorEntry - Call resulted in an error, returning a message (code and description) for error "E98" (call error, too many repeated requests). - **400** - Object errorEntry - Call resulted in an error, returning a message (code and description) for error "E96" (malformed request - structure error). ``` -------------------------------- ### Exemplo de Pedido para Obter Estado da Fatura (JSON) Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/consultar Este snippet JSON demonstra a estrutura de um pedido para consultar o estado de validação de facturas. Inclui informações sobre a versão do schema, o número fiscal, o timestamp da submissão, detalhes do software de faturação e o ID da requisição. ```json { "schemaVersion": "1.2", "submissionUUID": "a1b2c3d4-e5f6-7890-g1h2-i238j234k5122", "taxRegistrationNumber": "5001636863", "submissionTimeStamp": "2025-09-02T14:30:00Z", "softwareInfo": { "softwareInfoDetail": { "productId": "Meu ERP CERTO", "productVersion": "1.0.1", "softwareValidationNumber": "C_134" }, "jwsSoftwareSignature": "eyJ0eXAiOiJKT1NFIiwiYWxnIjoiUlMyNTYifQ.eyJwcm9kdWN0SWQiOiJNZXUgRVJQIENFUlRPIiwicHJvZHVjdFZlcnNpb24iOiIxLjAuMSIsInNvZnR3YXJlVmFsaWRhdGlvbk51bWJlciI6IkNfMTM0In0.VE3zkvOJOpqBfz4wpx4KCgcwOGgzGUP3MSMbaHCDnHhwOaeA6jlccBW9HjgQvg2tYCVVq0imrU_z0grEHNthhG4xD3afSOD1_RzvHs8Tc45dvztHJzB4gF0CAX-yIDwi7XcHiMRY0vkXOETBeHKewg0ktWSnZ7SLf4GxGzE7ry2u_pmhqhCPhxpa0oGQ_rBJUYkEAFg1OwaqjwvzCFgdT11r-XsHmnkcfJX_ktj59RWR_zgbytiCRtwCK9LNUflveS5GzUaCXbPn2deQ3F2hPldLECEa_ahwoapoK1LhkgOAVyPLJf6M1Cm09Le7rkdSaWQSW5BI_sPx5YaUaXkeqg" }, "requestID": "202500000000118" } ``` -------------------------------- ### GET /series Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/listar Retrieves a list of invoice numbering series. This endpoint returns a 'seriesListResult' object containing the found series data upon successful request. It also handles various error codes for different failure scenarios. ```APIDOC ## GET /series ### Description Retrieves a list of invoice numbering series. Returns a `seriesListResult` object with the data of the found invoice numbering series upon successful request. ### Method GET ### Endpoint /series ### Parameters #### Query Parameters (No query parameters documented) #### Request Body (No request body documented) ### Request Example (No request example provided) ### Response #### Success Response (200) - **seriesListResult** (object) - An object containing the data of the found invoice numbering series. #### Response Example ```json { "seriesListResult": [ { "series": "SERIES001", "currentNumber": 100, "nextNumber": 101 } ] } ``` #### Error Responses - **422** (Object errorEntry) - Call resulted in an error, sending a message (code and description) corresponding to error "E94" - "error in call, different NIF". - **429** (Object errorEntry) - Call resulted in an error, sending a message (code and description) corresponding to error "E98" - "error in call, too many repeated requests". - **400** (Object errorEntry) - Call resulted in an error, sending a message (code and description) corresponding to error "E96" - "request made incorrectly - structure error". ### Error Codes and Messages Additional validation errors based on business rules: - **FE-RNG-010** (E08) - The Software Producer's signature "jwsSoftwareSignature" does not match the transmitted information. - **FE-RNG-011** (E39) - Data in the Software Producer's signature "jwsSoftwareSignature" differs from information in the Software Certification process. - **FE-RNG-032** (E40) - Data in the service call signature "jwsSignature" does not match information in the service call. ``` -------------------------------- ### POST /websites/portaldoparceiro_hml_minfin_gov_ao/doc-agt/faturacao-electronica Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/registar Submete documentos de faturação eletrónica para registo. Esta requisição aceita um conjunto de parâmetros de entrada que descrevem a submissão, o software emissor e os documentos a serem submetidos. ```APIDOC ## POST /websites/portaldoparceiro_hml_minfin_gov_ao/doc-agt/faturacao-electronica ### Description Submete documentos de faturação eletrónica para registo. Esta requisição aceita um conjunto de parâmetros de entrada que descrevem a submissão, o software emissor e os documentos a serem submetidos. ### Method POST ### Endpoint /websites/portaldoparceiro_hml_minfin_gov_ao/doc-agt/faturacao-electronica ### Parameters #### Request Body - **schemaVersion** (string) - Required - Versão do schema do serviço, exemplo “1.0” - **submissionUUID** (string) - Required - Identificador único da solicitação fornecido pelo software, no formato UUID standard “xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx” em que: * Cada **x** é um dígito hexadecimal (0–9, a–f); * **M** indica a versão do UUID (por exemplo, 4 para UUID versão 4 — aleatório); * **N** indica o **variant** (especifica o layout; para UUIDs compatíveis com RFC 4122, os primeiros bits de N devem estar entre 8 e b). Exemplo: 550e8400-e29b-41d4-a716-446655440000 Este identificador deverá ser único por cada submissão do contribuinte emissor. - **taxRegistrationNumber** (string) - Required - Número fiscal de contribuinte. (maxlength: 15) - **submissionTimeStamp** (string) - Required - Timestamp de submissão do pedido no formato ISO 8601, exemplos: * "2025-05-27T14:30:00Z" (em UTC); * "2025-05-27T14:30:00-03:00" (com informação de timezone). - **softwareInfo** (object) - Required - Objecto com os dados do _Software_ de Facturação. - **numberOfEntries** (integer) - Required - Número de facturas que constam na chamada ao serviço. - **documents** (array) - Required - Array com a lista de facturas (object document). Prevê-se um máximo de 30 facturas. ### Request Example ```json { "schemaVersion": "1.0", "submissionUUID": "550e8400-e29b-41d4-a716-446655440000", "taxRegistrationNumber": "123456789", "submissionTimeStamp": "2025-05-27T14:30:00Z", "softwareInfo": {}, "numberOfEntries": 1, "documents": [ {} ] } ``` ### Response #### Success Response (200) - **requestID** (string) - Registo de pedido efectuado com sucesso sendo devolvido ID de confirmação de solicitação de registo de documentos de facturação – a validação será efectuada de forma diferida no tempo. (maxlength: 15) #### Response Example ```json { "requestID": "1234567890ABCDE" } ``` #### Error Response (400) - **errorList** (array) - Registo de pedido efectuado com erros, sendo devolvida uma lista de erros na recepção dos dados do pedido de registo dos documentos de facturação. #### Response Example ```json { "errorList": [ { "message": "Campo inválido.", "code": "INVALID_FIELD" } ] } ``` ``` -------------------------------- ### Exemplo de Header HTTP Completo para POST Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/api Demonstra a estrutura completa do cabeçalho HTTP para uma requisição POST protegida por Basic Authentication. Inclui o método, host, credenciais codificadas, tipo de conteúdo e aceitação. ```http POST /sigt/fe/v1/registarFactura HTTP/1.1 Host: https://sifphml.minfin.gov.ao Authorization: Basic Y2xpZW50ZTEyMzpzM25oQEYwcnRlIQ== Content-Type: application/json Accept: application/json Content-Length: 524 ``` -------------------------------- ### POST Request to List Series Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/listar Este endpoint permite consultar as séries de numeração de faturas eletrónicas associadas a um contribuinte. Requer um payload com informações do contribuinte, como número de registo fiscal e detalhes do software. A resposta conterá a lista de séries encontradas ou um indicador de que nenhuma foi encontrada. ```json { "schemaVersion": "string", "taxRegistrationNumber": "5001636863", "submissionTimeStamp": "2025-10-28T18:51:10.178Z", "seriesCode": "LD6325S1N", "seriesYear": "2025", "seriesStatus": "A", "documentType": "LD", "establishmentNumber": 10, "jwsSignature": "string", "softwareInfo": { "softwareInfoDetail": { "productId": "Meu ERP CERTO", "productVersion": "1.0.1", "softwareValidationNumber": "C_134" }, "jwsSoftwareSignature": "eyJ0eXAiOiJKV1NFIiwiYWxnIjoiUlMyNTYifQ.eyJwcm9kdWN0SWQiOiJNZXUgRVJQIENFUlRPIiwicHJvZHVjdFZlcnNpb24iOiIxLjAuMSIsInNvZnR3YXJlVmFsaWRhdGlvbk51bWJlciI6IkNfMTM0In0.VE3zkvOJOpqBfz4wpx4KCgcwOGgzGUP3MSMbaHCDnHhwOaeA6jlccBW9HjgQvg2tYCVVq0imrU_z0grEHNthhG4xD3afSOD1_RzvHs8Tc45dvztHJzB4gF0CAX-yIDwi7XcHiMRY0vkXOETBeHKewg0ktWSnZ7SLf4GxGzE7ry2u_pmhqhCPhxpa0oGQ_rBJUYkEAFg1OwaqjwvzCFgdT11r-XsHmnkcfJX_ktj59RWR_zgbytiCRtwCK9LNUflveS5GzUaCXbPn2deQ3F2hPldLECEa_ahwoapoK1LhkgOAVyPLJf6M1Cm09Le7rkdSaWQSW5BI_sPx5YaUaXkeqg" } } ``` -------------------------------- ### Exemplo de Autenticação com JavaScript Fetch API Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/api Ilustra como implementar Basic Authentication em requisições JavaScript utilizando a Fetch API. O código demonstra a codificação manual das credenciais em Base64 e a configuração do cabeçalho Authorization. ```javascript const auth = btoa("cliente123:s3nh@F0rte!"); fetch("https://sifphml.minfin.gov.ao/sigt/fe/v1/registarFactura ",{ method: "POST", headers:{ "Authorization": `Basic ${"auth"}`, "Content-Type": "application/json", "Accept": "application/json" } }).then(res => res.json()).then(console.log); ``` -------------------------------- ### Exemplo de Resposta ao Consultar Estado da Fatura (JSON) Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/consultar Este snippet JSON ilustra uma resposta típica ao consultar o estado de validação de facturas. Contém o ID da requisição, um código de resultado e listas para erros e status de documentos, indicando o sucesso ou falha do processamento. ```json { "requestID": "202500000000118", "resultCode": "2", "taxRegistrationNumber": "5001636863", "documentStatusList": [], "requestErrorList": [] } ``` -------------------------------- ### Exemplo de Requisição cURL com Basic Auth Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/api Mostra como realizar uma requisição POST utilizando a ferramenta cURL, aplicando Basic Authentication de forma simplificada. O cURL trata automaticamente a codificação Base64 ao usar a opção -u. ```curl curl -X POST "https://sifphml.minfin.gov.ao/sigt/fe/v1/registarFactura" \ -u cliente123:"s3nh@F0rte!" \ -H "Accept: application/json" ``` -------------------------------- ### Exemplo de Autenticação com C# HttpClient Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/api Fornece um exemplo de como configurar Basic Authentication em requisições HTTP utilizando a classe HttpClient em C#. O código detalha a codificação das credenciais e a configuração do cabeçalho de autorização. ```csharp var client = new HttpClient(); var byteArray = Encoding.ASCII.GetBytes("cliente123:s3nh@F0rte!"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray)); var response = await client.GetAsync("https://sifphml.minfin.gov.ao/sigt/fe/v1/registarFactura"); var content = await response.Content.ReadAsStringAsync(); ``` -------------------------------- ### POST Response for Listing Series Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/listar Esta é a estrutura de resposta esperada ao chamar o endpoint 'Listar Séries'. Inclui um código de resultado, a contagem de séries encontradas e uma lista detalhada das séries, caso existam. ```json { "resultCode": "1", "seriesResultCount": "0", "seriresInfo": [] } ``` -------------------------------- ### Exemplo de Resposta do Serviço Consultar Factura Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/consultar_fatura Exemplo de resposta em JSON do serviço 'consultarFactura'. Apresenta a estrutura esperada para o resultado da consulta, incluindo campos para o número do documento, status, detalhes da factura e uma lista de erros, se aplicável. ```json { "documentNo": "", "documentStatus": "", "document": "", "documentStatusList": [""], "errorList": [ { "idError": "E93", "descriptionError": "Documento desconhecido (FT FT6325S2C/1000020)" } ] } ``` -------------------------------- ### Exemplo de Payload de Requisição para Consultar Factura Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/consultar_fatura Exemplo de payload em JSON para a requisição do serviço 'consultarFactura'. Inclui informações essenciais como versão do schema, identificador fiscal, timestamp, detalhes do software emissor e assinatura. ```json { "schemaVersion": "1.2", "submissionUUID": "a1b2c3d4-e5f6-7890-g1h2-i238j234k5122", "taxRegistrationNumber": "5001636863", "submissionTimeStamp": "2025-09-02T14:30:00Z", "softwareInfo": { "softwareInfoDetail": { "productId": "Meu ERP CERTO", "productVersion": "1.0.1", "softwareValidationNumber": "C_134" }, "jwsSoftwareSignature": "eyJ0eXAiOiJKT1NFIiwiYWxnIjoiUlMyNTYifQ.eyJwcm9kdWN0SWQiOiJNZXUgRVJQIENFUlRPIiwicHJvZHVjdFZlcnNpb24iOiIxLjAuMSIsInNvZnR3YXJlVmFsaWRhdGlvbk51bWJlciI6IkNfMTM0In0.VE3zkvOJOpqBfz4wpx4KCgcwOGgzGUP3MSMbaHCDnHhwOaeA6jlccBW9HjgQvg2tYCVVq0imrU_z0grEHNthhG4xD3afSOD1_RzvHs8Tc45dvztHJzB4gF0CAX-yIDwi7XcHiMRY0vkXOETBeHKewg0ktWSnZ7SLf4GxGzE7ry2u_pmhqhCPhxpa0oGQ_rBJUYkEAFg1OwaqjwvzCFgdT11r-XsHmnkcfJX_ktj59RWR_zgbytiCRtwCK9LNUflveS5GzUaCXbPn2deQ3F2hPldLECEa_ahwoapoK1LhkgOAVyPLJf6M1Cm09Le7rkdSaWQSW5BI_sPx5YaUaXkeqg" }, "jwsSignature": "string", "invoiceNo": "FT FT6325S2C/1000020" } ``` -------------------------------- ### Registar Factura - Solicitação (JSON) Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/servicos/registar Estrutura do payload de entrada para solicitar o registo de uma fatura eletrónica. Contém informações sobre o envio, dados do contribuinte, detalhes do software e informações dos documentos. ```json { "schemaVersion": "1.2", "submissionUUID": "a1b2c3d4-e5f6-7890-g1h2-i23822j2232-3784", "taxRegistrationNumber": "5001636863", "submissionTimeStamp": "2025-11-04T14:30:00Z", "softwareInfo": { "softwareInfoDetail": { "productId": "Meu ERP CERTO", "productVersion": "1.0.1", "softwareValidationNumber": "C_134" }, "jwsSoftwareSignature": "eyJ0eXAiOiJKT1NFIiwiYWxnIjoiUlMyNTYifQ.eyJwcm9kdWN0SWQiOiJNZXUgRVJQIENFUlRPIiwicHJvZHVjdFZlcnNpb24iOiIxLjAuMSIsInNvZnR3YXJlVmFsaWRhdGlvbk51bWJlciI6IkNfMTM0In0.VE3zkvOJOpqBfz4wpx4KCgcwOGgzGUP3MSMbaHCDnHhwOaeA6jlccBW9HjgQvg2tYCVVq0imrU_z0grEHNthhG4xD3afSOD1_RzvHs8Tc45dvztHJzB4gF0CAX-yIDwi7XcHiMRY0vkXOETBeHKewg0ktWSnZ7SLf4GxGzE7ry2u_pmhqhCPhxpa0oGQ_rBJUYkEAFg1OwaqjwvzCFgdT11r-XsHmnkcfJX_ktj59RWR_zgbytiCRtwCK9LNUflveS5GzUaCXbPn2deQ3F2hPldLECEa_ahwoapoK1LhkgOAVyPLJf6M1Cm09Le7rkdSaWQSW5BI_sPx5YaUaXkeqg" }, "numberOfEntries": 1, "documents": [ { "documentNo": "FT FT6325S2C/10006", "documentStatus": "N", "jwsDocumentSignature": "eyJ0eXAiOiJKT1NFIiwiYWxnIjoiUlMyNTYifQ.eyJkb2N1bWVudE5vIjoiRlQgRlQ2MzI1UzJDLzEwMDA2IiwidGF4UmVnaXN0cmF0aW9uTnVtYmVyIjoiNTAwMTYzNjg2MyIsImRvY3VtZW50VHlwZSI6IkZUIiwiZG9jdW1lbnREYXRlIjoiMjAyNS0xMS0wNCIsImN1c3RvbWVyVGF4SUQiOiJQVDk4NzY1NDMyMSIsImN1c3RvbWVyQ291bnRyeSI6IlBUIiwiY29tcGFueU5hbWUiOiJDbGllbnRlIEV4ZW1wbG8gTGRhIn0.Sg0jnyksnnXtXUkf5PaoZrRtf3kiNkw3urFaE2D1fHLLLw_hQWc896-cGbRVnJGRHPrcnOnEQqQ-ws5R51erzadVstr9Q1yUd0CIvUhszGO15t6m0H--O9VtNMWEOp2asP4P80LD4m55y5rX2stCCGAmTI2N1cAWAhw1JbRr2Zb378y8ZI8dicfJm1QDzs5YKmXrRqXH9yvaF62SHXXfpv5gzLRAAbRwjvY7roso_PRuue9Ke1w0hojnpBmr_zUg0D3eBa-eUjtVPMQsbl5DXBFhr4Qydr4Q04tvUqLBAeGpQmxTRZGs2OCjQzdz2tYIZSbEiFR9Zo6EwL1s1tsRnA", "documentDate": "2025-11-04", "documentType": "FT", "eacCode": "12345", "systemEntryDate": "2025-11-04T11:15:30Z", "customerTaxID": "PT987654321", "customerCountry": "PT", "companyName": "Cliente Exemplo Lda", "lines": [ { "lineNumber": 1, "productCode": "PROD001", "productDescription": "Produto Exemplo 1", "quantity": 2, "unitOfMeasure": "UN", "unitPrice": 250, "unitPriceBase": 250, "debitAmount": 0, "creditAmount": 500, "taxes": [ { "taxType": "IVA", "taxCountryRegion": "AO", "taxCode": "NOR", "taxPercentage": 14, "taxContribution": 70 } ], "settlementAmount": 0 } ], "documentTotals": { "taxPayable": 70, "netTotal": 500, "grossTotal": 570 }, "withholdingTaxList": [ { "withholdingTaxType": "IRT", "withholdingTaxDescription": "Retenção na fonte", "withholdingTaxAmount": 16.5 } ] } ] } ``` -------------------------------- ### Geração de Assinatura JWS com RS256 em C# (.NET) Source: https://portaldoparceiro.hml.minfin.gov.ao/doc-agt/faturacao-electronica/1/estrutura Exemplo de como gerar uma assinatura JWS utilizando o algoritmo RS256 com uma chave privada RSA em C# (.NET). Utiliza as bibliotecas System.IdentityModel.Tokens.Jwt e Microsoft.IdentityModel.Tokens para assinar um payload JSON. Requer um arquivo de chave privada ('private.pem'). ```csharp using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using System.Security.Cryptography; var payload = new Dictionary { { "softwareName", "ClinicaHub" }, { "softwareVersion", "1.0.0" }, { "softwareValidationNo", "123456789" } }; var privateKey = RSA.Create(); privateKey.ImportFromPem(File.ReadAllText("private.pem")); var credentials = new SigningCredentials( new RsaSecurityKey(privateKey), SecurityAlgorithms.RsaSha256 ) ; var token = new JwtSecurityToken( claims: payload.Select(kv => new Claim(kv.Key, kv.Value.ToString())), signingCredentials: credentials ); var jwt = new JwtSecurityTokenHandler().WriteToken(token); Console.WriteLine(jwt); ```