Kivora
Endpoints
API v1OpenAPI 3.1

API Reference

Endpoints e schemas para integrar o Kivora Payments por API Key.

Downloads

Descarregue a especificação oficial da API.

Download OpenAPI JSONDownload OpenAPI YAML

Postman e Insomnia estarão disponíveis em breve.

POST/v1/b2c

Enviar dinheiro (B2C)

Realiza um envio de dinheiro para um cliente (Business to Customer). O estado inicial tipicamente é `processing` até o provedor confirmar o payout.

HeaderTipoDescrição
Content-Typeobrigatóriostringapplication/json
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

B2CRequest
CampoTipoDescrição
phonestringNúmero de telemóvel do beneficiário.
amountnumberMontante a enviar.
currencystringMoeda ISO 4217. Predefinição: MZN.
referencestringReferência externa opcional do payout.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "phone",
    "amount"
  ],
  "description": "Pedido para enviar dinheiro a um cliente (Business to Customer).",
  "properties": {
    "phone": {
      "type": "string",
      "description": "Número de telemóvel do beneficiário.",
      "example": "841234567"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Montante a enviar.",
      "example": 100
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional do payout.",
      "example": "PAYOUT-100"
    }
  }
}
json
{
  "phone": "841234567",
  "amount": 100,
  "currency": "MZN",
  "reference": "PAYOUT-100"
}
bash
curl -X POST "https://www.kivorapayments.com/v1/b2c" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"phone":"841234567","amount":100,"currency":"MZN","reference":"PAYOUT-100"}'
B2CResponse
CampoTipoDescrição
idstringIdentificador do envio.
statusstring enumEstado actual do envio.
amountnumber
currencystring
referencestring
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Transacção B2C criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do envio.",
      "example": "out_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "processing",
        "completed",
        "failed",
        "cancelled"
      ],
      "description": "Estado actual do envio.",
      "example": "processing"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "example": "PAYOUT-100"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T16:00:00Z"
    }
  }
}
json
{
  "id": "out_xxxxx",
  "status": "processing",
  "amount": 100,
  "currency": "MZN"
}
CódigoDescrição
400Body inválido — phone e amount são obrigatórios
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Recurso relacionado não encontrado
500Erro interno do servidor
GET/v1/b2c/{transactionId}

Consultar envio B2C

Consulta o estado de um envio de dinheiro. Status possíveis: `processing`, `completed`, `failed`, `cancelled`.

HeaderTipoDescrição
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

ParâmetroTipoDescrição
transactionIdobrigatóriostringIdentificador da transacção B2C.

bash
curl "https://www.kivorapayments.com/v1/b2c/{transactionId}" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json"
B2CResponse
CampoTipoDescrição
idstringIdentificador do envio.
statusstring enumEstado actual do envio.
amountnumber
currencystring
referencestring
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Transacção B2C criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do envio.",
      "example": "out_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "processing",
        "completed",
        "failed",
        "cancelled"
      ],
      "description": "Estado actual do envio.",
      "example": "processing"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "example": "PAYOUT-100"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T16:00:00Z"
    }
  }
}
json
{
  "id": "out_xxxxx",
  "status": "completed",
  "amount": 100,
  "currency": "MZN",
  "createdAt": "2026-07-30T16:00:00Z"
}
CódigoDescrição
400transactionId inválido
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Transacção não encontrada
500Erro interno do servidor
POST/v1/c2b

Iniciar cobrança C2B

Inicia uma cobrança ao cliente (Customer to Business). O pagador recebe um pedido no telemóvel para autorizar o pagamento. O estado inicial é `pending`.

HeaderTipoDescrição
Content-Typeobrigatóriostringapplication/json
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

