Txenka
Referência da API

Documentação

Tudo o que precisas para integrar com a API da Txenka — pagamentos, reembolsos, clientes, produtos, links de pagamento, webhooks e a gestão completa da tua conta.

Introdução Autenticação Criar pagamento Confirmar pagamento Gerir Payment Intents Transacções Reembolsos Clientes Produtos Facturas Links de pagamento Perfil da loja API Keys Catálogo Estatísticas Logs de pedidos Métodos de pagamento Webhooks Erros Ajuda

Introdução

A API da Txenka é organizada em torno de payment_intents — cada pagamento que crias e confirmas. Todos os pedidos e respostas usam JSON, e o URL base é https://api.txenka.com/api/v1.

Autenticação

Todas as chamadas autenticadas usam a tua API key no cabeçalho Authorization. Encontras a tua chave em Programadores → API Keys no dashboard — usa txk_test_… para testar sem processar dinheiro real, e txk_live_… em produção. Cada chave escolhe as suas próprias permissões (scopes) — dá a cada integração só o acesso de que precisa.

HTTP Header
Authorization: Bearer txk_test_8f2a3c9d1e...

Scopes

Cada API Key escolhe os seus próprios scopes na criação — restringe cada integração ao mínimo de que precisa. Uma publishable key só pode ter payments:read, payments:confirm e transactions:read — nunca payments:write, que criaria Payment Intents com valor arbitrário.

payments:read Ler Payment Intents
payments:write Criar Payment Intents
payments:confirm Confirmar um Payment Intent já criado (seguro em publishable key)
payments:cancel Cancelar pagamentos
transactions:read Ler transacções
refunds:read Ler reembolsos
refunds:write Criar reembolsos
webhooks:read Ler webhooks
webhooks:write Gerir webhooks
customers:read Ler clientes
customers:write Gerir clientes
products:read Ler produtos
products:write Gerir produtos
invoices:read Ler facturas
invoices:write Gerir facturas
payment_links:read Ler links de pagamento
payment_links:write Gerir links de pagamento
bank_accounts:read Ler contas bancárias de recebimento
bank_accounts:write Gerir contas bancárias de recebimento
payout_accounts:read Ler contas de saque
payout_accounts:write Gerir contas de saque
withdrawals:read Ler levantamentos
withdrawals:write Solicitar levantamentos
billing:read Ler facturação/subscrição
billing:write Gerir facturação/subscrição
devices:read Ler dispositivos emparelhados
devices:write Gerir dispositivos emparelhados
api_keys:read Listar API Keys
api_keys:write Criar, editar e revogar API Keys

Criar um pagamento

Um payment_intent representa uma cobrança. O valor é sempre em centavos (2450 = 24,50 MZN). amount, customer_email e customer_name são obrigatórios; payment_method é opcional — se omitido, o cliente escolhe o método na própria página de checkout.

curl -X POST https://api.txenka.com/api/v1/payment-intents \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 2450,
    "currency": "MZN",
    "payment_method": "mpesa",
    "customer_phone": "258840000000",
    "customer_email": "cliente@exemplo.com",
    "customer_name": "Ana Machava",
    "description": "Pedido #1042",
    "merchant_reference": "PEDIDO-1042"
  }'

A resposta já inclui um checkout_url pronto a usar — redirecionas o cliente para lá e a Txenka trata da confirmação por ti, sem precisares de implementar o passo seguinte. client_secret só autoriza ler/confirmar este pagamento específico, nunca os teus outros intents — seguro para partilhar por qualquer canal (WhatsApp, SMS, email).

Response
{
  "object": "payment_intent",
  "id": "01HX4K9GVZ3QY8N7T2WPJD5R6E",
  "amount": 2450,
  "amount_decimal": "24.50",
  "currency": "MZN",
  "status": "requires_confirmation",
  "payment_method": "mpesa",
  "description": "Pedido #1042",
  "merchant_reference": "PEDIDO-1042",
  "merchant": { "name": "A Tua Loja", "logo_url": null },
  "available_payment_methods": [
    { "key": "mpesa", "name": "M-Pesa", "icon": "...", "type": "wallet", "needs_phone": true, "customer_instructions": "..." }
  ],
  "checkout_url": "https://pay.txenka.com/checkout/01HX4K9GVZ3QY8N7T2WPJD5R6E_secret_a1b2c3...",
  "client_secret": "01HX4K9GVZ3QY8N7T2WPJD5R6E_secret_a1b2c3...",
  "customer": { "email": "cliente@exemplo.com", "phone": "+258840000000", "name": "Ana Machava" },
  "success_url": null,
  "cancel_url": null,
  "failure_code": null,
  "failure_message": null,
  "metadata": {},
  "latest_transaction": null,
  "created_at": "2026-07-30T10:00:00+00:00",
  "updated_at": "2026-07-30T10:00:00+00:00",
  "cancelled_at": null,
  "expires_at": "2026-07-30T11:00:00+00:00"
}

