1. Visão geral
2. Autenticação
1.1. Cabeçalho
3. Dados constantes
2.2. Pacotes de licença
3.3. Tipos de documentos
4.4. Taxas & Imposto (IVA)
5.5. Isenções
6.6. Grupos de artigo
A tabela abaixo apresenta os tipos de incidência aplicáveis aos artigos durante a emissão de documentos. Para artigos do tipo P (Produto), deve ser utilizado obrigatoriamente o código TB (Transmissão de Bens).
| Sigla | Tipo de Incidência |
|---|---|
| SE | Prestação de Serviços de Educação |
| SS | Prestação de Serviços de Saúde |
| STP | Serviços de Transporte de Passageiros |
| SR | Serviços sujeitos a Royalties |
| SIF | Intermediação Financeira / Seguros |
| SHS | Hotelaria e Similares |
| ST | Telecomunicações |
| SG | Serviço Geral (Outros) |
| TB | Transmissão de Bens |
| AS | Arrendamento e Subarrendamento |
| QT | Quotas |
| RD | Repasse de Despesas |
7.7. Tipos de descontos
A tabela abaixo apresenta os tipos de descontos suportados pela API para aplicação em artigos ou no total do documento. O valor informado deve corresponder ao tipo de desconto seleccionado.
| Tipo | Descrição |
|---|---|
| Percentagem | Desconto aplicado em percentagem (%) |
| Akz | Desconto aplicado em valor monetário (Kz) |
8.8. Motivo Nota de Crédito
Para a emissão de Nota de Crédito (NC), é obrigatório informar o motivo da anulação ou rectificação, bem como a respectiva causa, descrita em texto livre conforme a necessidade da operação.
Exemplo de causa: Cliente efectuou a compra por engano, Foi uma falha técnica,...
Exemplo de causa: Cliente efectuou a compra por engano, Foi uma falha técnica,...
| Motivo | Descrição |
|---|---|
| ANL | Anulação total ou parcial da factura |
| RTF | Rectificação de valores ou devolução |
9.9. Retenção na Fonte
A retenção na fonte, na emissão de documentos, segue regras estritas de validação e apenas admite os valores pré-definidos abaixo. Qualquer tentativa de envio de outras taxas será ignorada pelo sistema.
| Taxa de Retenção (%) | Descrição |
|---|---|
| 0.00 | Sem retenção |
| 6.5 | Retenção de IRS/IRPC aplicável a serviços |
Regras de aplicação
- A retenção na fonte é aplicável exclusivamente a artigos do tipo
S(Serviço); - O artigo deve ter o campo de retenção definido como
Sujeitopara que a retenção seja considerada no cálculo do documento; - Caso o campo esteja definido como
NA(Não Aplicado), a retenção não será aplicada, independentemente da taxa informada e do artigo se do tipoS(Serviço); - O sistema não permite configuração livre de percentagens — apenas os valores definidos nesta tabela são aceites.
4. Comerciantes
Esta secção permite ao Distribuidor gerir as contas dos seus comerciantes (clientes finais). Através destes endpoints, o Distribuidor pode criar novas contas, editar informações, renovar licenças e configurar as chaves de facturação electrónica necessárias para emissão de documentos fiscais válidos.
Importante:
As operações de criação, edição, renovação e configuração de comerciantes são sempre reais e irreversíveis, independentemente do ambiente utilizado posteriormente para emissão de documentos.
Não existe conceito de "ambiente de teste" para a gestão de comerciantes. Um comerciante criado existe no sistema e as suas licenças têm custos reais descontados da carteira do Distribuidor.
10.10. Criar comerciante
Cria uma nova conta de comerciante associada ao Distribuidor. O saldo da carteira do Distribuidor é debitado automaticamente. Assim que for criar comerciante, automáticamente será emitido e retornado ID de estabelecimento SEDE e do utilizador padrão (ADMIN) para conta criada.
Endpoint:
POST /comerciante/add Headers
API-Key-Distribuidor: {chave_do_distribuidor} Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| nome | String | ✅ | Nome do comerciante |
| nif | String | ✅ | NIF do comerciante (9 ou 14 dígitos) |
| tipo | String | ✅ | Empresa ou Particular |
| telefone | String | ✅ | Número de telefone (apenas operadoras angolanas com 9 dígitos) |
| String | ❌ | E-mail do comerciante | |
| endereco | String | ❌ | Endereço do comerciante |
| dataNasc | String | ⚠️ | Obrigatório se tipo = Particular (formato yyyy-MM-dd) |
| PACOTE | Long | ✅ | ID do pacote (1=Mensal, 2=Trimestral, 3=Semestral, 4=Anual) |
| logoComerciante | File | ❌ | Logótipo do comerciante (upload) |
Exemplo de Requisição (cURL)
curl -X POST https://api.ulemo.ao/api/integration/v1/comerciante/add \
-H "API-Key-Distribuidor: ulemoiba_live_abc123def456" \
-F "nome=Empresa ABC, LDA" \
-F "nif=5001234567" \
-F "tipo=Empresa" \
-F "telefone=923456789" \
-F "email=contato@empresaabc.ao" \
-F "endereco=Luanda, Maianga" \
-F "PACOTE=1"
Resposta de Sucesso
{
"success": true,
"message": "Comerciante registado com êxito",
"data": {
"id": 12345,
"nif": "5001234567",
"apiKeyDevelopment": "ulemoiba_test_8f3a2e1buiba1",
"apiKeyProduction": "ulemoiba_live_7d4g5h6juiba2",
"dataCriacao": "2026-06-12",
"idEstabelecimentoSEDE": 67890,
"idUserADMIN": 11111
} } Resposta de Erro (Ex.: Saldo Insuficiente)
{
"success": false,
"message": "O saldo do Distribuidor Ulemo não é suficiente para criar Comerciante com Pacote Mensal"
} 11.11. Editar comerciante
Actualiza os dados de um comerciante existente.
Endpoint:
POST /comerciante/edit
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | Long | ✅ | ID do comerciante |
| nome | String | ✅ | Nome do comerciante |
| nif | String | ✅ | NIF do comerciante |
| telefone | String | ✅ | Número de telefone |
| String | ❌ | ||
| endereco | String | ❌ | Endereço |
| dataNasc | String | ⚠️ | Obrigatório se tipo = Particular |
| logoComerciante | File | ❌ | Novo logótipo |
12.12. Listar Comerciantes
Retorna uma lista paginada de comerciantes associados ao Distribuidor. Cada página pode conter até 100 comerciantes.
Endpoint:
GET /comerciante/list-comerciantes/{PAGE}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| PAGE | Integer | ✅ | Número da página a consultar (inicia em 0) |
Exemplo de Requisição
GET /comerciante/list-comerciantes/0
Resposta
{
"success": true,
"message": "Consulta realizada com sucesso",
"data": {
"page": 0,
"total": 45,
"comerciantes": [
{
"id": 12345,
"nome": "Empresa ABC, LDA",
"nif": "5001234567",
"tipo": "Empresa",
"telefone": "923456789",
"dataCriacao": "2026-06-12"
}
]
}
}
13.13. Consultar por ID
A consulta por ID, obtém os detalhes completos de um comerciante específico.
Endpoint:
GET /comerciante/find-comerciante-by-id/{ID}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID | Long | ✅ | ID do comerciante a consultar |
Exemplo de Requisição
GET /comerciante/find-comerciante-by-id/12345
Resposta
{
"success": true,
"message": "Consulta realizada com sucesso",
"data": {
"nome": "Empresa ABC, LDA",
"nif": "5001234567",
"tipo": "Empresa",
"telefone": "923456789",
"dataCriacao": "2026-06-12",
"logo": "logo.png",
"chavesFE": "Pendente",
"diasRestantesLicenca": 25
}
}
14.14. Renovar Licença
Renova a licença (assinatura) de um comerciante. O saldo da carteira do Distribuidor é debitado automaticamente.
Endpoint:
POST /comerciante/renovar-licenca
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| PACOTE | Long | ✅ | ID do pacote (1=Mensal, 2=Trimestral, 3=Semestral, 4=Anual) |
Resposta de Sucesso
{
"success": true,
"message": "Licença renovada com êxito"
}
15.15. Chaves F. electrónica
Configura o pare de chaves da facturação electrónica do comerciante para emissão de documentos fiscais válidos. O comerciante pode obter este par de chaves no portal quiosque da AGT, consulte tutoriais do Ulemo, há um vídeo que instrue a obter estas chaves.
Endpoint:
POST /comerciante/configurar-chaves-fe
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| privada | String | ✅ | Chave privada (copiada do Portal da AGT) |
| publica | String | ✅ | Chave pública (copiada do Portal da AGT) |
Resposta de Sucesso
{
"success": true,
"message": "Chaves de facturação eletrónica configuradas com êxito"
}
5. Estabelecimentos
Esta secção permite ao Distribuidor gerir as filiais, lojas ou pontos de venda associados a cada comerciante. Através destes endpoints, o Distribuidor pode criar, editar, consultar ou excluir estabelecimentos.
Importante:
Tal como na gestão de comerciantes, as operações com estabelecimentos são sempre reais.
Um estabelecimento criado existe efectivamente no sistema e não existe ambiente de teste para esta secção.
A exclusão de um estabelecimento só é permitida se o mesmo nunca tiver emitido qualquer documento.
16.16. Criar estabelecimento
Por padrão, Ulemo regista estabelecimento SEDE automáticamente quando comerciante é criado, caso haja mais postos (filial ou loja extra), crie e lembre-se que estabelecimentos diferentes da SEDE, devem estar préviamente cadastradas no portal da AGT.
Endpoint:
POST /estabelecimento/add Headers
API-Key-Distribuidor: {chave_do_distribuidor} Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| nome | String | ✅ | Nome do estabelecimento |
| numero | String | ✅ | Número identificador (máx. 9 caracteres) |
| provincia | String | ✅ | Província |
| municipio | String | ✅ | Município |
| endereco | String | ✅ | Endereço completo |
Resposta de Sucesso
{
"success": true,
"message": "Estabelecimento registado com êxito!",
"data": {
"id": 67890,
"dataCriacao": "2026-06-12",
"numero": "FILIAL-001"
} } 17.17. Editar estabelecimento
Actualiza os dados de um estabelecimento existente.
Endpoint:
POST /estabelecimento/edit
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| id | Long | ✅ | ID do estabelecimento |
| nome | String | ✅ | Nome do estabelecimento |
| numero | String | ✅ | Número identificador |
| provincia | String | ✅ | Província |
| municipio | String | ✅ | Município |
| endereco | String | ✅ | Endereço |
Resposta de Sucesso
{
"success": true,
"message": "Estabelecimento actualizado com êxito"
}
18.18. Apagar estabelecimento
Remove um estabelecimento. A remoção só é permitida caso o estabelecimento não possua documentos emitidos.
Endpoint:
POST /estabelecimento/delete
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| id | Long | ✅ | ID do estabelecimento |
Resposta de Sucesso
{
"success": true,
"message": "Estabelecimento apagado com êxito"
}
19.19. Listar Estabelecimentos
Lista todos os estabelecimentos associados a um comerciante.
Endpoint:
GET /estabelecimento/list-all-estabelecimentos-by-comerciante/{ID_COMERCIANTE}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante cujos estabelecimentos serão listados |
20.20. Consultar por ID
Consultar Estabelecimento por ID, obtém os detalhes de um estabelecimento específico.
Endpoint:
GET /estabelecimento/find-estabelecimento-by-id/{ID_ESTABELECIMENTO}/{ID_COMERCIANTE}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_ESTABELECIMENTO | Long | ✅ | ID do estabelecimento a consultar |
| ID_COMERCIANTE | Long | ✅ | ID do comerciante proprietário do estabelecimento |
6. Utilizadores
Esta secção permite ao Distribuidor gerir os utilizadores (operadores) que terão acesso à conta de cada comerciante. Através destes endpoints, o Distribuidor pode criar, editar, consultar ou excluir utilizadores com perfil de operador.
Importante:
As operações com utilizadores são sempre reais. O utilizador administrador (ADMIN) é criado automaticamente no momento da criação do comerciante e não pode ser removido pela API.
Apenas utilizadores com perfil de operador (OPERADOR) podem ser criados, editados ou removidos. Não existe ambiente de teste para esta secção.
21.21. Criar utilizador
Cria um novo utilizador com perfil de OPERADOR para um comerciante.
Endpoint:
POST /utilizador/add
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| nome | String | ✅ | Nome do utilizador |
| telefone | String | ✅ | Número de telefone |
| String | ❌ | ||
| genero | String | ❌ | Masculino, Feminino ou Indefinido |
22.22. Editar utilizador
Actualiza os dados de um utilizador existente.
Endpoint:
POST /utilizador/edit
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | Long | ✅ | ID do utilizador |
| ID_COMERCIANTE | Long | ✅ | ID do comerciante |
| nome | String | ✅ | Nome do utilizador |
| telefone | String | ✅ | Número de telefone |
| String | ❌ | ||
| genero | String | ❌ | Masculino, Feminino ou Indefinido |
23.23. Apagar utilizador
Remove um utilizador do tipo OPERADOR. Não é permitido remover administradores e utilizadores com actividades importantes no sistema.
Endpoint:
POST /utilizador/delete
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros (form-data)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | Long | ✅ | ID do utilizador |
24.24. Listar Utilizadores
Lista todos os utilizadores associados a um comerciante.
Endpoint:
GET /utilizador/list-all-utilizadores-by-comerciante/{ID_COMERCIANTE}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_COMERCIANTE | Long | ✅ | ID do comerciante cujos utilizadores serão listados |
25.25. Consultar por ID
Consultar Utilizador por ID, obtém os detalhes de um utilizador específico.
Endpoint:
GET /utilizador/find-utilizador-by-id/{ID_UTILIZADOR}/{ID_COMERCIANTE}
Headers
API-Key-Distribuidor: {chave_do_distribuidor}
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| ID_UTILIZADOR | Long | ✅ | ID do utilizador a consultar |
| ID_COMERCIANTE | Long | ✅ | ID do comerciante associado ao utilizador |
7. Documentos
26.26. Parâmetros de entrada
27.27. Criar factura
28.28. Criar Recibo
29.29. Criar Nota de Crédito
30.30. Consultar por ID
31.31. Listagem por Posto
8. Erros & soluções
Esta secção descreve os principais códigos de erro da API, as suas causas e soluções recomendadas.
Erros de Autenticação e Cabeçalho
| Código | Campo | Mensagem | Solução |
|---|---|---|---|
| HEADER_API_KEY_DISTRIBUIDOR_OBRIGATORIO | API-Key-Distribuidor | O header 'API-Key-Distribuidor' é obrigatório. | Adicione o header API-Key-Distribuidor com a chave fornecida pela Ulemo |
| HEADER_API_KEY_COMERCIANTE_OBRIGATORIO | API-Key-Comerciante | O header 'API-Key-Comerciante' é obrigatório. | Adicione o header API-Key-Comerciante com a chave do comerciante |
| HEADER_ENVIRONMENT_OBRIGATORIO | Environment | O header 'Environment' é obrigatório. | Adicione Environment: Production ou Development |
| HEADER_ENVIRONMENT_INVALIDO | Environment | O valor deve ser 'Production' ou 'Development'. | Corrija o valor do header Environment |
| ENVIRONMENT_INVALIDA | ENVIRONMENT | Ambiente inválido, verifique o HEADER da sua requisição | Utilize apenas Production ou Development |
| ENVIRONMENT_OR_API_key_NULA | Environment/API-Key | Ambiente ou Chaves de API não informados | Adicione todos os headers obrigatórios |
Erros de Chaves de API
| Código | Campo | Mensagem | Solução |
|---|---|---|---|
| API_KEY_INVALIDA | API-Key | As chaves de API informadas são inválidas ou não coincidem. | Verifique se a chave do Distribuidor e do Comerciante estão correctas e se o comerciante pertence ao distribuidor |
| COMERCIANTE_SUSPENSO | COMERCIANTE_SUSPENSO | Conta comerciante suspensa, por favor contacte o seu Distribuidor Ulemo | O Distribuidor deve regularizar a situação do comerciante |
Erros de Licença e Subscrição
| Código | Campo | Mensagem | Solução |
|---|---|---|---|
| LICENCA_NAO_ENCONTRADA | ASSINATURA | Nenhuma licença/subscrição Ulemo PAGA foi encontrada para o seu comerciante. | O Distribuidor deve adquirir um plano para o comerciante |
| SUBSCRICAO_EXPIRADA | licenca | A sua subscrição Ulemo expirou há X dias. | O Distribuidor deve renovar a licença do comerciante |
| CHAVES_FACTURAÇÃO_ELECTRÓNICA_NÃO_CONFIGURADAS | CHAVES_FACTURAÇÃO_ELECTRÓNICA | Ainda não configurou as suas Chaves de Facturação Electrónica no Ulemo | Configure as chaves via endpoint /comerciante/configurar-chaves-fe |
| CHAVES_ASSINATURA_INACTIVAS | chaveAssinatura | As Chaves de Facturação Electrónica estão [estado] no Ulemo. | Active as chaves ou verifique se foram configuradas correctamente |