C2BRequest
CampoTipoDescrição
phonestringNúmero de telemóvel do pagador (MSISDN local, sem +258).
amountnumberMontante a cobrar.
currencystringMoeda ISO 4217. Predefinição: MZN.
referencestringReferência externa opcional (ex.: ID da encomenda).
descriptionstringDescrição legível do pagamento.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "phone",
    "amount"
  ],
  "description": "Pedido para iniciar uma cobrança Customer to Business (C2B).",
  "properties": {
    "phone": {
      "type": "string",
      "description": "Número de telemóvel do pagador (MSISDN local, sem +258).",
      "example": "841234567"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Montante a cobrar.",
      "example": 100
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional (ex.: ID da encomenda).",
      "example": "ORDER-1001"
    },
    "description": {
      "type": "string",
      "description": "Descrição legível do pagamento.",
      "example": "Pagamento da encomenda"
    }
  }
}
json
{
  "phone": "841234567",
  "amount": 100,
  "currency": "MZN",
  "reference": "ORDER-1001",
  "description": "Pagamento da encomenda"
}
bash
curl -X POST "https://www.kivorapayments.com/v1/c2b" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"phone":"841234567","amount":100,"currency":"MZN","reference":"ORDER-1001","description":"Pagamento da encomenda"}'
C2BResponse
CampoTipoDescrição
idstringIdentificador do pagamento.
statusstring enumEstado actual do pagamento.
amountnumber
currencystring
referencestringReferência externa, se fornecida.
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Pagamento C2B criado ou consultado.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do pagamento.",
      "example": "pay_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "processing",
        "paid",
        "failed"
      ],
      "description": "Estado actual do pagamento.",
      "example": "pending"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa, se fornecida.",
      "example": "ORDER-1001"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T15:30:00Z"
    }
  }
}
json
{
  "id": "pay_xxxxx",
  "status": "pending",
  "reference": "ORDER-1001",
  "amount": 100,
  "currency": "MZN"
}
CódigoDescrição
400Body inválido — phone e amount são obrigatórios
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Recurso relacionado não encontrado
500Erro interno do servidor
GET/v1/c2b/{paymentId}

Consultar pagamento C2B

Consulta o estado actual de um pagamento C2B. Status possíveis: `pending`, `processing`, `paid`, `failed`.

HeaderTipoDescrição
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

ParâmetroTipoDescrição
paymentIdobrigatóriostring (uuid)UUID ou identificador do pagamento C2B.

bash
curl "https://www.kivorapayments.com/v1/c2b/{paymentId}" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json"
C2BResponse
CampoTipoDescrição
idstringIdentificador do pagamento.
statusstring enumEstado actual do pagamento.
amountnumber
currencystring
referencestringReferência externa, se fornecida.
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Pagamento C2B criado ou consultado.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do pagamento.",
      "example": "pay_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "processing",
        "paid",
        "failed"
      ],
      "description": "Estado actual do pagamento.",
      "example": "pending"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa, se fornecida.",
      "example": "ORDER-1001"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T15:30:00Z"
    }
  }
}
json
{
  "id": "pay_xxxxx",
  "status": "paid",
  "amount": 100,
  "currency": "MZN",
  "reference": "ORDER-1001",
  "createdAt": "2026-07-30T15:30:00Z"
}
CódigoDescrição
400paymentId inválido
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Pagamento não encontrado
500Erro interno do servidor
POST/v1/subscriptions

Criar assinatura

Cria uma assinatura recorrente para um cliente. A cobrança segue o `interval` indicado (ex.: `monthly`).

HeaderTipoDescrição
Content-Typeobrigatóriostringapplication/json
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

SubscriptionRequest
CampoTipoDescrição
customerCustomer
amountnumberValor cobrado em cada ciclo.
currencystringMoeda ISO 4217. Predefinição: MZN.
intervalstring enumFrequência de cobrança.
referencestringReferência externa opcional da assinatura.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "customer",
    "amount",
    "interval"
  ],
  "description": "Pedido para criar uma assinatura recorrente.",
  "properties": {
    "customer": {
      "$ref": "#/components/schemas/Customer"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Valor cobrado em cada ciclo.",
      "example": 299
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "interval": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly",
        "yearly"
      ],
      "description": "Frequência de cobrança.",
      "example": "monthly"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional da assinatura.",
      "example": "SUB-001"
    }
  }
}
json
{
  "customer": {
    "name": "John Doe",
    "email": "john@example.com"
  },
  "amount": 299,
  "currency": "MZN",
  "interval": "monthly",
  "reference": "SUB-001"
}
bash
curl -X POST "https://www.kivorapayments.com/v1/subscriptions" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"customer":{"name":"John Doe","email":"john@example.com"},"amount":299,"currency":"MZN","interval":"monthly","reference":"SUB-001"}'
SubscriptionResponse
CampoTipoDescrição
idstringIdentificador da assinatura.
statusstring enumEstado da assinatura.
amountnumber
currencystring
intervalstring enum
referencestring
nextBillingDatestring (date)Próxima data de cobrança (YYYY-MM-DD).
customerCustomer
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status"
  ],
  "description": "Assinatura criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador da assinatura.",
      "example": "sub_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "cancelled",
        "past_due",
        "paused"
      ],
      "description": "Estado da assinatura.",
      "example": "active"
    },
    "amount": {
      "type": "number",
      "example": 299
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "interval": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly",
        "yearly"
      ],
      "example": "monthly"
    },
    "reference": {
      "type": "string",
      "example": "SUB-001"
    },
    "nextBillingDate": {
      "type": "string",
      "format": "date",
      "description": "Próxima data de cobrança (YYYY-MM-DD).",
      "example": "2026-08-30"
    },
    "customer": {
      "$ref": "#/components/schemas/Customer"
    }
  }
}
json
{
  "id": "sub_xxxxx",
  "status": "active"
}
CódigoDescrição
400Body inválido — customer, amount e interval são obrigatórios
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Recurso relacionado não encontrado
500Erro interno do servidor
GET/v1/subscriptions/{subscriptionId}