Confirmar o pagamento

Confirmar dispara o pedido junto do método escolhido — por exemplo, um pedido STK push no telemóvel do cliente para M-Pesa/e-Mola.

curl -X POST https://api.txenka.com/api/v1/payment-intents/01HX4K9GVZ3QY8N7T2WPJD5R6E/confirm \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."
Response
{
  "object": "payment_intent",
  "id": "01HX4K9GVZ3QY8N7T2WPJD5R6E",
  "status": "processing",
  "payment_method": "mpesa",
  "failure_code": null,
  "failure_message": null,
  "latest_transaction": {
    "object": "transaction",
    "id": "01HABCXYZ...",
    "provider_reference": "ws_CO_2607261...",
    "status": "pending"
  }
}

O status devolvido pode ser succeeded (imediato), processing (aguarda confirmação assíncrona — o resultado final chega por webhook) ou failed (ver failure_code/failure_message).

Um failed não é definitivo — chama POST /payment-intents/{id}/reset-method para limpar o método e voltar a confirmar com outro, sem criar um novo intent. Isto é diferente de cancelar (que termina o intent para sempre).

Gerir Payment Intents

Além de criar e confirmar, consulta o histórico de intents, cancela-os definitivamente ou deixa o cliente escolher outro método sem perder o intent.

Listar

Filtra por status, payment_method, from/to (datas) e pagina com limit.

curl "https://api.txenka.com/api/v1/payment-intents?status=succeeded&limit=20" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Consultar um

curl https://api.txenka.com/api/v1/payment-intents/01HX4K9GVZ3QY8N7T2WPJD5R6E \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Cancelar

Termina definitivamente o intent — igual ao PaymentIntent.cancel do Stripe. Uma vez cancelado (ou já succeeded), não há volta atrás — usa reset-method abaixo se só precisas de deixar o cliente tentar outro método.

curl -X POST https://api.txenka.com/api/v1/payment-intents/01HX4K9GVZ3QY8N7T2WPJD5R6E/cancel \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Escolher outro método (reset-method)

Diferente de cancelar: limpa apenas o payment_method da tentativa actual e volta o intent a requires_payment_method, sem terminar o intent nem o seu checkout_url. Útil quando uma tentativa síncrona (mpesa/card) foi recusada, ou uma tentativa manual/assíncrona (transferência bancária, SMS relay) ficou pendente e o cliente desistiu — deixa-o escolher outro método no mesmo link, em vez de teres de criar um novo Payment Intent. Permitido a partir de qualquer estado não-terminal, incluindo failed (uma recusa é para ser retentada); bloqueado só a partir de succeeded/cancelled.

curl -X POST https://api.txenka.com/api/v1/payment-intents/01HX4K9GVZ3QY8N7T2WPJD5R6E/reset-method \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Transacções

Cada tentativa de cobrança contra um Payment Intent gera uma transacção — um intent pode ter várias, se o cliente falhar e tentar de novo.

Listar

curl "https://api.txenka.com/api/v1/transactions?status=succeeded&payment_method=mpesa" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Consultar uma

curl https://api.txenka.com/api/v1/transactions/txn_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."
Response
{
  "object": "transaction",
  "id": "txn_01hx4k9…",
  "payment_intent_id": "01HX4K9GVZ3QY8N7T2WPJD5R6E",
  "amount": 2450,
  "currency": "MZN",
  "status": "succeeded",
  "payment_method": "mpesa",
  "provider_reference": "MP240730.1234.A56789",
  "amount_refunded": 0,
  "is_refundable": true
}

Reembolsos

Reembolsa total ou parcialmente uma transacção bem-sucedida. Para métodos com reversão automática, o estado muda logo; para os manuais (transferência bancária, SMS relay) fica pending até seres notificado por webhook.

Listar

curl https://api.txenka.com/api/v1/refunds \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Criar (numa transacção)

