openapi: 3.1.0
info:
version: '0.5'
title: Documentação Malga 3DS2 Malga Sessions API
description: "# Authentication\n\nOs serviços de API da Malga são protegidos através de chaves de acesso. Você pode gerenciar suas chaves de acesso através do seu dashboard.\n\nÉ importante armazenar suas chaves de maneira privada e segura uma vez que elas possuem privilégios de alteração na sua conta. Não compartilhe suas chaves, não deixe elas fixadas no seu código e nem armazene elas no seu servidor de controle de versão. Recomendamos utilizar variáveis de ambiente secretas para deixar a chave disponível para sua aplicação.\n\nA Autenticação para todos os chamadas da API é feita através de headers HTTP, sendo necessário informar seu identificador de cliente na Malga e a chave secreta de acesso.\n\n## X-Client-ID\n\nIdentificador única da sua conta na Malga. Deve ser enviado no header obrigatóriamente em todas as requisições feitas a API.\n\n| Security Scheme Type | API Key |\n|-----------------------|-----------|\n| Header parameter name | `X-Client-ID` |\n\n## X-Api-Key\n\nSua chave de acesso a API. Funciona em par com o client-id devendo ser enviado no header obrigatóriamente em todas as requisições feitas a API.\n\n| Security Scheme Type | API Key |\n|-----------------------|-----------|\n| Header parameter name | `X-Api-Key` |\n\n## Exemplo de requisicão autenticada\n\n```bash\n curl --location --request GET 'https://api.malga.io/v1/' \\\n --header 'X-Client-Id: <YOUR_CLIENT_ID>' \\\n --header 'X-Api-Key: <YOUR_SECRET_KEY>'\n```\n"
servers:
- url: https://api.malga.io
description: Production
security:
- X-Client-ID: []
X-Api-Key: []
tags:
- name: Sessions
description: '
Através da API de sessões é possível criar um pedido, composto por itens, métodos de pagamento e outros atributos, que pode ser pago através de um endpoint ou integrado ao MalgaCheckout.
# Fluxo de criação e de pagamento de uma sessão
- Crie uma `sessão` informando os dados básicos necessários
- Utilize a `publicKey` retornada na criação ou recuperada na rota de detalhes no `X-Api-Key` para autenticar o pagamento
**Dados básicos de um objeto do tipo session**
<SchemaDefinition schemaRef="#/components/schemas/Session" exampleRef="#/components/examples/Session" />
'
paths:
/v1/sessions:
get:
summary: Listar sessões
operationId: listSessions
description: 'Lista as sessões do cliente autenticado, com paginação e filtros opcionais.
Sem o header `X-Client-Id`, a API responde `200` com `items` vazio e metadados de paginação padrão (não retorna erro).
'
parameters:
- in: query
name: page
schema:
type: integer
minimum: 1
default: 1
required: false
description: Número da página a ser listada (mínimo 1)
- in: query
name: limit
schema:
type: integer
minimum: 1
maximum: 100
default: 10
required: false
description: Quantidade de registros por página (padrão 10; máximo 100)
- in: query
name: order
schema:
type: string
enum:
- asc
- desc
default: desc
required: false
description: 'Aceito como `asc` ou `desc` (padrão `desc`; valores inválidos caem para `desc`).
A listagem atual ordena sempre por `createdAt` decrescente.
'
- in: query
name: id
schema:
type: string
format: uuid
required: false
description: Filtra pelo identificador da sessão
- in: query
name: status
schema:
type: string
enum:
- created
- paid
- canceled
- voided
required: false
description: Filtra por status da sessão. Aceita múltiplos valores separados por vírgula
- in: query
name: isActive
schema:
type: string
enum:
- 'true'
- 'false'
required: false
description: Filtra sessões ativadas ou desativadas. Aceita múltiplos valores separados por vírgula (`true` e/ou `false`)
- in: query
name: merchantId
schema:
type: string
format: uuid
required: false
description: Filtra pelo identificador do merchant
- in: query
name: orderId
schema:
type: string
minLength: 2
required: false
description: Filtra pelo identificador do pedido. Se informado, deve ter no mínimo 2 caracteres Unicode após o trim
- in: query
name: multiplePayments.status
schema:
type: string
enum:
- active
- disabled
- canceled
required: false
description: 'Filtra pela disponibilidade agregada do link (`multiplePayments.status`). Aceita múltiplos valores separados por vírgula.
`disabled` cobre links temporariamente indisponíveis, incluindo expiração por `dueDate`.
'
- in: query
name: created.gt
schema:
type: string
format: date-time
required: false
description: Filtra sessões com `createdAt` estritamente maior que o instante informado (RFC 3339 ou RFC 3339 com fração de segundos)
example: '2026-03-24T03:00:00.000Z'
- in: query
name: created.lt
schema:
type: string
format: date-time
required: false
description: Filtra sessões com `createdAt` estritamente menor que o instante informado (RFC 3339 ou RFC 3339 com fração de segundos)
example: '2026-04-01T02:59:00.000Z'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/SessionList'
examples:
SessionList:
$ref: '#/components/examples/SessionList'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Sessions
post:
summary: Criar nova sessão
operationId: createSession
description: 'Cria uma sessão de pagamento. Quando `maxPayments` é omitido, a sessão segue o fluxo 1:1 legado. Quando `maxPayments` é enviado, a sessão opera como link 1:N e a resposta completa retorna `multiplePayments` com a disponibilidade agregada para próximas cobranças.
**Restrição pix/boleto em 1:N:** métodos `pix` e `boleto` não podem ser combinados com `maxPayments` finito maior que `1`. Nesse caso a API retorna `422` com `businessCode: "pix_boleto_multiple_payments_not_allowed"`. `maxPayments` omitido, `null`, `1` ou `-1` (ilimitado) continua permitido para pix/boleto. O bloqueio não se aplica a cartão de crédito.
'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSession'
examples:
CreateSessionRequest:
$ref: '#/components/examples/CreateSessionRequest'
CreateSessionRequest1NFixed:
$ref: '#/components/examples/CreateSessionRequest1NFixed'
CreateSessionRequest1NUnlimited:
$ref: '#/components/examples/CreateSessionRequest1NUnlimited'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/SessionResponse'
examples:
Session:
$ref: '#/components/examples/Session'
Session1N:
$ref: '#/components/examples/Session1N'
'422':
description: 'Unprocessable Entity. Regras de negócio bloquearam a criação da sessão. O envelope segue o formato padrão de erro, com `businessCode` identificando a regra violada.
'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
PixBoletoMultiplePaymentsNotAllowed:
summary: Pix/boleto com maxPayments > 1
value:
error:
type: bad_request
code: 422
message: PIX and boleto payment methods do not support maxPayments greater than 1.
businessCode: pix_boleto_multiple_payments_not_allowed
details: []
PlatformFeeExceedsLinkAmount:
summary: Taxa de plataforma maior ou igual ao valor do link
value:
error:
type: bad_request
code: 422
message: Calculated platform fee must be less than the link total amount.
businessCode: platform_fee_exceeds_link_amount
details: []
tags:
- Sessions
/v1/sessions/{id}:
get:
summary: Recuperar detalhes de uma sessão
operationId: getSession
description: 'Retorna a sessão completa. Use este endpoint como fonte do estado agregado de `multiplePayments` após criação, pagamento, atualização, cancelamento ou consulta de histórico.
'
parameters:
- name: id
required: true
description: Identificação da sessão a ser recuperada
in: path
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/SessionResponse'
examples:
Session:
$ref: '#/components/examples/Session'
tags:
- Sessions
patch:
summary: Atualizar relevância de uma sessão
operationId: patchSession
description: 'Atualiza campos de relevância da sessão: `isActive` (obrigatório), `dueDate` e `maxPayments` (sessões 1:N). A resposta é parcial e devolve apenas `id` e `isActive`; após a atualização, consulte `GET /v1/sessions/{id}` para obter o estado completo (`status`, `dueDate`, `maxPayments`, `multiplePayments`, etc.).
**Restrição de reativação pix/boleto 1:1 consumida:** `isActive: true` em uma sessão pix ou boleto 1:1 já paga (`maxPayments = 1` com `paymentCount = 1`, ou sessão legada sem `maxPayments` já `paid` com `paymentCount = 1`) retorna `422` com `businessCode: "pix_boleto_one_to_one_reactivation_blocked"`. O bloqueio ignora `maxPayments` enviado no PATCH.
'
parameters:
- name: id
required: true
description: Identificação da sessão a ser alterada
in: path
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchSessionRequest'
examples:
PatchSessionRequest:
$ref: '#/components/examples/PatchSessionRequest'
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/PatchSession200Response'
examples:
PatchSession200Response:
$ref: '#/components/examples/PatchSession200Response'
'422':
description: 'Unprocessable Entity. Regras de negócio bloquearam a atualização da sessão. O envelope segue o formato padrão de erro, com `businessCode` identificando a regra violada.
'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
PixBoletoOneToOneReactivationBlocked:
summary: Reativação de sessão pix/boleto 1:1 já consumida
value:
error:
type: bad_request
code: 422
message: Consumed one-to-one PIX or boleto sessions cannot be reactivated.
businessCode: pix_boleto_one_to_one_reactivation_blocked
details: []
tags:
- Sessions
/v1/sessions/{id}/charge:
post:
summary: Pagar uma sessão
operationId: paySession
description: 'Inicia uma cobrança para a sessão. Em sessões 1:N, cada chamada aceita representa uma tentativa individual dentro da capacidade configurada em `maxPayments`. A resposta é a cobrança criada e não retorna `multiplePayments`; consulte `GET /v1/sessions/{id}` para acompanhar o estado agregado atualizado.
'
parameters:
- name: id
required: true
description: Identificação da sessão a ser paga
in: path
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PaySessionRequest'
examples:
PaySessionCardRequest:
$ref: '#/components/examples/PaySessionCardRequest'
PaySessionCardRequestWithRecurrence:
$ref: '#/components/examples/PaySessionCardRequestWithRecurrence'
PaySessionPixRequest:
$ref: '#/components/examples/PaySessionPixRequest'
PaySessionDripRequest:
$ref: '#/components/examples/PaySessionDripRequest'
PaySessionBoletoRequest:
$ref: '#/components/examples/PaySessionBoletoRequest'
PaySessionNupayRequest:
$ref: '#/components/examples/PaySessionNupayRequest'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/PaySession201Response'
examples:
PaySession201CardResponse:
$ref: '#/components/examples/PaySession201CardResponse'
PaySession201PixResponse:
$ref: '#/components/examples/PaySession201PixResponse'
PaySession201DripResponse:
$ref: '#/components/examples/PaySession201DripResponse'
PaySession201BoletoResponse:
$ref: '#/components/examples/PaySession201BoletoResponse'
PaySession201NupayResponse:
$ref: '#/components/examples/PaySession201NupayResponse'
'404':
description: 'Sessão não encontrada ou não pertencente ao cliente informado em `X-Client-Id`.
'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'422':
description: 'Unprocessable Entity. A cobrança não pode ser processada: sellers de split inválidos, ou sessão 1:N indisponível (link desativado ou limite de pagamentos atingido). Nos casos de indisponibilidade 1:N, o `businessCode` é `session_disabled` ou `multiple_payments_limit_reached`. O envelope segue o formato padrão de erro.
'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
InvalidSellers:
summary: Sellers de split inválidos
value:
error:
type: bad_request
code: 422
message: 'session cannot be charged: sellers not found [9f8b2c1a-4d3e-4a2b-8c7d-1e2f3a4b5c6d]'
details: []
MultiplePaymentsLimitReached:
summary: Limite de pagamentos 1:N atingido
value:
error:
type: bad_request
code: 422
message: multiple payments limit reached
businessCode: multiple_payments_limit_reached
details: []
tags:
- Sessions
/v1/sessions/{id}/cancel:
post:
summary: Cancelar uma sessão
operationId: cancelSession
parameters:
- name: id
required: true
description: Identificação da sessão a ser cancelada
in: path
schema:
type: string
format: uuid
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/CancelSession201Response'
examples:
CancelSession201Response:
$ref: '#/components/examples/CancelSession201Response'
tags:
- Sessions
/v1/sessions/{id}/history:
get:
summary: Recuperar o histórico da sessão
operationId: getSessionHistory
description: 'Retorna a trilha de auditoria da sessão em ordem decrescente de criação, com os registros mais recentes primeiro: alterações de campos, tentativas de pagamento, confirmações assíncronas e expirações.
Cada item representa um **registro de histórico** (`id` do evento), não o identificador da sessão. Use `action` (ação principal derivada) e `actions` (lista completa) junto com `diff` para entender o que ocorreu.
O campo `status` em cada item segue a **semântica de produto** na leitura: expirações automáticas por `dueDate` ou limite 1:N podem aparecer como `disabled`, mesmo quando o status persistido no registro era `created`.
Para o estado atual da sessão e de `multiplePayments`, consulte `GET /v1/sessions/{id}`. O histórico não substitui essa consulta.
'
parameters:
- name: id
required: true
description: Identificação da sessão
in: path
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/SessionHistoryResponse'
examples:
SessionHistoryResponse:
$ref: '#/components/examples/SessionHistoryResponse'
'400':
description: Header `X-Client-Id` ausente ou identificador da sessão ausente no path
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Sessão não encontrada para o par `id` + `X-Client-Id`
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'500':
description: Erro interno inesperado ao recuperar o histórico da sessão
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Sessions
/v1/sessions/{id}/link:
get:
summary: Recupera sessão com os dados das configurações da empresa
operationId: getSessionWithSettings
description: 'Retorna a sessão completa junto das configurações da empresa usadas no Link de Pagamento. Também inclui `multiplePayments` para indicar a disponibilidade agregada do link em sessões 1:1 e 1:N.
'
parameters:
- name: id
required: true
description: Identificação da sessão a ser recuperada
in: path
schema:
type: string
format: uuid
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/SessionSettingsResponse'
tags:
- Sessions
components:
schemas:
VendorCharge:
type: object
description: Parâmetros adicionais para transacionar com `vendors`
properties:
id:
type: string
format: uuid
description: Identificador do vendedor já cadastrado na API de [vendors](/api-reference/vendors/criacao-de-um-novo-vendedor)
paymentFacilitatorId:
type: string
description: Seu código de Subadquirente na respectiva bandeira. [Verifique a lista de provedores suportados](/documentations/vendors/provedores)
nullable: true
required:
- id
- paymentFacilitatorId
PaymentMethodDripObjectRequest:
title: Drip
type: object
properties:
paymentType:
type: string
enum:
- drip
description: Método da cobrança via Drip
cancelRedirectUrl:
type: string
description: Link de redirecionamento em caso de cancelamento do pagamento no ambiente de checkout da Drip
successRedirectUrl:
type: string
description: Link de redirecionamento em caso de aprovação do pagamento no ambiente de checkout da Drip
required:
- paymentType
ErrorItem:
properties:
type:
type: string
enum:
- api_error
- bad_request
- invalid_request_error
- card_declined
code:
type: integer
description: Código HTTP do erro (por exemplo, `422` em erros de regra de negócio).
declinedCode:
type: string
description: Código de retorno da transação em caso de falha na autorização
key:
type: string
description: 'Chave estável que identifica o erro de negócio (ex.: `bank_identifier_required`). Útil para tratar o erro programaticamente, independente da mensagem traduzida.'
businessCode:
type: string
description: 'Chave estável de regra de negócio retornada em `422`. Permite tratar o erro programaticamente independente da mensagem traduzida. Exemplos em sessões: `pix_boleto_multiple_payments_not_allowed`, `pix_boleto_one_to_one_reactivation_blocked`, `platform_fee_exceeds_link_amount`, `session_disabled`, `multiple_payments_limit_reached`.
'
message:
type: string
description: Descrição breve do erro
details:
type: array
description: Lista contendo objetos que detalham o erro de validação
UserSettings:
properties:
id:
type: string
format: uuid
description: Identificador das configurações da empresa
logo:
type: string
format: uri
description: URL do logo da empresa
mainColor:
type: string
description: Cor primária
secondaryColor:
type: string
description: Cor secundária
attentionColor:
type: string
description: Cor utilizada para alertas
errorColor:
type: string
description: Cor utilizada para as mensagens de erro
successColor:
type: string
description: Cor utilizada nas mensagens de sucesso
backgroundColor:
type: string
description: Cor de fundo
clientId:
type: string
description: Identificador do cliente na Malga
companyUrl:
type: string
description: 'Url que deve ser utilizada no link de pagamento. Ex: https://www.company.com'
mastercardClickToPayDpaid:
type: string
description: Digital Payment Application ID (dpaId) para habilitar Mastercard Click to Pay no Link de Pagamento. Campo opcional.
merchantId:
type: string
description: Indica se a configuração retornada é específica de um merchant (id do merchant) ou a configuração padrão do cliente (nesse caso sem valor).
PaymentMethodNupayObjectRequest:
title: NuPay
type: object
properties:
paymentType:
type: string
enum:
- nupay
description: Método da cobrança via Nupay
orderUrl:
type: string
description: URL da cobrança
delayToAutoCancel:
type: integer
description: Tempo em minutos para a expiração de uma cobrança criada que não tenha sido paga
returnUrl:
type: string
description: URL para a qual o cliente será redirecionado após finalizar o pagamento
cancelUrl:
type: string
description: URL para onde o cliente será direcionado caso escolha não finalizar o pagamento e cancele o pedido
recipients:
type: array
description: Beneficiários finais da transação NuPay (PLDFT). Campo opcional.
items:
$ref: '#/components/schemas/NupayRecipient'
required:
- paymentType
PaySessionRequest:
description: 'Corpo para pagamento da sessão (`paymentMethod` e `paymentSource`). Se existir split, as regras foram definidas na **criação da sessão** (`splitRules` em POST /v1/sessions) e são aplicadas ao processar esta cobrança; não envie `splitRules` aqui.
'
properties:
customerId:
type: string
format: uuid
description: Identificador de comprador para consulta futura
paymentMethod:
description: Define o método de cobrança
oneOf:
- $ref: '#/components/schemas/PaymentMethodCard'
- $ref: '#/components/schemas/PaymentMethodPixObjectRequest'
- $ref: '#/components/schemas/PaymentMethodBoleto'
- $ref: '#/components/schemas/PaySessionPaymentMethodDripObjectRequest'
- $ref: '#/components/schemas/PaymentSessionNuPay'
- $ref: '#/components/schemas/PaymentMethodClickToPay'
paymentSource:
oneOf:
- $ref: '#/components/schemas/SourceTypeCard'
- $ref: '#/components/schemas/SourceTypeCardOneShot'
- $ref: '#/components/schemas/SourceTypeToken'
- $ref: '#/components/schemas/SourceTypeCustomer'
- $ref: '#/components/schemas/SourceTypeCustomerData'
- $ref: '#/components/schemas/SourceTypeClickToPay'
fraudAnalysis:
description: Parâmetros adicionais para análise de fraude. Alguns destes campos podem ser necessários para processar com provedores específicos.
allOf:
- $ref: '#/components/schemas/FraudAnalysisRequest'
required:
- paymentMethod
- paymentSource
SourceTypeCustomerData:
title: Pagamentos com dados de Customer
type: object
description: Dados do customer para cobrança via Cartão, Pix ou Boleto
properties:
sourceType:
type: string
description: Tipo da origem da cobrança, usar `customer` para cobrança via Cartão, Pix ou Boleto
enum:
- customer
customer:
type: object
properties:
name:
type: string
description: Nome do usuario
email:
type: string
description: Email do usuario
phoneNumber:
type: string
description: Telefone de contato do usuario
document:
allOf:
- $ref: '#/components/schemas/Document'
address:
allOf:
- $ref: '#/components/schemas/Address'
required:
- email
- phoneNumber
- document
required:
- sourceType
- customer
FraudAnalysisRequest:
properties:
sla:
type: number
description: Valor em Minutos de SLA máximo de Análise do Pedido, se houver
customer:
description: Dados do comprador
type: object
properties:
name:
type: string
description: Nome do usuario
email:
type: string
description: Email do usuario
phone:
type: string
description: Telefone de contato do usuario
identityType:
type: string
description: Tipo de documento, consultar tabela de tipos suportados
identity:
type: string
description: Número do documento formato conforme tipo selecionado
maritalStatus:
type: string
description: Estado civil do usuario
education:
type: string
description: Nível de escolaridade do usuario
registrationDate:
type: string
description: Data de registro do cliente
deliveryAddress:
description: Endereço de entrega
allOf:
- $ref: '#/components/schemas/FraudAnalysisAddress'
billingAddress:
description: Endereço de cobrança
allOf:
- $ref: '#/components/schemas/FraudAnalysisAddress'
browser:
description: Informações sobre o navegador do usuário
allOf:
- $ref: '#/components/schemas/FraudAnalysisCustomerBrowser'
mfa:
description: Dados de Multi factor authentication
type: object
properties:
smsOtpUsed:
type: boolean
description: Usuario utilizou OTP via SMS
emailOtpUsed:
type: boolean
description: Usuario utilizou OTP via email
cart:
description: Detalhe do carrinho de produtos
type: object
properties:
items:
type: array
items:
type: object
properties:
name:
type: string
description: Nome do item/evento
quantity:
type: integer
description: Quantidade de itens do pedido
sku:
type: string
description: Identificador único do item na loja
unitPrice:
type: integer
description: Valor unitário do item/evento em centavos
risk:
type: string
description: Definição do indice de risco do item
enum:
- High
- Low
description:
type: string
description: Descrição do item/evento
categoryId:
type: string
description: Categoria a qual o item/evento pertence
locality:
type: string
description: Definição de local, em caso de evento
date:
type: string
description: Definição de data, em caso de evento
type:
type: number
description: Definição de tipo, em caso de evento
genre:
type: string
description: Definição de gênero, em caso de evento
tickets:
type: object
description: Informações relacionadas aos ingressos, em caso de evento
properties:
quantityTicketSale:
type: number
description: Quantidade total de ingressos à venda
quantityEventHouse:
type: number
description: Quantidade de vezes que o evento será realizado na casa
convenienceFeeValue:
type: number
description: Taxa de Conveniência
quantityFull:
type: number
description: Quantidade de ingressos com valor integral
quantityHalf:
# --- truncated at 32 KB (119 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/plug/refs/heads/main/openapi/plug-sessions-api-openapi.yml