Consultar assinatura

Obtém os detalhes e o estado actual de uma assinatura.

HeaderTipoDescrição
AuthorizationobrigatóriostringBearer sk_live_xxx

Sim (Authorization: Bearer sk_...)

ParâmetroTipoDescrição
subscriptionIdobrigatóriostringIdentificador da assinatura.

bash
curl "https://www.kivorapayments.com/v1/subscriptions/{subscriptionId}" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json"
SubscriptionResponse
CampoTipoDescrição
idstringIdentificador da assinatura.
statusstring enumEstado da assinatura.
amountnumber
currencystring
intervalstring enum
referencestring
nextBillingDatestring (date)Próxima data de cobrança (YYYY-MM-DD).
customerCustomer
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status"
  ],
  "description": "Assinatura criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador da assinatura.",
      "example": "sub_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "cancelled",
        "past_due",
        "paused"
      ],
      "description": "Estado da assinatura.",
      "example": "active"
    },
    "amount": {
      "type": "number",
      "example": 299
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "interval": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly",
        "yearly"
      ],
      "example": "monthly"
    },
    "reference": {
      "type": "string",
      "example": "SUB-001"
    },
    "nextBillingDate": {
      "type": "string",
      "format": "date",
      "description": "Próxima data de cobrança (YYYY-MM-DD).",
      "example": "2026-08-30"
    },
    "customer": {
      "$ref": "#/components/schemas/Customer"
    }
  }
}
json
{
  "id": "sub_xxxxx",
  "status": "active",
  "amount": 299,
  "currency": "MZN",
  "interval": "monthly",
  "nextBillingDate": "2026-08-30"
}
CódigoDescrição
400subscriptionId inválido
401Não autenticado — Secret API Key em falta, inválida, revogada ou expirada
403Sem permissão — a API Key não tem o scope necessário ou o recurso não pertence à organização
404Assinatura não encontrada
500Erro interno do servidor

Webhooks

Eventos enviados automaticamente pela Kivora para o URL configurado no dashboard. Não existem endpoints públicos de gestão — apenas entrega de eventos. Responda com HTTP 2xx para confirmar a recepção.

EVENTpayment.created

payment.created

Disparado quando um pagamento C2B é criado. O estado inicial é tipicamente `pending`.

json
{
  "id": "evt_1a2b3c4d5e",
  "type": "payment.created",
  "created_at": "2026-07-30T15:30:00Z",
  "livemode": false,
  "data": {
    "id": "pay_xxxxx",
    "status": "pending",
    "amount": 100,
    "currency": "MZN",
    "reference": "ORDER-1001",
    "phone": "841234567"
  }
}
EVENTpayment.pending

payment.pending

Disparado quando o pagamento fica a aguardar acção do cliente ou do provedor.

json
{
  "id": "evt_2b3c4d5e6f",
  "type": "payment.pending",
  "created_at": "2026-07-30T15:30:05Z",
  "livemode": false,
  "data": {
    "id": "pay_xxxxx",
    "status": "pending",
    "amount": 100,
    "currency": "MZN",
    "reference": "ORDER-1001"
  }
}
EVENTpayment.completed