amount é opcional — omitido, reembolsa o total ainda não reembolsado. reason aceita duplicate, fraudulent, requested_by_customer ou other.

curl -X POST https://api.txenka.com/api/v1/transactions/txn_01hx4k9…/refunds \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1000,
    "reason": "requested_by_customer",
    "notes": "Cliente desistiu da encomenda"
  }'

Consultar um

curl https://api.txenka.com/api/v1/refunds/re_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Clientes

Um registo simples do teu cliente — nome, email, telefone — para reutilizares em facturas e para pesquisares o histórico de pagamentos por pessoa.

Listar

curl "https://api.txenka.com/api/v1/customers?search=Ana&limit=25" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Criar

curl -X POST https://api.txenka.com/api/v1/customers \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Ana Machava",
    "email": "ana@example.com",
    "phone": "258840000000",
    "country": "MZ"
  }'

Consultar um

curl https://api.txenka.com/api/v1/customers/cus_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Actualizar

curl -X PATCH https://api.txenka.com/api/v1/customers/cus_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"phone": "258850000000"}'

Eliminar

curl -X DELETE https://api.txenka.com/api/v1/customers/cus_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Produtos

Um catálogo simples para reutilizares em facturas e links de pagamento. Nota: ao contrário de payment_intents, price aqui é um valor decimal na unidade principal (899.90 = 899,90 MZN) — a API converte para centavos internamente.

Listar

curl "https://api.txenka.com/api/v1/products?status=active&search=camisa" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Criar

curl -X POST https://api.txenka.com/api/v1/products \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Camisa polo",
    "price": 899.90,
    "currency": "MZN",
    "sku": "POLO-001"
  }'

Consultar um

curl https://api.txenka.com/api/v1/products/prod_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Actualizar

curl -X PATCH https://api.txenka.com/api/v1/products/prod_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"price": 949.90, "status": "inactive"}'

Eliminar

curl -X DELETE https://api.txenka.com/api/v1/products/prod_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Facturas

Agrega vários line_items num total a cobrar a um cliente, com prazo de pagamento. Mesma convenção decimal dos Produtos para preços/quantidades.

Listar

curl "https://api.txenka.com/api/v1/invoices?status=sent&limit=25" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Criar

O número da factura (INV-2026-0001) é gerado automaticamente. Os totais (subtotal, total) são calculados a partir de line_items, não enviados por ti.

curl -X POST https://api.txenka.com/api/v1/invoices \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "cus_01hx4k9…",
    "issued_at": "2026-07-30",
    "due_at": "2026-08-13",
    "line_items": [
      {"description": "Camisa polo", "quantity": 2, "unit_price": 899.90}
    ]
  }'

Consultar uma

curl https://api.txenka.com/api/v1/invoices/inv_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Actualizar (estado, notas, prazo)

curl -X PATCH https://api.txenka.com/api/v1/invoices/inv_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"status": "paid", "paid_at": "2026-07-30T10:00:00Z"}'

Eliminar

curl -X DELETE https://api.txenka.com/api/v1/invoices/inv_01hx4k9… \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Perfil da Loja

Dados públicos e de contacto da tua conta, e quais métodos de pagamento estão activos e como estão configurados.

Consultar o perfil

curl https://api.txenka.com/api/v1/merchants/me \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Actualizar o perfil

curl -X PATCH https://api.txenka.com/api/v1/merchants/me \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"support_email": "suporte@minhaloja.co.mz", "website": "https://minhaloja.co.mz"}'

Métodos activos

enabled_methods só pode conter métodos já autorizados pela Txenka para a tua conta (ver merchant.payment_methods.authorized na resposta de GET /merchants/me) — usa o endpoint de pedido abaixo para solicitar um novo.

curl -X PATCH https://api.txenka.com/api/v1/merchants/me/payment-methods \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"enabled_methods": ["mpesa", "emola", "card"]}'

Consultar configuração de um método

curl https://api.txenka.com/api/v1/merchants/me/payment-methods/mpesa \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Configurar um método (direct vs custom)

mode: "direct" usa a integração oficial/pooled da Txenka; mode: "custom" usa as tuas próprias credenciais junto do operador/banco (guardadas cifradas). Requer KYC e KYB aprovados.

curl -X PATCH https://api.txenka.com/api/v1/merchants/me/payment-methods/mpesa \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "custom",
    "credentials": {"api_key": "...", "public_key": "..."},
    "enabled": true
  }'

