openapi: 3.0.3 info: title: 'ClicPay API Documentation' description: 'API ClicPay v2 - M-Pesa, e-Mola, NetShop e autenticação' version: 1.0.0 servers: - url: 'https://clicpay.co.mz' tags: - name: 'Transações M-Pesa' description: '' - name: 'Transações eMola' description: '' - name: 'Transações Mkesh' description: '' - name: 'Transações NetShop' description: '' - name: 'Estado de Transações' description: '' - name: Carteiras description: '' - name: Autenticação description: '' - name: 'Carteiras e Subcarteiras' description: '' - name: 'Transações M-Pesa — B2C via Split' description: '' - name: 'Transações Mkesh — B2C via Split' description: '' - name: 'Transações eMola — B2C via Split' description: '' - name: 'Transações — Split Collect' description: '' components: securitySchemes: default: type: http scheme: bearer description: 'Para testar a API, insira seu token Bearer no campo "Authorize". Você pode obter um token através do endpoint de autenticação da API.' security: - default: [] paths: '/api/v2/wallets/{wallet_id}/c2b/mpesa': post: summary: '' operationId: postApiV2WalletsWallet_idC2bMpesa description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYMPSESC2BABCDE12345 status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYMPSESC2BABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.wallet_split_id: - 'O split não pertence a esta carteira ou não é dynamic_load.' properties: errors: type: object properties: splits.0.wallet_split_id: type: array example: - 'O split não pertence a esta carteira ou não é dynamic_load.' items: type: string tags: - 'Transações M-Pesa' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira M-Pesa.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/c2b/mpesa/direct': post: summary: '' operationId: postApiV2WalletsWallet_idC2bMpesaDirect description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYMPSESC2BABCDE12345 status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYMPSESC2BABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.value_type: - 'O campo value_type deve ser percentage ou amount.' properties: errors: type: object properties: splits.0.value_type: type: array example: - 'O campo value_type deve ser percentage ou amount.' items: type: string tags: - 'Transações M-Pesa' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira M-Pesa.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/b2c/mpesa': post: summary: '' operationId: postApiV2WalletsWallet_idB2cMpesa description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CP123456789 status: pending transaction_id: 124 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CP123456789 description: 'Referência única da transação' status: type: string example: pending description: 'Status atual (pending/successful/failed)' transaction_id: type: integer example: 124 description: 'ID interno da transação' 400: description: '' content: application/json: schema: type: object example: errors: msisdn: - 'Número de telefone inválido' amount: - 'Valor deve ser entre 1 e 50000' properties: errors: type: object properties: msisdn: type: array example: - 'Número de telefone inválido' items: type: string amount: type: array example: - 'Valor deve ser entre 1 e 50000' items: type: string 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'Acesso negado à carteira' properties: message: type: string example: 'Acesso negado à carteira' tags: - 'Transações M-Pesa' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número de telefone' example: '841234567' amount: type: number description: 'Valor da transação (1-50000)' example: 500.0 reference_description: type: string description: 'Descrição da referência (3-32 caracteres)' example: 'Compra online' internal_notes: type: string description: 'optional Notas internas (máx 255 caracteres)' example: 'Pedido #12345' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/c2b/emola': post: summary: '' operationId: postApiV2WalletsWallet_idC2bEmola description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYEMOLAC2BABCDE12345 status: pending transaction_id: 789 provider_reference: null provider_response_code: '0' split_summary: direct: - wallet_split_id: 42 mode: b2c_direct allocated: 300.0 recipients: - msisdn: '841234567' amount: 300.0 collect: - wallet_split_id: 43 mode: wallet_collect allocated: 200.0 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYEMOLAC2BABCDE12345 description: 'Referência única da transação ClicPay.' status: type: string example: pending description: 'Estado actual: `pending` | `successful` | `failed`.' transaction_id: type: integer example: 789 provider_reference: type: string example: null nullable: true provider_response_code: type: string example: '0' split_summary: type: object properties: direct: type: array example: - wallet_split_id: 42 mode: b2c_direct allocated: 300 recipients: - msisdn: '841234567' amount: 300 items: type: object properties: wallet_split_id: type: integer example: 42 mode: type: string example: b2c_direct allocated: type: number example: 300.0 recipients: type: array example: - msisdn: '841234567' amount: 300 items: type: object properties: msisdn: type: string example: '841234567' amount: type: number example: 300.0 collect: type: array example: - wallet_split_id: 43 mode: wallet_collect allocated: 200 items: type: object properties: wallet_split_id: type: integer example: 43 mode: type: string example: wallet_collect allocated: type: number example: 200.0 description: 'Presente quando splits[] foi enviado. `direct` lista B2C imediatos; `collect` lista acumulações. Splits ignorados (inactivos, limite atingido) não aparecem.' 400: description: '' content: application/json: schema: type: object example: message: 'Erro do provedor' clicpay_reference: CPAY... status: failed properties: message: type: string example: 'Erro do provedor' clicpay_reference: type: string example: CPAY... description: 'Referência única da transação ClicPay.' status: type: string example: failed description: 'Estado actual: `pending` | `successful` | `failed`.' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'Sem acesso à carteira ou carteira inactiva.' properties: message: type: string example: 'Sem acesso à carteira ou carteira inactiva.' 422: description: '' content: application/json: schema: type: object example: errors: splits.0.wallet_split_id: - 'O split não pertence a esta carteira ou não é dynamic_load.' properties: errors: type: object properties: splits.0.wallet_split_id: type: array example: - 'O split não pertence a esta carteira ou não é dynamic_load.' items: type: string tags: - 'Transações eMola' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira eMola.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/c2b/emola/direct': post: summary: '' operationId: postApiV2WalletsWallet_idC2bEmolaDirect description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYEMOLAC2BABCDE12345 status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYEMOLAC2BABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.value_type: - 'O campo value_type deve ser percentage ou amount.' properties: errors: type: object properties: splits.0.value_type: type: array example: - 'O campo value_type deve ser percentage ou amount.' items: type: string tags: - 'Transações eMola' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira eMola.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/b2c/emola': post: summary: '' operationId: postApiV2WalletsWallet_idB2cEmola description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CP123456789 status: pending transaction_id: 123 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CP123456789 description: 'Referência única da transação' status: type: string example: pending description: 'Status atual (pending/successful/failed)' transaction_id: type: integer example: 123 description: 'ID interno da transação' 400: description: '' content: application/json: schema: type: object example: errors: msisdn: - 'Número de telefone inválido' amount: - 'Valor deve ser entre 1 e 50000' properties: errors: type: object properties: msisdn: type: array example: - 'Número de telefone inválido' items: type: string amount: type: array example: - 'Valor deve ser entre 1 e 50000' items: type: string 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'Acesso negado à carteira' properties: message: type: string example: 'Acesso negado à carteira' tags: - 'Transações eMola' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número de telefone' example: '841234567' amount: type: number description: 'Valor da transação (1-50000)' example: 1000.0 reference_description: type: string description: 'Descrição da referência (3-32 caracteres)' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx 255 caracteres)' example: 'Pagamento mensal' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/c2b/mkesh': post: summary: '' operationId: postApiV2WalletsWallet_idC2bMkesh description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYKMESHC2BABCDE12345 status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYKMESHC2BABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.wallet_split_id: - 'O split não pertence a esta carteira ou não é dynamic_load.' properties: errors: type: object properties: splits.0.wallet_split_id: type: array example: - 'O split não pertence a esta carteira ou não é dynamic_load.' items: type: string tags: - 'Transações Mkesh' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira Mkesh.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/c2b/mkesh/direct': post: summary: '' operationId: postApiV2WalletsWallet_idC2bMkeshDirect description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYKMESHC2BABCDE12345 status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYKMESHC2BABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.value_type: - 'O campo value_type deve ser percentage ou amount.' properties: errors: type: object properties: splits.0.value_type: type: array example: - 'O campo value_type deve ser percentage ou amount.' items: type: string tags: - 'Transações Mkesh' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas para sub-carteiras do tipo dynamic_load desta carteira. Opcional — omitir mantém o comportamento normal.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira Mkesh.' example: 12 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/b2c/mkesh': post: summary: '' operationId: postApiV2WalletsWallet_idB2cMkesh description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CP123456789 status: pending transaction_id: 124 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CP123456789 description: 'Referência única da transação' status: type: string example: pending description: 'Status atual (pending/successful/failed)' transaction_id: type: integer example: 124 description: 'ID interno da transação' 400: description: '' content: application/json: schema: type: object example: errors: msisdn: - 'Número de telefone inválido' amount: - 'Valor deve ser entre 1 e 50000' properties: errors: type: object properties: msisdn: type: array example: - 'Número de telefone inválido' items: type: string amount: type: array example: - 'Valor deve ser entre 1 e 50000' items: type: string 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'Acesso negado à carteira' properties: message: type: string example: 'Acesso negado à carteira' tags: - 'Transações Mkesh' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número de telefone' example: '841234567' amount: type: number description: 'Valor da transação (1-50000)' example: 500.0 reference_description: type: string description: 'Descrição da referência (3-32 caracteres)' example: 'Compra online' internal_notes: type: string description: 'optional Notas internas (máx 255 caracteres)' example: 'Pedido #12345' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/card-payment': post: summary: '' operationId: postApiV2WalletsWallet_idCardPayment description: '' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: 'Sessão criada.' clicpay_reference: '123456789' status: pending provider_reference: '123456789' provider_response_code: '200' provider_status_text: Pending initiated_at: '2023-01-01T00:00:00Z' completed_at: null transaction_id: 123 checkout_url: 'https://netshop.example.com/checkout/abc123' session_id: abc123 success_indicator: indicator123 properties: message: type: string example: 'Sessão criada.' description: 'Mensagem descritiva do status' clicpay_reference: type: string example: '123456789' description: 'Referência única da transação' status: type: string example: pending description: 'Status atual (pending/successful/failed)' provider_reference: type: string example: '123456789' description: 'Referência do provedor de pagamento' provider_response_code: type: string example: '200' description: 'Código de resposta do provedor' provider_status_text: type: string example: Pending description: 'Descrição do status do provedor' initiated_at: type: string example: '2023-01-01T00:00:00Z' description: 'Data e hora de início da transação (ISO 8601)' completed_at: type: string example: null description: 'Data e hora de conclusão da transação (ISO 8601)' transaction_id: type: integer example: 123 description: 'ID interno da transação' checkout_url: type: string example: 'https://netshop.example.com/checkout/abc123' description: 'URL do checkout NetShop' session_id: type: string example: abc123 description: 'ID da sessão NetShop' success_indicator: type: string example: indicator123 description: 'Indicador de sucesso da sessão NetShop' 400: description: '' content: application/json: schema: type: object example: message: 'Erro ao criar a sessão.' clicpay_reference: '123456789' status: failed transaction_id: 123 provider_response_code: '400' properties: message: type: string example: 'Erro ao criar a sessão.' description: 'Mensagem descritiva do status' clicpay_reference: type: string example: '123456789' description: 'Referência única da transação' status: type: string example: failed description: 'Status atual (pending/successful/failed)' transaction_id: type: integer example: 123 description: 'ID interno da transação' provider_response_code: type: string example: '400' description: 'Código de resposta do provedor' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. description: 'Mensagem descritiva do status' 403: description: '' content: application/json: schema: type: object example: message: 'Acesso negado à carteira' properties: message: type: string example: 'Acesso negado à carteira' description: 'Mensagem descritiva do status' 422: description: '' content: application/json: schema: type: object example: errors: amount: - 'O campo valor é obrigatório.' reference_description: - 'O campo descrição da referência é obrigatório.' properties: errors: type: object properties: amount: type: array example: - 'O campo valor é obrigatório.' items: type: string reference_description: type: array example: - 'O campo descrição da referência é obrigatório.' items: type: string tags: - 'Transações NetShop' requestBody: required: true content: application/json: schema: type: object properties: amount: type: number description: 'Valor do pagamento' example: 1500.0 reference_description: type: string description: 'Descrição da referência (máx 100 caracteres)' example: 'Pagamento de fatura' first_name: type: string description: 'optional Primeiro nome do pagador' example: João nullable: true last_name: type: string description: 'optional Último nome do pagador' example: Silva nullable: true email: type: string description: 'optional Email do pagador' example: QYvHk@example.com nullable: true phone: type: string description: 'optional Telefone do pagador' example: '84 123 4567' nullable: true callback_url: type: url description: 'optional URL de retorno' example: 'https://example.com/callback' nullable: true required: - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira NetShop' example: 1234 required: true schema: type: integer '/api/v2/transactions/{clicpay_reference}/status': get: summary: '' operationId: getApiV2TransactionsClicpay_referenceStatus description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: clicpay_reference: CP123456789 status: successful amount: 1000.0 message: 'Transação concluída com sucesso' properties: clicpay_reference: type: string example: CP123456789 description: 'Referência da transação' status: type: string example: successful description: 'Status atual (pending/successful/failed/cancelled)' amount: type: number example: 1000.0 description: 'Valor da transação' message: type: string example: 'Transação concluída com sucesso' description: 'Mensagem descritiva do status' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. description: 'Mensagem descritiva do status' 404: description: '' content: application/json: schema: type: object example: message: 'Transação não encontrada' properties: message: type: string example: 'Transação não encontrada' description: 'Mensagem descritiva do status' tags: - 'Estado de Transações' parameters: - in: path name: clicpay_reference description: 'Referência ClicPay da transação.' example: CP123456789 required: true schema: type: string /api/v2/me/wallets: get: summary: '' operationId: getApiV2MeWallets description: '' parameters: - in: query name: payment_method_id description: 'optional Filtrar por método de pagamento' example: 1 required: false schema: type: integer description: 'optional Filtrar por método de pagamento' example: 1 - in: query name: is_active description: 'optional Filtrar por status ativo' example: true required: false schema: type: boolean description: 'optional Filtrar por status ativo' example: true - in: query name: environment description: 'optional Filtrar por ambiente (sandbox/production)' example: production required: false schema: type: string description: 'optional Filtrar por ambiente (sandbox/production)' example: production - in: query name: include description: 'optional Incluir relacionamentos (ex: paymentMethod)' example: paymentMethod required: false schema: type: string description: 'optional Incluir relacionamentos (ex: paymentMethod)' example: paymentMethod - in: query name: sort_by description: 'optional Ordenar por campo (id, name, balance, created_at)' example: created_at required: false schema: type: string description: 'optional Ordenar por campo (id, name, balance, created_at)' example: created_at - in: query name: sort_order description: 'optional Ordem da ordenação (asc, desc)' example: desc required: false schema: type: string description: 'optional Ordem da ordenação (asc, desc)' example: desc - in: query name: per_page description: 'optional Itens por página (padrão: 10)' example: 20 required: false schema: type: integer description: 'optional Itens por página (padrão: 10)' example: 20 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1 name: 'Minha Carteira' balance: 1000.0 payment_method: id: 1 name: eMola slug: emola links: first: ... last: ... prev: null next: null meta: current_page: 1 from: 1 last_page: 1 per_page: 20 to: 1 total: 1 properties: data: type: array example: - id: 1 name: 'Minha Carteira' balance: 1000 payment_method: id: 1 name: eMola slug: emola description: 'Lista de carteiras' items: type: object properties: id: type: integer example: 1 name: type: string example: 'Minha Carteira' balance: type: number example: 1000.0 payment_method: type: object properties: id: type: integer example: 1 name: type: string example: eMola slug: type: string example: emola links: type: object properties: first: type: string example: ... last: type: string example: ... prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 per_page: type: integer example: 20 to: type: integer example: 1 total: type: integer example: 1 tags: - Carteiras /api/user: get: summary: 'Obter utilizador autenticado' operationId: obterUtilizadorAutenticado description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Autenticação /api/me/token: get: summary: 'Obter token de acesso' operationId: obterTokenDeAcesso description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Autenticação /api/v2/wallets: get: summary: "Listar carteiras do parceiro.\n\nDevolve as carteiras a que o utilizador autenticado tem acesso\n(carteiras pessoais + carteiras das organizações em que é membro)." operationId: listarCarteirasDoParceiroDevolveAsCarteirasAQueOUtilizadorAutenticadoTemAcessocarteirasPessoais+CarteirasDasOrganizaesEmQueMembro description: '' parameters: - in: query name: 'filter[is_active]' description: 'Filtra por estado activo.' example: true required: false schema: type: boolean description: 'Filtra por estado activo.' example: true - in: query name: 'filter[payment_method_id]' description: 'ID do método de pagamento.' example: 1 required: false schema: type: integer description: 'ID do método de pagamento.' example: 1 - in: query name: 'filter[environment]' description: '`production` ou `sandbox`.' example: production required: false schema: type: string description: '`production` ou `sandbox`.' example: production - in: query name: 'filter[search]' description: 'Pesquisa parcial no nome.' example: minha required: false schema: type: string description: 'Pesquisa parcial no nome.' example: minha - in: query name: sort description: 'Ordenação (`created_at`, `-created_at`, `name`, `-name`).' example: '-created_at' required: false schema: type: string description: 'Ordenação (`created_at`, `-created_at`, `name`, `-name`).' example: '-created_at' - in: query name: per_page description: 'Itens por página (1-100).' example: 20 required: false schema: type: integer description: 'Itens por página (1-100).' example: 20 - in: query name: page description: 'Número da página.' example: 1 required: false schema: type: integer description: 'Número da página.' example: 1 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 123 name: 'Carteira Mpesa Principal' environment: production is_active: true allow_c2b: true allow_b2c: true currency: MZN payment_method: id: 1 name: Mpesa slug: mpesa owner: type: organization id: 5 name: 'Acme Lda' balance: available: '1500.00' accumulated: '2000.00' commission: c2b_percentage: '1.5000' b2c_percentage: '1.0000' created_at: '2026-01-15T10:30:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' meta: pagination: type: offset per_page: 20 count: 1 current_page: 1 last_page: 1 from: 1 to: 1 total: 1 properties: data: type: array example: - id: 123 name: 'Carteira Mpesa Principal' environment: production is_active: true allow_c2b: true allow_b2c: true currency: MZN payment_method: id: 1 name: Mpesa slug: mpesa owner: type: organization id: 5 name: 'Acme Lda' balance: available: '1500.00' accumulated: '2000.00' commission: c2b_percentage: '1.5000' b2c_percentage: '1.0000' created_at: '2026-01-15T10:30:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' items: type: object properties: id: type: integer example: 123 name: type: string example: 'Carteira Mpesa Principal' environment: type: string example: production is_active: type: boolean example: true allow_c2b: type: boolean example: true allow_b2c: type: boolean example: true currency: type: string example: MZN payment_method: type: object properties: id: type: integer example: 1 name: type: string example: Mpesa slug: type: string example: mpesa owner: type: object properties: type: type: string example: organization id: type: integer example: 5 name: type: string example: 'Acme Lda' balance: type: object properties: available: type: string example: '1500.00' accumulated: type: string example: '2000.00' commission: type: object properties: c2b_percentage: type: string example: '1.5000' b2c_percentage: type: string example: '1.0000' created_at: type: string example: '2026-01-15T10:30:00+00:00' updated_at: type: string example: '2026-06-01T08:12:33+00:00' meta: type: object properties: pagination: type: object properties: type: type: string example: offset per_page: type: integer example: 20 count: type: integer example: 1 current_page: type: integer example: 1 last_page: type: integer example: 1 from: type: integer example: 1 to: type: integer example: 1 total: type: integer example: 1 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: message: 'Sort inválido.' errors: sort: - 'Ordenação inválida...' properties: message: type: string example: 'Sort inválido.' errors: type: object properties: sort: type: array example: - 'Ordenação inválida...' items: type: string tags: - 'Carteiras e Subcarteiras' requestBody: required: false content: application/json: schema: type: object properties: filter: type: object description: '' example: null properties: is_active: type: boolean description: '' example: false payment_method_id: type: integer description: 'The id of an existing record in the payment_methods table.' example: 16 environment: type: string description: '' example: sandbox enum: - production - sandbox search: type: string description: 'Must not be greater than 100 characters.' example: 'n' sort: type: string description: '' example: '-name' enum: - created_at - '-created_at' - name - '-name' per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 7 page: type: integer description: 'Must be at least 1.' example: 66 '/api/v2/wallets/{id}': get: summary: 'Detalhe de uma carteira.' operationId: detalheDeUmaCarteira description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 123 name: 'Carteira Mpesa Principal' environment: production is_active: true allow_c2b: true allow_b2c: true currency: MZN payment_method: id: 1 name: Mpesa slug: mpesa owner: type: organization id: 5 name: 'Acme Lda' balance: available: '1500.00' accumulated: '2000.00' commission: c2b_percentage: '1.5000' b2c_percentage: '1.0000' created_at: '2026-01-15T10:30:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' properties: data: type: object properties: id: type: integer example: 123 name: type: string example: 'Carteira Mpesa Principal' environment: type: string example: production is_active: type: boolean example: true allow_c2b: type: boolean example: true allow_b2c: type: boolean example: true currency: type: string example: MZN payment_method: type: object properties: id: type: integer example: 1 name: type: string example: Mpesa slug: type: string example: mpesa owner: type: object properties: type: type: string example: organization id: type: integer example: 5 name: type: string example: 'Acme Lda' balance: type: object properties: available: type: string example: '1500.00' accumulated: type: string example: '2000.00' commission: type: object properties: c2b_percentage: type: string example: '1.5000' b2c_percentage: type: string example: '1.0000' created_at: type: string example: '2026-01-15T10:30:00+00:00' updated_at: type: string example: '2026-06-01T08:12:33+00:00' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 404: description: '' content: application/json: schema: type: object example: message: 'No query results for model [App\Models\Wallet].' properties: message: type: string example: 'No query results for model [App\Models\Wallet].' tags: - 'Carteiras e Subcarteiras' parameters: - in: path name: id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira.' example: 123 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/balance': get: summary: "Saldo de uma carteira.\n\nEndpoint dedicado e leve. Resposta é cacheada por 60 segundos por\ncarteira — ideal para dashboards e polling de reconciliação." operationId: saldoDeUmaCarteiraEndpointDedicadoELeveRespostaCacheadaPor60SegundosPorCarteiraIdealParaDashboardsEPollingDeReconciliao description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: wallet_id: 123 currency: MZN available: '1500.00' accumulated: '2000.00' debits: '500.00' computed_at: '2026-06-03T15:42:11+00:00' properties: data: type: object properties: wallet_id: type: integer example: 123 currency: type: string example: MZN available: type: string example: '1500.00' accumulated: type: string example: '2000.00' debits: type: string example: '500.00' computed_at: type: string example: '2026-06-03T15:42:11+00:00' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 404: description: '' content: application/json: schema: type: object example: message: 'No query results for model [App\Models\Wallet].' properties: message: type: string example: 'No query results for model [App\Models\Wallet].' tags: - 'Carteiras e Subcarteiras' parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira.' example: 123 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits': get: summary: 'Listar subcarteiras (splits) de uma carteira.' operationId: listarSubcarteirassplitsDeUmaCarteira description: '' parameters: - in: query name: 'filter[is_active]' description: 'Filtra por estado.' example: true required: false schema: type: boolean description: 'Filtra por estado.' example: true - in: query name: 'filter[split_mode]' description: 'Filtra por modo (`wallet_collect`, `b2c_direct`, `dynamic_load`).' example: wallet_collect required: false schema: type: string description: 'Filtra por modo (`wallet_collect`, `b2c_direct`, `dynamic_load`).' example: wallet_collect - in: query name: 'filter[search]' description: 'Pesquisa parcial no nome.' example: split-a required: false schema: type: string description: 'Pesquisa parcial no nome.' example: split-a - in: query name: sort description: 'Ordenação (`created_at`, `-created_at`, `name`, `-name`).' example: '-created_at' required: false schema: type: string description: 'Ordenação (`created_at`, `-created_at`, `name`, `-name`).' example: '-created_at' - in: query name: per_page description: 'Itens por página (1-100).' example: 20 required: false schema: type: integer description: 'Itens por página (1-100).' example: 20 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 100001 name: 'Split Marketing' wallet_id: 123 environment: production is_active: true allow_b2c: true currency: MZN split_mode: wallet_collect split_value_type: percentage split_value: '30.0000' advanced_enabled: false max_amount: null balance: available: '750.00' accumulated: '900.00' debits: '150.00' created_at: '2026-02-10T09:00:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' meta: pagination: type: offset per_page: 20 count: 1 current_page: 1 last_page: 1 from: 1 to: 1 total: 1 properties: data: type: array example: - id: 100001 name: 'Split Marketing' wallet_id: 123 environment: production is_active: true allow_b2c: true currency: MZN split_mode: wallet_collect split_value_type: percentage split_value: '30.0000' advanced_enabled: false max_amount: null balance: available: '750.00' accumulated: '900.00' debits: '150.00' created_at: '2026-02-10T09:00:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' items: type: object properties: id: type: integer example: 100001 name: type: string example: 'Split Marketing' wallet_id: type: integer example: 123 environment: type: string example: production is_active: type: boolean example: true allow_b2c: type: boolean example: true currency: type: string example: MZN split_mode: type: string example: wallet_collect split_value_type: type: string example: percentage split_value: type: string example: '30.0000' advanced_enabled: type: boolean example: false max_amount: type: string example: null nullable: true balance: type: object properties: available: type: string example: '750.00' accumulated: type: string example: '900.00' debits: type: string example: '150.00' created_at: type: string example: '2026-02-10T09:00:00+00:00' updated_at: type: string example: '2026-06-01T08:12:33+00:00' meta: type: object properties: pagination: type: object properties: type: type: string example: offset per_page: type: integer example: 20 count: type: integer example: 1 current_page: type: integer example: 1 last_page: type: integer example: 1 from: type: integer example: 1 to: type: integer example: 1 total: type: integer example: 1 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 404: description: '' content: application/json: schema: type: object example: message: 'No query results for model [App\Models\Wallet].' properties: message: type: string example: 'No query results for model [App\Models\Wallet].' tags: - 'Carteiras e Subcarteiras' requestBody: required: false content: application/json: schema: type: object properties: filter: type: object description: '' example: null properties: is_active: type: boolean description: '' example: true split_mode: type: string description: '' example: wallet_collect enum: - wallet_collect - b2c_direct - dynamic_load search: type: string description: 'Must not be greater than 100 characters.' example: b sort: type: string description: '' example: '-created_at' enum: - created_at - '-created_at' - name - '-name' per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira mãe.' example: 123 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}': get: summary: 'Detalhe de uma subcarteira.' operationId: detalheDeUmaSubcarteira description: '' parameters: [] responses: 200: description: Sucesso content: application/json: schema: type: object example: data: id: 100001 name: 'Split Marketing' wallet_id: 123 environment: production is_active: true allow_b2c: true currency: MZN split_mode: wallet_collect split_value_type: percentage split_value: '30.0000' advanced_enabled: false max_amount: null balance: available: '750.00' accumulated: '900.00' debits: '150.00' created_at: '2026-02-10T09:00:00+00:00' updated_at: '2026-06-01T08:12:33+00:00' properties: data: type: object properties: id: type: integer example: 100001 name: type: string example: 'Split Marketing' wallet_id: type: integer example: 123 environment: type: string example: production is_active: type: boolean example: true allow_b2c: type: boolean example: true currency: type: string example: MZN split_mode: type: string example: wallet_collect split_value_type: type: string example: percentage split_value: type: string example: '30.0000' advanced_enabled: type: boolean example: false max_amount: type: string example: null nullable: true balance: type: object properties: available: type: string example: '750.00' accumulated: type: string example: '900.00' debits: type: string example: '150.00' created_at: type: string example: '2026-02-10T09:00:00+00:00' updated_at: type: string example: '2026-06-01T08:12:33+00:00' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 404: description: 'Split não pertence à carteira indicada' content: application/json: schema: type: object example: message: 'No query results for model [App\Models\WalletSplit].' properties: message: type: string example: 'No query results for model [App\Models\WalletSplit].' tags: - 'Carteiras e Subcarteiras' parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira mãe.' example: 123 required: true schema: type: integer - in: path name: walletSplit description: 'ID da subcarteira.' example: 100001 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}/balance': get: summary: "Saldo de uma subcarteira.\n\nResposta cacheada por 60 segundos por subcarteira. Inclui\n`max_amount` e `remaining_capacity` quando a subcarteira tem cap\nconfigurado." operationId: saldoDeUmaSubcarteiraRespostaCacheadaPor60SegundosPorSubcarteiraIncluimaxAmountEremainingCapacityQuandoASubcarteiraTemCapConfigurado description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: wallet_split_id: 100001 wallet_id: 123 currency: MZN available: '750.00' accumulated: '900.00' debits: '150.00' max_amount: '5000.00' remaining_capacity: '4100.00' computed_at: '2026-06-03T15:42:11+00:00' properties: data: type: object properties: wallet_split_id: type: integer example: 100001 wallet_id: type: integer example: 123 currency: type: string example: MZN available: type: string example: '750.00' accumulated: type: string example: '900.00' debits: type: string example: '150.00' max_amount: type: string example: '5000.00' remaining_capacity: type: string example: '4100.00' computed_at: type: string example: '2026-06-03T15:42:11+00:00' 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' tags: - 'Carteiras e Subcarteiras' parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira mãe.' example: 123 required: true schema: type: integer - in: path name: walletSplit description: 'ID da subcarteira.' example: 100001 required: true schema: type: integer /api/v2/transactions: get: summary: "Histórico cross-wallet de transacções.\n\nDevolve todas as transacções das carteiras a que o parceiro tem acesso." operationId: histricoCrossWalletDeTransacesDevolveTodasAsTransacesDasCarteirasAQueOParceiroTemAcesso description: '' parameters: - in: query name: 'filter[wallet_id]' description: 'Restringe a uma carteira.' example: 123 required: false schema: type: integer description: 'Restringe a uma carteira.' example: 123 - in: query name: 'filter[date_from]' description: 'Data inicial.' example: '2026-01-01' required: false schema: type: string description: 'Data inicial.' example: '2026-01-01' - in: query name: 'filter[date_to]' description: 'Data final.' example: '2026-06-30' required: false schema: type: string description: 'Data final.' example: '2026-06-30' - in: query name: 'filter[status]' description: Estado. example: SUCCESSFUL required: false schema: type: string description: Estado. example: SUCCESSFUL - in: query name: 'filter[type]' description: 'Tipo de operação.' example: C2B required: false schema: type: string description: 'Tipo de operação.' example: C2B - in: query name: 'filter[provider]' description: 'Slug do método de pagamento.' example: mpesa required: false schema: type: string description: 'Slug do método de pagamento.' example: mpesa - in: query name: 'filter[clicpay_reference]' description: string. example: CPAYEMOLAC2B... required: false schema: type: string description: string. example: CPAYEMOLAC2B... - in: query name: 'filter[provider_reference]' description: string. example: PROV-12345 required: false schema: type: string description: string. example: PROV-12345 - in: query name: sort description: string. example: '-created_at' required: false schema: type: string description: string. example: '-created_at' - in: query name: paginator description: '`cursor` ou `offset`.' example: cursor required: false schema: type: string description: '`cursor` ou `offset`.' example: cursor - in: query name: per_page description: 1-100. example: 50 required: false schema: type: integer description: 1-100. example: 50 responses: 200: description: 'Mesmo shape de /wallets/{wallet}/transactions' content: application/json: schema: type: object example: data: [] meta: pagination: type: cursor per_page: 50 count: 0 next_cursor: null prev_cursor: null has_more: false properties: data: type: array example: [] meta: type: object properties: pagination: type: object properties: type: type: string example: cursor per_page: type: integer example: 50 count: type: integer example: 0 next_cursor: type: string example: null nullable: true prev_cursor: type: string example: null nullable: true has_more: type: boolean example: false 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: message: 'Filter inválido.' errors: filter.status.0: - ... properties: message: type: string example: 'Filter inválido.' errors: type: object properties: filter.status.0: type: array example: - ... items: type: string tags: - 'Carteiras e Subcarteiras' requestBody: required: false content: application/json: schema: type: object properties: filter: type: object description: '' example: null properties: date_from: type: string description: 'Must be a valid date.' example: '2026-06-28T03:06:24' date_to: type: string description: 'Must be a valid date. Must be a date after or equal to filter.date_from.' example: '2052-07-21' status: type: array description: '' example: - FAILED items: type: string enum: - PENDING - PROCESSING - SUCCESSFUL - FAILED - CANCELLED - REFUNDED - PARTIALLY_REFUNDED - REJECTED - AWAITING_ACTION type: type: array description: '' example: - SUBSCRIPTION_PAYMENT items: type: string enum: - C2B - B2C - DEPOSIT - WITHDRAWAL - WITHDRAWAL_SPLIT - TRANSFER_IN - TRANSFER_OUT - SUBSCRIPTION_PAYMENT provider: type: string description: 'The slug of an existing record in the payment_methods table.' example: architecto clicpay_reference: type: string description: 'Must not be greater than 64 characters.' example: 'n' provider_reference: type: string description: 'Must not be greater than 128 characters.' example: g wallet_id: type: integer description: '' example: 16 sort: type: string description: '' example: completed_at enum: - created_at - '-created_at' - completed_at - '-completed_at' - amount - '-amount' paginator: type: string description: '' example: cursor enum: - cursor - offset per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 cursor: type: string description: '' example: architecto '/api/v2/wallets/{wallet_id}/transactions': get: summary: 'Histórico de transacções de uma carteira.' operationId: histricoDeTransacesDeUmaCarteira description: '' parameters: - in: query name: 'filter[date_from]' description: 'Data inicial (YYYY-MM-DD ou ISO8601).' example: '2026-01-01' required: false schema: type: string description: 'Data inicial (YYYY-MM-DD ou ISO8601).' example: '2026-01-01' - in: query name: 'filter[date_to]' description: 'Data final.' example: '2026-06-30' required: false schema: type: string description: 'Data final.' example: '2026-06-30' - in: query name: 'filter[status]' description: 'Estado (ou múltiplos via `filter[status][]=`).' example: SUCCESSFUL required: false schema: type: string description: 'Estado (ou múltiplos via `filter[status][]=`).' example: SUCCESSFUL - in: query name: 'filter[type]' description: 'Tipo de operação.' example: C2B required: false schema: type: string description: 'Tipo de operação.' example: C2B - in: query name: 'filter[provider]' description: 'Slug do método de pagamento.' example: mpesa required: false schema: type: string description: 'Slug do método de pagamento.' example: mpesa - in: query name: 'filter[clicpay_reference]' description: 'Referência ClicPay (match exacto).' example: CPAYEMOLAC2B... required: false schema: type: string description: 'Referência ClicPay (match exacto).' example: CPAYEMOLAC2B... - in: query name: 'filter[provider_reference]' description: 'Referência do provedor.' example: PROV-12345 required: false schema: type: string description: 'Referência do provedor.' example: PROV-12345 - in: query name: sort description: Ordenação. example: '-created_at' required: false schema: type: string description: Ordenação. example: '-created_at' - in: query name: paginator description: '`cursor` (default) ou `offset`.' example: cursor required: false schema: type: string description: '`cursor` (default) ou `offset`.' example: cursor - in: query name: per_page description: 1-100. example: 50 required: false schema: type: integer description: 1-100. example: 50 - in: query name: cursor description: 'Cursor opaco devolvido em `meta.pagination.next_cursor`.' example: architecto required: false schema: type: string description: 'Cursor opaco devolvido em `meta.pagination.next_cursor`.' example: architecto responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9876 clicpay_reference: CPAYEMOLAC2BABCDE12345 provider_reference: EMOLA-99887 type: C2B status: SUCCESSFUL currency: MZN amount: '500.00' received_amount: '493.50' customer_msisdn: '+258841234567' description: 'Pagamento de Serviço' wallet: id: 123 name: 'Mpesa Principal' payment_method: name: Mpesa slug: mpesa wallet_split: null initiated_at: '2026-06-03T15:01:00+00:00' completed_at: '2026-06-03T15:01:18+00:00' created_at: '2026-06-03T15:01:00+00:00' meta: pagination: type: cursor per_page: 50 count: 1 next_cursor: null prev_cursor: null has_more: false properties: data: type: array example: - id: 9876 clicpay_reference: CPAYEMOLAC2BABCDE12345 provider_reference: EMOLA-99887 type: C2B status: SUCCESSFUL currency: MZN amount: '500.00' received_amount: '493.50' customer_msisdn: '+258841234567' description: 'Pagamento de Serviço' wallet: id: 123 name: 'Mpesa Principal' payment_method: name: Mpesa slug: mpesa wallet_split: null initiated_at: '2026-06-03T15:01:00+00:00' completed_at: '2026-06-03T15:01:18+00:00' created_at: '2026-06-03T15:01:00+00:00' items: type: object properties: id: type: integer example: 9876 clicpay_reference: type: string example: CPAYEMOLAC2BABCDE12345 provider_reference: type: string example: EMOLA-99887 type: type: string example: C2B status: type: string example: SUCCESSFUL currency: type: string example: MZN amount: type: string example: '500.00' received_amount: type: string example: '493.50' customer_msisdn: type: string example: '+258841234567' description: type: string example: 'Pagamento de Serviço' wallet: type: object properties: id: type: integer example: 123 name: type: string example: 'Mpesa Principal' payment_method: type: object properties: name: type: string example: Mpesa slug: type: string example: mpesa wallet_split: type: string example: null nullable: true initiated_at: type: string example: '2026-06-03T15:01:00+00:00' completed_at: type: string example: '2026-06-03T15:01:18+00:00' created_at: type: string example: '2026-06-03T15:01:00+00:00' meta: type: object properties: pagination: type: object properties: type: type: string example: cursor per_page: type: integer example: 50 count: type: integer example: 1 next_cursor: type: string example: null nullable: true prev_cursor: type: string example: null nullable: true has_more: type: boolean example: false 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 422: description: '' content: application/json: schema: type: object example: message: 'Sort inválido.' errors: sort: - ... properties: message: type: string example: 'Sort inválido.' errors: type: object properties: sort: type: array example: - ... items: type: string tags: - 'Carteiras e Subcarteiras' requestBody: required: false content: application/json: schema: type: object properties: filter: type: object description: '' example: null properties: date_from: type: string description: 'Must be a valid date.' example: '2026-06-28T03:06:24' date_to: type: string description: 'Must be a valid date. Must be a date after or equal to filter.date_from.' example: '2052-07-21' status: type: array description: '' example: - PROCESSING items: type: string enum: - PENDING - PROCESSING - SUCCESSFUL - FAILED - CANCELLED - REFUNDED - PARTIALLY_REFUNDED - REJECTED - AWAITING_ACTION type: type: array description: '' example: - DEPOSIT items: type: string enum: - C2B - B2C - DEPOSIT - WITHDRAWAL - WITHDRAWAL_SPLIT - TRANSFER_IN - TRANSFER_OUT - SUBSCRIPTION_PAYMENT provider: type: string description: 'The slug of an existing record in the payment_methods table.' example: architecto clicpay_reference: type: string description: 'Must not be greater than 64 characters.' example: 'n' provider_reference: type: string description: 'Must not be greater than 128 characters.' example: g wallet_id: type: integer description: '' example: 16 sort: type: string description: '' example: '-amount' enum: - created_at - '-created_at' - completed_at - '-completed_at' - amount - '-amount' paginator: type: string description: '' example: cursor enum: - cursor - offset per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 cursor: type: string description: '' example: architecto parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira.' example: 123 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}/transactions': get: summary: 'Histórico de transacções de uma subcarteira.' operationId: histricoDeTransacesDeUmaSubcarteira description: '' parameters: - in: query name: 'filter[date_from]' description: 'Data inicial.' example: '2026-01-01' required: false schema: type: string description: 'Data inicial.' example: '2026-01-01' - in: query name: 'filter[date_to]' description: 'Data final.' example: '2026-06-30' required: false schema: type: string description: 'Data final.' example: '2026-06-30' - in: query name: 'filter[status]' description: Estado. example: SUCCESSFUL required: false schema: type: string description: Estado. example: SUCCESSFUL - in: query name: 'filter[type]' description: Tipo. example: C2B required: false schema: type: string description: Tipo. example: C2B - in: query name: 'filter[provider]' description: Slug. example: mpesa required: false schema: type: string description: Slug. example: mpesa - in: query name: paginator description: '`cursor` ou `offset`.' example: cursor required: false schema: type: string description: '`cursor` ou `offset`.' example: cursor - in: query name: per_page description: 1-100. example: 50 required: false schema: type: integer description: 1-100. example: 50 responses: 200: description: 'Mesmo shape de /wallets/{wallet}/transactions' content: application/json: schema: type: object example: data: [] meta: pagination: type: cursor per_page: 50 count: 0 next_cursor: null prev_cursor: null has_more: false properties: data: type: array example: [] meta: type: object properties: pagination: type: object properties: type: type: string example: cursor per_page: type: integer example: 50 count: type: integer example: 0 next_cursor: type: string example: null nullable: true prev_cursor: type: string example: null nullable: true has_more: type: boolean example: false 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 403: description: '' content: application/json: schema: type: object example: message: 'This action is unauthorized.' properties: message: type: string example: 'This action is unauthorized.' 404: description: 'Split não pertence à carteira indicada' content: application/json: schema: type: object example: message: 'No query results for model [App\Models\WalletSplit].' properties: message: type: string example: 'No query results for model [App\Models\WalletSplit].' tags: - 'Carteiras e Subcarteiras' requestBody: required: false content: application/json: schema: type: object properties: filter: type: object description: '' example: null properties: date_from: type: string description: 'Must be a valid date.' example: '2026-06-28T03:06:24' date_to: type: string description: 'Must be a valid date. Must be a date after or equal to filter.date_from.' example: '2052-07-21' status: type: array description: '' example: - PENDING items: type: string enum: - PENDING - PROCESSING - SUCCESSFUL - FAILED - CANCELLED - REFUNDED - PARTIALLY_REFUNDED - REJECTED - AWAITING_ACTION type: type: array description: '' example: - DEPOSIT items: type: string enum: - C2B - B2C - DEPOSIT - WITHDRAWAL - WITHDRAWAL_SPLIT - TRANSFER_IN - TRANSFER_OUT - SUBSCRIPTION_PAYMENT provider: type: string description: 'The slug of an existing record in the payment_methods table.' example: architecto clicpay_reference: type: string description: 'Must not be greater than 64 characters.' example: 'n' provider_reference: type: string description: 'Must not be greater than 128 characters.' example: g wallet_id: type: integer description: '' example: 16 sort: type: string description: '' example: amount enum: - created_at - '-created_at' - completed_at - '-completed_at' - amount - '-amount' paginator: type: string description: '' example: offset enum: - cursor - offset per_page: type: integer description: 'Must be at least 1. Must not be greater than 100.' example: 22 page: type: integer description: 'Must be at least 1.' example: 67 cursor: type: string description: '' example: architecto parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira mãe.' example: 123 required: true schema: type: integer - in: path name: walletSplit description: 'ID da subcarteira.' example: 100001 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}/b2c/mpesa': post: summary: '' operationId: postApiV2WalletsWallet_idSplitsWalletSplit_idB2cMpesa description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYMPESAB2CABCDE12345 status: pending transaction_id: 790 wallet_split_id: 7 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYMPESAB2CABCDE12345 status: type: string example: pending transaction_id: type: integer example: 790 wallet_split_id: type: integer example: 7 403: description: '' content: application/json: schema: type: object example: message: 'Este split não tem permissão para realizar transações B2C.' properties: message: type: string example: 'Este split não tem permissão para realizar transações B2C.' 422: description: '' content: application/json: schema: type: object example: message: 'Saldo insuficiente no split.' properties: message: type: string example: 'Saldo insuficiente no split.' tags: - 'Transações M-Pesa — B2C via Split' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número do destinatário.' example: '841234567' amount: type: number description: 'Valor a enviar (1–50000 MZN).' example: 500.0 reference_description: type: string description: 'Descrição (3–32 caracteres).' example: 'Pagamento parceiro' internal_notes: type: string description: 'optional Notas internas (máx 255).' example: 'Split B2C mensal' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira M-Pesa mãe.' example: 123456 required: true schema: type: integer - in: path name: walletSplit description: 'ID do WalletSplit.' example: 7 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}/b2c/mkesh': post: summary: '' operationId: postApiV2WalletsWallet_idSplitsWalletSplit_idB2cMkesh description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYMKESHB2CABCDE12345 status: pending transaction_id: 791 wallet_split_id: 7 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYMKESHB2CABCDE12345 status: type: string example: pending transaction_id: type: integer example: 791 wallet_split_id: type: integer example: 7 403: description: '' content: application/json: schema: type: object example: message: 'Este split não tem permissão para realizar transações B2C.' properties: message: type: string example: 'Este split não tem permissão para realizar transações B2C.' 422: description: '' content: application/json: schema: type: object example: message: 'Saldo insuficiente no split.' properties: message: type: string example: 'Saldo insuficiente no split.' tags: - 'Transações Mkesh — B2C via Split' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número do destinatário.' example: '841234567' amount: type: number description: 'Valor a enviar (1–50000 MZN).' example: 500.0 reference_description: type: string description: 'Descrição (3–32 caracteres).' example: 'Pagamento parceiro' internal_notes: type: string description: 'optional Notas internas (máx 255).' example: 'Split B2C mensal' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira Mkesh mãe.' example: 123456 required: true schema: type: integer - in: path name: walletSplit description: 'ID do WalletSplit.' example: 7 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/splits/{walletSplit_id}/b2c/emola': post: summary: '' operationId: postApiV2WalletsWallet_idSplitsWalletSplit_idB2cEmola description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAYEMOLAB2CABCDE12345 status: pending transaction_id: 789 wallet_split_id: 7 properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAYEMOLAB2CABCDE12345 status: type: string example: pending transaction_id: type: integer example: 789 wallet_split_id: type: integer example: 7 403: description: '' content: application/json: schema: type: object example: message: 'Este split não tem permissão para realizar transações B2C.' properties: message: type: string example: 'Este split não tem permissão para realizar transações B2C.' 422: description: '' content: application/json: schema: type: object example: message: 'Saldo insuficiente no split.' needed: 530.0 available: 200.0 missing: 330.0 wallet_split_id: 7 properties: message: type: string example: 'Saldo insuficiente no split.' needed: type: number example: 530.0 available: type: number example: 200.0 missing: type: number example: 330.0 wallet_split_id: type: integer example: 7 tags: - 'Transações eMola — B2C via Split' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'Número do destinatário.' example: '841234567' amount: type: number description: 'Valor a enviar (1–50000 MZN).' example: 500.0 reference_description: type: string description: 'Descrição (3–32 caracteres).' example: 'Pagamento parceiro' internal_notes: type: string description: 'optional Notas internas (máx 255).' example: 'Split B2C mensal' required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: walletSplit_id description: 'The ID of the walletSplit.' example: 100000 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira eMola mãe.' example: 123456 required: true schema: type: integer - in: path name: walletSplit description: 'ID do WalletSplit.' example: 7 required: true schema: type: integer '/api/v2/wallets/{wallet_id}/split/collect': post: summary: '' operationId: postApiV2WalletsWallet_idSplitCollect description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Transação iniciada com sucesso' clicpay_reference: CPAY... status: pending transaction_id: 789 split_summary: direct: [] collect: [] properties: message: type: string example: 'Transação iniciada com sucesso' clicpay_reference: type: string example: CPAY... status: type: string example: pending transaction_id: type: integer example: 789 split_summary: type: object properties: direct: type: array example: [] collect: type: array example: [] 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. 422: description: '' content: application/json: schema: type: object example: errors: splits.0.wallet_split_id: - 'O split não pertence a esta carteira ou não é dynamic_load.' properties: errors: type: object properties: splits.0.wallet_split_id: type: array example: - 'O split não pertence a esta carteira ou não é dynamic_load.' items: type: string tags: - 'Transações — Split Collect' requestBody: required: true content: application/json: schema: type: object properties: msisdn: type: string description: 'MSISDN do pagador.' example: '841234567' amount: type: number description: 'Valor total a cobrar (1–150 000 MZN).' example: 1000.0 reference_description: type: string description: 'Descrição visível ao pagador (3–32 caracteres).' example: 'Pagamento de serviços' internal_notes: type: string description: 'optional Notas internas (máx. 255 caracteres).' example: 'Pedido #9001' splits: type: array description: 'optional Alocações dinâmicas adicionais para sub-carteiras do tipo dynamic_load. Combinam com os splits estáticos da carteira — os splits estáticos processam primeiro, os dinâmicos processam com o que sobrar.' example: - architecto items: type: string required: - msisdn - amount - reference_description parameters: - in: path name: wallet_id description: 'The ID of the wallet.' example: 107219 required: true schema: type: integer - in: path name: wallet description: 'ID da carteira mãe.' example: 12 required: true schema: type: integer