payment.completed

Disparado quando o pagamento é confirmado com sucesso (`status: paid`).

json
{
  "id": "evt_3c4d5e6f7a",
  "type": "payment.completed",
  "created_at": "2026-07-30T15:31:00Z",
  "livemode": false,
  "data": {
    "id": "pay_xxxxx",
    "status": "paid",
    "amount": 100,
    "currency": "MZN",
    "reference": "ORDER-1001",
    "paid_at": "2026-07-30T15:31:00Z"
  }
}
EVENTpayment.failed

payment.failed

Disparado quando o pagamento falha (fundos insuficientes, timeout, rejeição, etc.).

json
{
  "id": "evt_4d5e6f7a8b",
  "type": "payment.failed",
  "created_at": "2026-07-30T15:31:10Z",
  "livemode": false,
  "data": {
    "id": "pay_xxxxx",
    "status": "failed",
    "amount": 100,
    "currency": "MZN",
    "reference": "ORDER-1001",
    "failure_reason": "insufficient_funds"
  }
}
EVENTb2c.created

b2c.created

Disparado quando um envio B2C é criado.

json
{
  "id": "evt_5e6f7a8b9c",
  "type": "b2c.created",
  "created_at": "2026-07-30T16:00:00Z",
  "livemode": false,
  "data": {
    "id": "out_xxxxx",
    "status": "processing",
    "amount": 100,
    "currency": "MZN",
    "reference": "PAYOUT-100",
    "phone": "841234567"
  }
}
EVENTb2c.processing

b2c.processing

Disparado enquanto o payout está a ser processado pelo provedor.

json
{
  "id": "evt_6f7a8b9c0d",
  "type": "b2c.processing",
  "created_at": "2026-07-30T16:00:05Z",
  "livemode": false,
  "data": {
    "id": "out_xxxxx",
    "status": "processing",
    "amount": 100,
    "currency": "MZN",
    "reference": "PAYOUT-100"
  }
}
EVENTb2c.completed

b2c.completed

Disparado quando o dinheiro foi entregue com sucesso ao beneficiário.

json
{
  "id": "evt_7a8b9c0d1e",
  "type": "b2c.completed",
  "created_at": "2026-07-30T16:01:00Z",
  "livemode": false,
  "data": {
    "id": "out_xxxxx",
    "status": "completed",
    "amount": 100,
    "currency": "MZN",
    "reference": "PAYOUT-100",
    "completed_at": "2026-07-30T16:01:00Z"
  }
}
EVENTb2c.failed

b2c.failed

Disparado quando o envio B2C falha.

json
{
  "id": "evt_8b9c0d1e2f",
  "type": "b2c.failed",
  "created_at": "2026-07-30T16:01:10Z",
  "livemode": false,
  "data": {
    "id": "out_xxxxx",
    "status": "failed",
    "amount": 100,
    "currency": "MZN",
    "reference": "PAYOUT-100",
    "failure_reason": "invalid_phone"
  }
}
EVENTsubscription.created

subscription.created

Disparado quando uma assinatura é criada com sucesso.

json
{
  "id": "evt_9c0d1e2f3a",
  "type": "subscription.created",
  "created_at": "2026-07-30T17:00:00Z",
  "livemode": false,
  "data": {
    "id": "sub_xxxxx",
    "status": "active",
    "amount": 299,
    "currency": "MZN",
    "interval": "monthly",
    "reference": "SUB-001",
    "customer": {
      "name": "John Doe",
      "email": "john@example.com"
    }
  }
}
EVENTsubscription.cancelled

subscription.cancelled

Disparado quando uma assinatura é cancelada.

json
{
  "id": "evt_0d1e2f3a4b",
  "type": "subscription.cancelled",
  "created_at": "2026-08-15T10:00:00Z",
  "livemode": false,
  "data": {
    "id": "sub_xxxxx",
    "status": "cancelled",
    "amount": 299,
    "currency": "MZN",
    "interval": "monthly",
    "reference": "SUB-001",
    "cancelled_at": "2026-08-15T10:00:00Z"
  }
}
EVENTsubscription.renewed

subscription.renewed

Disparado quando uma assinatura é renovada com sucesso no ciclo de cobrança.