Pedir autorização para um método

Envia um pedido a um administrador para activar um método ainda não autorizado para a tua conta (ex. bank_transfer_atm). Idempotente — repetir o pedido apenas reabre um pedido rejeitado/pendente existente.

curl -X POST https://api.txenka.com/api/v1/merchants/me/payment-methods/bank_transfer_atm/request \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

API Keys

Cria e gere as tuas chaves de API — cada uma com o seu próprio tipo (test/live), scopes e, opcionalmente, whitelist de IPs e expiração.

Listar

curl https://api.txenka.com/api/v1/api-keys \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Criar

O valor completo da chave só é devolvido nesta resposta — guarda-o já, não é possível consultá-lo depois.

curl -X POST https://api.txenka.com/api/v1/api-keys \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Integração e-commerce",
    "type": "test",
    "kind": "secret",
    "scopes": ["payments:read", "payments:write", "payments:confirm"]
  }'

Consultar uma

curl https://api.txenka.com/api/v1/api-keys/17 \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Actualizar (nome, scopes, whitelist de IPs)

curl -X PATCH https://api.txenka.com/api/v1/api-keys/17 \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..." \
  -H "Content-Type: application/json" \
  -d '{"scopes": ["payments:read", "transactions:read"]}'

Revogar

curl -X DELETE https://api.txenka.com/api/v1/api-keys/17 \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Listar scopes disponíveis

Devolve o mesmo catálogo de scopes descrito na secção de Autenticação — útil para construíres a UI de selecção de scopes sem hardcodar a lista.

curl https://api.txenka.com/api/v1/api-keys/scopes \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Catálogo

Referência estática (mas actualizável sem deploy) dos métodos de pagamento, bancos e moedas suportados pela plataforma.

Métodos de pagamento

curl https://api.txenka.com/api/v1/payment-methods \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."
mpesa M-Pesa (Vodacom) — integração directa, requer customer_phone
emola e-Mola (Movitel) — integração directa, requer customer_phone
card Cartão — Visa e Mastercard
bank_transfer_momo Transferência via carteira móvel para conta bancária — requer customer_phone
bank_transfer_b2b Transferência da própria conta bancária do cliente — sem customer_phone
bank_transfer_atm Transferência via multibanco (ATM) — sem customer_phone
mpesa_sms M-Pesa via App Android (SMS relay) — requer customer_phone
emola_sms e-Mola via App Android (SMS relay) — requer customer_phone
mkesh_sms Mkesh (Millennium bim) via App Android — único canal disponível, requer customer_phone

Bancos suportados

curl https://api.txenka.com/api/v1/banks \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Moedas suportadas

curl https://api.txenka.com/api/v1/currencies \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Estatísticas

Resumo de volume, contagens por estado, repartição por método e série diária — os mesmos dados que alimentam o dashboard, para construíres os teus próprios relatórios.

curl "https://api.txenka.com/api/v1/stats?from=2026-07-01&to=2026-07-30&days=30" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Logs de Pedidos

Histórico de pedidos feitos à API com esta conta — método, path, código de estado, corpo do pedido/resposta — útil para depurar uma integração sem teres de reproduzir o pedido.

curl "https://api.txenka.com/api/v1/logs?status=4xx&method=POST&limit=25" \
  -H "Authorization: Bearer txk_test_8f2a3c9d1e..."

Métodos de pagamento

mpesa M-Pesa — carteira móvel Vodacom
emola e-Mola — carteira móvel Movitel
card Cartão — Visa e Mastercard
bank_transfer Transferência bancária

Webhooks

Configura um endpoint em Programadores → Webhooks no dashboard para receberes uma notificação HTTP POST sempre que o estado de um pagamento mudar — sem teres de sondar a API. O secret de assinatura só é mostrado uma vez, na criação — guarda-o logo.

Eventos principais

payment_intent.succeeded

O pagamento foi confirmado com sucesso.

payment_intent.failed

O pagamento falhou ou foi recusado.

payment_intent.cancelled

O Payment Intent foi cancelado.

Erros

Erros seguem sempre o mesmo formato, com um code estável para tratares programaticamente e uma message legível.

Response
{
  "error": {
    "code": "payment_method_disabled",
    "message": "O método de pagamento 'mpesa' não está activo para esta conta."
  }
}

Precisas de ajuda a integrar?

A nossa equipa responde a dúvidas técnicas sobre a API.

Falar com a equipa