curl -X POST "$API_URL/facipaypartner/generatePaymentReference" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Accept-Language: pt" \
-H "Content-Type: application/json" \
-d '{
"dsApplicationUUID": "APPLICATION_UUID",
"userName": "Cliente Exemplo",
"userPhone": "244923456789",
"amount": 15000,
"referenceTime": 300,
"externalTransactionId": "order_example_001",
"dsReference": "Compra de exemplo"
}'{
"code": 200,
"body": {
"code": 200,
"message": "Operation executed with success",
"data": {
"referenceNumber": "5DBA63925F8D697BE06304241DAC378A",
"paymentId": 3648,
"paymentType": "REF",
"paymentStatus": "PEN",
"paymentFee": "0",
"createdAt": "2026-10-13T14:34:31.826Z",
"updatedAt": "2026-10-13T14:34:32.000Z",
"externalTransactionId": "order_example_001",
"customer": {
"typeOfClient": "EXTERNAL_ENTITY",
"name": "Cliente Exemplo",
"contactInfo": {
"value": "244923456789",
"type": "PHONE_NUMBER"
}
},
"additionalInfo": {
"paymentReference": "000305536",
"entityName": "Faciangola",
"entityNumber": "10136",
"expiresIn": 262.01666666666665
},
"description": "Compra de exemplo",
"amount": 15000,
"currency": "AOA"
},
"pagination": null,
"error": null
}
}{
"code": 401,
"message": "Unauthorized",
"error": "invalid_client"
}{
"code": 123,
"body": {
"code": 123,
"message": "Something went wrong",
"data": null,
"pagination": null,
"error": {
"errorMessage": "<string>",
"detail": "<unknown>"
}
}
}Gerar referência de pagamento
Gera uma referência de pagamento Multicaixa para um cliente do parceiro, mesmo que esse cliente não tenha conta FaciPay. O parceiro envia o nome e o telemóvel do cliente, o montante e o seu próprio identificador do pedido. A FaciPay cria um pedido de pagamento pendente, associado à carteira do parceiro, e devolve a entidade e a referência que o cliente usa para pagar (ATM, Multicaixa Express, internet banking). Quando o cliente paga, o montante entra na carteira do parceiro e o parceiro é notificado por webhook. Se ninguém pagar dentro do prazo, o pedido é cancelado automaticamente.
A chamada é feita pelo backend do parceiro, com a mesma autenticação Bearer e os mesmos headers dos restantes endpoints. Diferença para createPaymentOrder: aqui o pagamento é por referência Multicaixa, com prazo definido pelo parceiro, e o cliente é identificado por nome e telemóvel.
Carteira de destino e disponibilidade
O montante pago entra na carteira do parceiro associada à aplicação indicada em dsApplicationUUID. A carteira não é indicada no pedido nem pode ser alterada pelo parceiro. A aplicação tem de pertencer ao parceiro autenticado e ter uma integração activa. O serviço não exige nenhuma permissão adicional e não é necessário saldo na carteira para gerar a referência.
Pedido
Atenção ao nome do campo da aplicação: neste endpoint chama-se dsApplicationUUID, e não applicationUUID. null nos campos obrigatórios é rejeitado.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
dsApplicationUUID | string | sim | UUID da aplicação do parceiro: a publishableKey sem o prefixo pk_test_/pk_live_. |
userName | string | sim | Nome do cliente que vai pagar. Até 100 caracteres. |
userPhone | string | sim | Telemóvel do cliente. Até 100 caracteres. O serviço não valida o formato; recomenda-se 244923456789, sem espaços nem sinal +. |
amount | number | sim | Montante a cobrar, em AOA. |
referenceTime | number | não | Validade da referência em minutos, contada a partir da criação. Se omitido, assume 180 minutos (3 horas). |
externalTransactionId | string | sim | Identificador do pedido no sistema do parceiro. Até 1000 caracteres. É a chave para consultar o pedido depois em paymentByExternalTransaction; use um identificador único por pedido. |
dsReference | string | não | Descrição curta do pedido, visível ao cliente. Se omitido fica N/A. |
amount e referenceTime são aceites também como string com um número, porque o serviço converte. O serviço não impõe mínimo nem máximo próprios para amount; aplicam-se os limites do sistema de referências Multicaixa. Um pedido gera uma referência para um cliente; não existem lotes.
Resposta
A resposta usa o envelope code/body dos endpoints de parceiro. O pedido de pagamento está em body.data, com a mesma estrutura que paymentByExternalTransaction devolve, no estado pendente.
additionalInfo.entityNumbereadditionalInfo.paymentReferencesão o que o cliente usa para pagar no Multicaixa;additionalInfo.entityNameé o nome da entidade. Preserve estes valores como strings, incluindo os zeros à esquerda.additionalInfo.expiresInsão os minutos de validade restantes e pode conter casas decimais. Só vem preenchido enquanto o pedido está pendente; depois vemnull.referenceNumberidentifica o pagamento na API epaymentIdé o identificador do pedido na FaciPay. Nenhum dos dois é a referência que o cliente paga.paymentTypeéREFepaymentStatuséPENna criação. Gerar a referência não significa que o pagamento foi confirmado: o estado passa aCONquando o cliente paga e aCANse expirar sem pagamento. Os valores possíveis são os já documentados empaymentByExternalTransaction.customer.typeOfClienté sempreEXTERNAL_ENTITYecustomer.contactInfo.typeé semprePHONE_NUMBER.paymentFeevem"0"ounullna criação.
Ou o pedido é criado por inteiro (referência, pedido pendente e notificação) ou nada é criado. Não há sucesso parcial nem estados intermédios após erro.
Consulta e repetição de pedidos
Consulte o pedido depois em paymentByExternalTransaction, com o externalTransactionId e o applicationUUID. O serviço não verifica se o externalTransactionId já foi usado antes.
Atenção: é importante que o parceiro faça a gestão dos pedidos já enviados, guardando o
paymentIde a referência devolvidos para cadaexternalTransactionId, para impedir que uma mesma cobrança seja gerada mais do que uma vez. Em caso de timeout ou ausência de resposta, consulte o pedido porpaymentByExternalTransactionantes de repetir o envio.
Notificações
O parceiro recebe um POST no URL de notificação registado para a sua conta, com o corpo JSON igual ao data de paymentByExternalTransaction e o header x-facipay-content-token com a assinatura HMAC do corpo, calculada com a chave secreta do parceiro. Ver Webhooks. Dispara na criação (estado pendente) e no pagamento (estado confirmado).
A comunicação da entidade e da referência ao cliente é responsabilidade do parceiro. O envio de SMS ao cliente pela FaciPay está a confirmar: em testes com um número de telefone válido foi observada uma mensagem com este formato ilustrativo, mas não dependa dela.
Olá {nomeCliente}, {nomeComerciante} criou a ref. MCX {descricaoCompra} de {montanteFormatado} AOA. Ent. {numeroEntidade} - {nomeEntidade}, ref. {referenciaPagamento}.
Erros
Os erros usam o envelope code/body, com body.data e body.pagination nulos e body.error.errorMessage/body.error.detail para a mensagem e o detalhe. A resposta de autenticação 401 reutiliza o formato comum já documentado. Qualquer destes erros deixa zero pedidos criados.
| Situação | Mensagem devolvida |
|---|---|
dsApplicationUUID inválido ou não pertence ao parceiro autenticado | Application UUID inválido |
| Integração do parceiro inactiva | Integração encontra-se inactiva. |
userName em falta | É obrigatório informar o destinatário |
userPhone em falta | É obrigatório informar o número do telemóvel do destinatário |
amount em falta ou não numérico, ou outro parâmetro com tipo ou tamanho inválido | Pedido inválido (mensagem genérica de bad request) |
| Falha ao gerar a referência Multicaixa (indisponibilidade ou montante recusado pelo sistema de referências) | Erro ao gerar referência (texto exacto a confirmar) |
| Erro inesperado | Erro interno padrão |
Ambientes e testes
Não existe modo sandbox no serviço nem campo de simulação no pedido. O serviço foi testado em HML e o comportamento em produção é o mesmo. Para simular erros, omita userName ou userPhone, ou envie um dsApplicationUUID inexistente. Os exemplos cURL usam API_URL, ACCESS_TOKEN e o placeholder APPLICATION_UUID.
A confirmar com a equipa FaciPay
- Códigos HTTP e valores numéricos de
codepara erros de negócio e internos, e exemplos reais dessas respostas. - Formato oficial de
userPhonea publicar; o serviço não valida o formato. - Tamanho máximo efectivo de
dsReference: o serviço aceita até 1000 caracteres, mas a descrição da referência tem um limite mais curto. - Limites mínimo e máximo de
amountno sistema de referências Multicaixa e se aceita decimais. - Se existe comissão sobre o pagamento recebido, quem a suporta e se aparece em
paymentFeena consulta posterior. - Se a geração de referências exige activação prévia da entidade do parceiro junto da FaciPay.
- O que
paymentByExternalTransactiondevolve quando o mesmoexternalTransactionIdfoi usado mais do que uma vez (previsivelmente o pedido mais recente). - Se o webhook dispara também no cancelamento por expiração.
- Envio de SMS ao cliente: mecanismo e disponibilidade em produção.
- Forma de simular o pagamento de uma referência em HML e carteiras de teste disponíveis.
curl -X POST "$API_URL/facipaypartner/generatePaymentReference" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Accept-Language: pt" \
-H "Content-Type: application/json" \
-d '{
"dsApplicationUUID": "APPLICATION_UUID",
"userName": "Cliente Exemplo",
"userPhone": "244923456789",
"amount": 15000,
"referenceTime": 300,
"externalTransactionId": "order_example_001",
"dsReference": "Compra de exemplo"
}'{
"code": 200,
"body": {
"code": 200,
"message": "Operation executed with success",
"data": {
"referenceNumber": "5DBA63925F8D697BE06304241DAC378A",
"paymentId": 3648,
"paymentType": "REF",
"paymentStatus": "PEN",
"paymentFee": "0",
"createdAt": "2026-10-13T14:34:31.826Z",
"updatedAt": "2026-10-13T14:34:32.000Z",
"externalTransactionId": "order_example_001",
"customer": {
"typeOfClient": "EXTERNAL_ENTITY",
"name": "Cliente Exemplo",
"contactInfo": {
"value": "244923456789",
"type": "PHONE_NUMBER"
}
},
"additionalInfo": {
"paymentReference": "000305536",
"entityName": "Faciangola",
"entityNumber": "10136",
"expiresIn": 262.01666666666665
},
"description": "Compra de exemplo",
"amount": 15000,
"currency": "AOA"
},
"pagination": null,
"error": null
}
}{
"code": 401,
"message": "Unauthorized",
"error": "invalid_client"
}{
"code": 123,
"body": {
"code": 123,
"message": "Something went wrong",
"data": null,
"pagination": null,
"error": {
"errorMessage": "<string>",
"detail": "<unknown>"
}
}
}Autorizações
Access token obtido em POST /token.
Cabeçalhos
Idioma das mensagens (pt, en, fr).
pt, en, fr Corpo
UUID da aplicação do parceiro, a publishableKey sem o prefixo pk_test_/pk_live_. Neste endpoint o campo chama-se dsApplicationUUID, não applicationUUID.
"APPLICATION_UUID"
Nome do cliente que vai pagar. Até 100 caracteres; null é rejeitado.
100"Cliente Exemplo"
Telemóvel do cliente. Até 100 caracteres. O serviço não valida o formato; recomenda-se 244923456789, sem espaços nem sinal +. Formato oficial a confirmar com a equipa FaciPay.
100"244923456789"
Montante a cobrar, em AOA. Também aceite como string com um número. O serviço não impõe mínimo nem máximo próprios; aplicam-se os limites do sistema de referências Multicaixa (a confirmar).
15000
Identificador do pedido no sistema do parceiro, até 1000 caracteres. Chave para consultar o pedido em paymentByExternalTransaction; use um identificador único por pedido.
1000"order_example_001"
Validade da referência em minutos, contada a partir da criação. Se omitido, 180 minutos (3 horas). Também aceite como string com um número.
300
Descrição curta do pedido, visível ao cliente. Se omitido fica N/A. O serviço aceita até 1000 caracteres; o limite efectivo da descrição da referência é mais curto e está a confirmar.
1000"Compra de exemplo"