json
{
  "id": "evt_1e2f3a4b5c",
  "type": "subscription.renewed",
  "created_at": "2026-08-30T00:00:00Z",
  "livemode": false,
  "data": {
    "id": "sub_xxxxx",
    "status": "active",
    "amount": 299,
    "currency": "MZN",
    "interval": "monthly",
    "reference": "SUB-001",
    "nextBillingDate": "2026-09-30",
    "payment_id": "pay_renew_xxxxx"
  }
}

Schemas

Estruturas de dados reutilizáveis da API.

B2CRequest
CampoTipoDescrição
phonestringNúmero de telemóvel do beneficiário.
amountnumberMontante a enviar.
currencystringMoeda ISO 4217. Predefinição: MZN.
referencestringReferência externa opcional do payout.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "phone",
    "amount"
  ],
  "description": "Pedido para enviar dinheiro a um cliente (Business to Customer).",
  "properties": {
    "phone": {
      "type": "string",
      "description": "Número de telemóvel do beneficiário.",
      "example": "841234567"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Montante a enviar.",
      "example": 100
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional do payout.",
      "example": "PAYOUT-100"
    }
  }
}
B2CResponse
CampoTipoDescrição
idstringIdentificador do envio.
statusstring enumEstado actual do envio.
amountnumber
currencystring
referencestring
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Transacção B2C criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do envio.",
      "example": "out_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "processing",
        "completed",
        "failed",
        "cancelled"
      ],
      "description": "Estado actual do envio.",
      "example": "processing"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "example": "PAYOUT-100"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T16:00:00Z"
    }
  }
}
C2BRequest
CampoTipoDescrição
phonestringNúmero de telemóvel do pagador (MSISDN local, sem +258).
amountnumberMontante a cobrar.
currencystringMoeda ISO 4217. Predefinição: MZN.
referencestringReferência externa opcional (ex.: ID da encomenda).
descriptionstringDescrição legível do pagamento.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "phone",
    "amount"
  ],
  "description": "Pedido para iniciar uma cobrança Customer to Business (C2B).",
  "properties": {
    "phone": {
      "type": "string",
      "description": "Número de telemóvel do pagador (MSISDN local, sem +258).",
      "example": "841234567"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Montante a cobrar.",
      "example": 100
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional (ex.: ID da encomenda).",
      "example": "ORDER-1001"
    },
    "description": {
      "type": "string",
      "description": "Descrição legível do pagamento.",
      "example": "Pagamento da encomenda"
    }
  }
}
C2BResponse
CampoTipoDescrição
idstringIdentificador do pagamento.
statusstring enumEstado actual do pagamento.
amountnumber
currencystring
referencestringReferência externa, se fornecida.
createdAtstring (date-time)Data de criação (presente em consultas GET).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status",
    "amount",
    "currency"
  ],
  "description": "Pagamento C2B criado ou consultado.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador do pagamento.",
      "example": "pay_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "processing",
        "paid",
        "failed"
      ],
      "description": "Estado actual do pagamento.",
      "example": "pending"
    },
    "amount": {
      "type": "number",
      "example": 100
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa, se fornecida.",
      "example": "ORDER-1001"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "description": "Data de criação (presente em consultas GET).",
      "example": "2026-07-30T15:30:00Z"
    }
  }
}
Customer
CampoTipoDescrição
namestringNome completo do cliente.
emailstring (email)Email do cliente.
phonestringNúmero de telemóvel (opcional).
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "email"
  ],
  "description": "Dados do cliente associado a uma assinatura ou pagamento.",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nome completo do cliente.",
      "example": "John Doe"
    },
    "email": {
      "type": "string",
      "format": "email",
      "description": "Email do cliente.",
      "example": "john@example.com"
    },
    "phone": {
      "type": "string",
      "description": "Número de telemóvel (opcional).",
      "example": "841234567"
    }
  }
}
ErrorResponse
CampoTipoDescrição
errorobject
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "error"
  ],
  "description": "Resposta de erro padrão da API pública.",
  "properties": {
    "error": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "Código de erro estável.",
          "example": "PAYMENT_PROCESSING_ERROR"
        },
        "message": {
          "type": "string",
          "description": "Mensagem legível para o cliente.",
          "example": "Unable to process payment."
        }
      }
    }
  }
}
Money
CampoTipoDescrição
amountnumberValor na unidade principal da moeda (ex.: 100 = 100 MZN).
currencystringCódigo ISO 4217 da moeda.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "amount",
    "currency"
  ],
  "description": "Montante monetário com moeda ISO 4217.",
  "properties": {
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Valor na unidade principal da moeda (ex.: 100 = 100 MZN).",
      "example": 100
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Código ISO 4217 da moeda.",
      "example": "MZN"
    }
  }
}
SubscriptionRequest
CampoTipoDescrição
customerCustomer
amountnumberValor cobrado em cada ciclo.
currencystringMoeda ISO 4217. Predefinição: MZN.
intervalstring enumFrequência de cobrança.
referencestringReferência externa opcional da assinatura.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "customer",
    "amount",
    "interval"
  ],
  "description": "Pedido para criar uma assinatura recorrente.",
  "properties": {
    "customer": {
      "$ref": "#/components/schemas/Customer"
    },
    "amount": {
      "type": "number",
      "minimum": 0,
      "description": "Valor cobrado em cada ciclo.",
      "example": 299
    },
    "currency": {
      "type": "string",
      "minLength": 3,
      "maxLength": 3,
      "default": "MZN",
      "description": "Moeda ISO 4217. Predefinição: MZN.",
      "example": "MZN"
    },
    "interval": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly",
        "yearly"
      ],
      "description": "Frequência de cobrança.",
      "example": "monthly"
    },
    "reference": {
      "type": "string",
      "description": "Referência externa opcional da assinatura.",
      "example": "SUB-001"
    }
  }
}
SubscriptionResponse
CampoTipoDescrição
idstringIdentificador da assinatura.
statusstring enumEstado da assinatura.
amountnumber
currencystring
intervalstring enum
referencestring
nextBillingDatestring (date)Próxima data de cobrança (YYYY-MM-DD).
customerCustomer
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "status"
  ],
  "description": "Assinatura criada ou consultada.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador da assinatura.",
      "example": "sub_xxxxx"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "cancelled",
        "past_due",
        "paused"
      ],
      "description": "Estado da assinatura.",
      "example": "active"
    },
    "amount": {
      "type": "number",
      "example": 299
    },
    "currency": {
      "type": "string",
      "example": "MZN"
    },
    "interval": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly",
        "yearly"
      ],
      "example": "monthly"
    },
    "reference": {
      "type": "string",
      "example": "SUB-001"
    },
    "nextBillingDate": {
      "type": "string",
      "format": "date",
      "description": "Próxima data de cobrança (YYYY-MM-DD).",
      "example": "2026-08-30"
    },
    "customer": {
      "$ref": "#/components/schemas/Customer"
    }
  }
}
WebhookEvent
CampoTipoDescrição
idstringIdentificador único do evento.
typestring enumTipo do evento.
created_atstring (date-time)Momento em que o evento foi gerado (UTC).
livemodeboolean`true` se o evento ocorreu em modo live; `false` em modo test.
dataobjectObjecto com os dados do recurso associado ao evento.
json
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "id",
    "type",
    "created_at",
    "livemode",
    "data"
  ],
  "description": "Payload enviado pela Kivora ao URL de webhook configurado no dashboard.",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identificador único do evento.",
      "example": "evt_1a2b3c4d5e"
    },
    "type": {
      "type": "string",
      "enum": [
        "payment.created",
        "payment.pending",
        "payment.completed",
        "payment.failed",
        "b2c.created",
        "b2c.processing",
        "b2c.completed",
        "b2c.failed",
        "subscription.created",
        "subscription.cancelled",
        "subscription.renewed"
      ],
      "description": "Tipo do evento.",
      "example": "payment.completed"
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Momento em que o evento foi gerado (UTC).",
      "example": "2026-07-30T15:31:00Z"
    },
    "livemode": {
      "type": "boolean",
      "description": "`true` se o evento ocorreu em modo live; `false` em modo test.",
      "example": false
    },
    "data": {
      "type": "object",
      "additionalProperties": true,
      "description": "Objecto com os dados do recurso associado ao evento.",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "amount": {
          "type": "number"
        },
        "currency": {
          "type": "string"
        },
        "reference": {
          "type": "string"
        }
      }
    }
  }
}