Greenn — Payment Integration API (1.5.1-rc.1)

Download OpenAPI specification:

Contrato de integração de pagamento para parceiros da Greenn.

Onboarding

Antes de integrar, a Greenn entrega as suas credenciais:

Credencial Onde usar
{INTEGRATION_NAME} campo system no body das duas chamadas — identifica a sua integração
API key header x-api-key das duas chamadas
Public API key do Fingerprint coleta antifraude no front do seu checkout (ver Fingerprint)

Passo a passo do fluxo

Uma venda completa percorre estes passos:

1 — Colete o fingerprint no front do seu checkout: a coleta (fp.get()) gera um requestId (ver Fingerprint abaixo).

2 — Chame o priority (POST /api/checkout/priority) com os dados de pagamento e o header X-Fingerprint-RID. O cartão bruto trafega somente aqui — ele é tokenizado e você recebe { gateway, cards[].id, attempts, parent_id }.

3 — Colete um NOVO fingerprint. Cada chamada exige um requestId próprio — nunca reutilize o do priority.

4 — Chame o payment v2 (POST /api/v2/payment) repassando o retorno do priority + os dados da venda (produto, oferta, comprador, afiliados). A Greenn valida tudo de forma atômica, registra o que ainda não existir (produto, oferta, vínculos), cria a(s) venda(s) e processa a cobrança.

5 — Trate a resposta, conforme o método:

  • Cartãostatus: paid na hora, ou recusa de cobrança (PAYMENT_DECLINED — ver Retentativa de cobrança);
  • PIXstatus: waiting_payment + qrcode para o comprador pagar;
  • Boletostatus: waiting_payment + boleto_url / boleto_barcode.

6 — Acompanhe os webhooks. Quando a venda é processada ou muda de status (ex.: PIX pago), a Greenn notifica a URL enviada em external_callback_url. Guarde o nano_id de cada venda — é a sua referência nas notificações (webhooks) e o mesmo id curto exibido no painel da Greenn. O payload, os eventos e as regras de entrega estão na seção Webhooks desta doc.

Fingerprint (antifraude) — obrigatório

A coleta antifraude usa o Fingerprint (agente JavaScript). As duas chamadaspriority e payment v2 — exigem o identificador gerado pela coleta.

1 — Obtenha a public API key, fornecida pela Greenn no onboarding.

2 — Instale o agente JS no front do seu checkout (guia oficial). Integração mínima:

// carrega o agente (uma vez, no load da página)
const fpPromise = import('https://fpjscdn.net/v3/SUA_PUBLIC_API_KEY')
  .then(FingerprintJS => FingerprintJS.load());

// antes de CADA chamada (priority e payment v2), faça uma coleta NOVA
const { requestId } = await (await fpPromise).get();

3 — Envie o requestId no header X-Fingerprint-RID das duas chamadas. ⚠️ Cada chamada exige uma coleta nova: um requestId para o priority e outro para o payment v2nunca reutilize um requestId já enviado (cada um vale para uma única requisição, e expira — colete imediatamente antes do envio).

Ausente/inválido/reutilizado → a requisição é recusada com 401 (PARTNER_FINGERPRINT_INVALID).

Retentativa de cobrança

O campo attempts. O priority devolve uma lista de identificadores opacos que representa o andamento daquela cobrança. Trate como um token — não interprete o conteúdo, apenas guarde e devolva ao reprocessar.

Como reprocessar uma recusa recuperável:

  1. A resposta de recusa do payment v2 veio com retryable: true;
  2. Reenvie o priority com o mesmo attempts preenchido, junto dos dados de pagamento;
  3. Siga normalmente para o payment v2 com o novo retorno.

Se retryable: false (irreversível), reenviar não resolve: colete novos dados de pagamento e inicie um priority novo, com attempts vazio.

Regras-chave

  • Sem busca externa: dado obrigatório que não vem no body → erro 422.
  • Seller já existe na Greenn: seller_id carrega o external ID Greenn do usuário vendedor (UUID — o usuário consulta no painel da Greenn e informa à integração; a mesma referência vale pra afiliados/co-sellers em affiliates[].external_id). Sem conta Greenn correspondente → 422 (o fluxo não cria usuários).
  • Produto imutável: product_id (sua referência) existente → usa (não recadastra); não existe + dados de cadastro → cadastra; não existe + sem dados → 422. Valor diferente do registrado → 422 (a Greenn nunca edita produto de parceiro).
  • Oferta: aninhada no produto (offer{}), pode vir vazia → usa a oferta default (= valor do produto). offer_id existente → valida amount; não bate → 422.
  • Order bump: products[0] = produto principal; demais itens = bumps da mesma compra. Validação atômica: todas as validações de todos os produtos rodam ANTES de qualquer cobrança — qualquer falha → 422 e nada é cobrado.
  • Cartão só tokenizado: o payment v2 aceita apenas os tokens do priority. Qualquer dado bruto de cartão (number/cvv/...) no body → 422 imediato.
  • Métodos de pagamento: cartão de crédito (CREDIT_CARD), dois cartões (TWO_CREDIT_CARDS), boleto (BOLETO) e PIX (PIX).
  • Parcelamento: em até 12x, disponível no momento somente para cartão e dois cartões (installments de 1 a 12). Boleto e PIX são à vista.
  • external_callback_url: deve ser uma URL https pública do seu sistema (endereços internos/IP literais privados são recusados com 422 INVALID_CALLBACK_URL). É para ela que os webhooks de saída são enviados.
  • Identificador da venda: cada venda devolve um nano_id (id curto público, o mesmo exibido no painel da Greenn) — é a referência única da venda na integração e nos webhooks.

Envelope de erro

Todos os erros do payment v2 (401/403/422/429) voltam no envelope padronizado:

{
  "error": {
    "code": "PRODUCT_NOT_FOUND",
    "message": "Product could not be resolved.",
    "status": 422,
    "request_id": "...",
    "errors": [ { "field": "products.0.product_id", "message": "..." } ]
  }
}

code é estável (use para tratamento programático); message é legível e pode mudar. Veja os códigos por resposta na operação.

Gateway

Seleção de gateway + tokenização de cartão (priority)

Seleciona o gateway e tokeniza o cartão (priority)

Mesmo fluxo usado pelo checkout Greenn. Para métodos de cartão, envia os dados brutos do cartão — este é o único lugar onde dado de cartão trafega; o payment v2 aceita apenas os tokens devolvidos aqui.

A origem é identificada pelo campo system do body; a chave da sua integração vai no header x-api-key.

Authorizations:
IntegrationApiKey
header Parameters
X-Fingerprint-RID
required
string

requestId retornado pela coleta do agente Fingerprint (fp.get()) no front do seu checkout, com a public API key fornecida pela Greenn (ver Fingerprint na introdução). Coleta nova a cada chamada — nunca reutilize um requestId já enviado (um para o priority, outro para o payment v2).

Request Body schema: application/json
required
system
required
string

Identifica a sua integração — valor {INTEGRATION_NAME} fornecido pela Greenn no onboarding.

payment_method
required
string
Enum: "CREDIT_CARD" "TWO_CREDIT_CARDS" "BOLETO" "PIX"
action
string or null

CARD para métodos de cartão; null para PIX/boleto.

installments
integer [ 1 .. 12 ]

Parcelamento em até 12x — somente para cartão e dois cartões. Boleto é à vista (envie 1); PIX não envia o campo.

seller_id
required
string

External ID Greenn do usuário vendedor (UUID — disponível no painel da Greenn). Mesma referência usada depois no payment v2.

transaction_type
string

Fixo "transaction" na integração.

Value: "transaction"
email_customer
required
string <email>

E-mail do comprador.

attempts
Array of strings

Vazio na 1ª tentativa; preenchido (com o valor devolvido antes) ao reprocessar uma recusa recuperável (ver Retentativa de cobrança).

Array of objects (RawCard) [ 1 .. 2 ] items

Só para métodos de cartão. 1 item para CREDIT_CARD; até 2 para TWO_CREDIT_CARDS (cada um com seu valor; soma = total). Único lugar onde dado bruto de cartão trafega.

Responses

Request samples

Content type
application/json
{
  • "system": "{INTEGRATION_NAME}",
  • "payment_method": "CREDIT_CARD",
  • "action": "CARD",
  • "installments": 1,
  • "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
  • "transaction_type": "transaction",
  • "email_customer": "[email protected]",
  • "attempts": [
    ],
  • "cards": [
    ]
}

Response samples

Content type
application/json
{
  • "gateway": "PAGARME",
  • "parent_id": "string",
  • "attempts": [
    ],
  • "cards": [
    ]
}

Payment

Processamento de pagamento da integração (payment v2)

Cria e processa a venda (payment v2)

Recebe o resultado do priority + dados da venda. Resolve o seller, valida/registra produto, oferta e vínculos de afiliado/co-seller, resolve o comprador (resolve-or-create), cria a(s) venda(s) e processa a cobrança — tudo com validação atômica (nada é cobrado se qualquer item falhar).

Recusa de cobrança NÃO é erro de validação: volta HTTP 200 com a(s) venda(s) em status: refused e o envelope PAYMENT_DECLINED (ver schema de resposta).

Authorizations:
IntegrationApiKey
header Parameters
X-Fingerprint-RID
required
string

requestId retornado pela coleta do agente Fingerprint (fp.get()) no front do seu checkout, com a public API key fornecida pela Greenn (ver Fingerprint na introdução). Coleta nova a cada chamada — nunca reutilize um requestId já enviado (um para o priority, outro para o payment v2).

Request Body schema: application/json
required
system
required
string

Identifica a sua integração — mesmo valor {INTEGRATION_NAME} do priority.

external_callback_url
required
string <uri>

Obrigatório. URL https pública do seu sistema para onde a Greenn envia os webhooks de saída quando a venda é processada ou atualizada (transições síncronas e assíncronas — ex.: PIX/boleto waiting_paymentpaid). Endereços internos/IP literais privados são recusados (422 INVALID_CALLBACK_URL). Ver seção Webhooks.

method
required
string
Enum: "CREDIT_CARD" "TWO_CREDIT_CARDS" "BOLETO" "PIX"

Ver Diferenças por método nas descrições de cards/installments.

amount
number

Valor sem juros — informativo. A fonte de verdade é a oferta de cada produto (products[].amount é validado contra a oferta registrada, imutável).

total
number

Total com juros/parcelas — informativo (derivado server-side).

installments
integer [ 1 .. 12 ]

Parcelamento em até 12x — disponível no momento somente para cartão e dois cartões (validado contra o max_installments da oferta). Boleto é à vista (envie 1); PIX não envia o campo.

gateway
required
string

Ecoado do retorno do priority (opaco).

parent_id
required
string

Correlação — ecoado do retorno do priority.

attempts
Array of strings

Ecoado do retorno do priority (ver Retentativa de cobrança).

seller_id
required
string

External ID Greenn do usuário vendedor (UUID — disponível no painel da Greenn; mesma referência enviada no priority) → resolvido para a conta Greenn do seller (precisa existir; não resolvida → 422). É o seller usado no cadastro de produto.

client_id
required
string

Obrigatório. Sua referência do comprador → resolve-or-create do comprador na Greenn: existe → usa; não existe + dados abaixo → cria; não existe + faltam dados → 422. O mapeamento volta na resposta (client).

name
string

Nome do comprador — obrigatório para criar (quando client_id não existe).

email
string <email>

Obrigatório para criar o comprador.

cellphone
string

Obrigatório para criar o comprador.

document
string

CPF/CNPJ — obrigatório para criar o comprador.

country_code
string

Sigla do país — obrigatório para criar o comprador.

uuid
string

Opcional — UUID de um lead já existente na Greenn associado a esta compra; ausente → a Greenn cria o registro.

zipcode
string

Endereço de cobrança — opcional (todos os campos de endereço).

street
string
number
string
complement
string
neighborhood
string
city
string
state
string

Sigla (UF), mesmo padrão de country_code.

required
Array of objects (ProductItem) non-empty

Cada item é um produto. products[0] = produto principal; os demais = order bumps da mesma compra. Validação atômica: qualquer falha em qualquer item → 422 e nada é cobrado.

Array of objects (AffiliateItem)

Opcional. Top-level — com vários produtos, vale para todos. No máximo UM item type: affiliate (mais de um → 422); os demais devem ser coseller. O usuário referenciado precisa ter conta na Greenn (não resolvido → 422). Vínculo ao produto inexistente → é registrado; existente → comissão divergente atualiza o vínculo.

Array of objects (TokenizedCard) [ 1 .. 2 ] items

Só para métodos de cartão — repasse todos os cartões tokenizados do priority, na mesma ordem/quantidade. 1 item (CREDIT_CARD, sem expiration_date); 2 itens (TWO_CREDIT_CARDS, cada um com expiration_date; soma dos amount = total). ⚠️ Dado bruto de cartão é recusado (422 imediato).

Responses

Request samples

Content type
application/json
{
  • "system": "{INTEGRATION_NAME}",
  • "external_callback_url": "https://parceiro.com/webhooks/greenn",
  • "method": "CREDIT_CARD",
  • "amount": 197,
  • "total": 197,
  • "installments": 1,
  • "gateway": "PAGARME",
  • "parent_id": "string",
  • "attempts": [
    ],
  • "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
  • "client_id": "client_ref_99",
  • "name": "string",
  • "email": "[email protected]",
  • "cellphone": "+5511999999999",
  • "document": "string",
  • "country_code": "BR",
  • "uuid": "string",
  • "zipcode": "string",
  • "street": "string",
  • "number": "string",
  • "complement": "string",
  • "neighborhood": "string",
  • "city": "string",
  • "state": "CE",
  • "products": [
    ],
  • "affiliates": [
    ],
  • "cards": [
    ]
}

Response samples

Content type
application/json
Example
{
  • "sales": [
    ],
  • "parent_id": "string",
  • "client": {
    }
}

Webhooks

Notificações de saída enviadas pela Greenn para a sua external_callback_url

Venda processada / mudança de status Webhook

A Greenn envia um POST para a sua external_callback_url a cada transição de status da venda que você ainda não recebeu de forma síncrona (desfechos já devolvidos na resposta do payment v2 — ex.: cartão aprovado/recusado na hora — não geram webhook duplicado; PIX/boleto pagos depois, reembolsos e chargebacks geram).

Autenticação: cada entrega leva o header X-Webhook-Token com o token combinado no onboarding — valide-o antes de processar.

Confirmação e reentrega: responda 2xx em até 30s para confirmar. Sem 2xx, a entrega é retentada automaticamente. A semântica é at-least-once: deduplique pelo par (nano_id, event).

Eventos: sale.paid, sale.waiting_payment, sale.refused, sale.refunded, sale.chargedback, sale.refund_pending.

header Parameters
X-Webhook-Token
required
string

Token estático da sua integração (entregue no onboarding) — valide em toda entrega.

Request Body schema: application/json
required
event
required
string
Enum: "sale.paid" "sale.waiting_payment" "sale.refused" "sale.refunded" "sale.chargedback" "sale.refund_pending"

Evento — sale.<status> da transição que originou a notificação.

version
required
string

Versão do envelope do webhook.

nano_id
required
string

Identificador único e público da venda — o mesmo devolvido em sales[].nano_id na resposta do payment v2. Sua chave de correlação.

status
required
string
Enum: "paid" "waiting_payment" "refused" "refunded" "chargedback" "refund_pending"

Status da venda no momento da notificação.

transaction_id
string or null

Identificador da transação/cobrança, quando existente.

paid_at
string or null

Data/hora do pagamento (quando pago).

Responses

Request samples

Content type
application/json
{
  • "event": "sale.paid",
  • "version": "2.0",
  • "nano_id": "AB12CD3",
  • "status": "paid",
  • "transaction_id": "1234567",
  • "paid_at": "2026-07-07 10:20:10"
}

Installments

Consulta pré-pagamento da tabela de parcelamento (somente leitura)

Consulta a tabela de parcelamento (pré-pagamento)

Endpoint somente-leitura: dado um seller e um valor, devolve a tabela de parcelamento completa (de 1 a max_installments) para o parceiro exibir as opções ao comprador antes de chamar o priority + payment v2. Não depende de produto cadastrado.

Fingerprint não é exigido aqui — consulta de catálogo, sem cobrança (o X-Fingerprint-RID é exigido só no priority e no payment v2).

PIX e BOLETO não têm parcelamento na plataforma: a resposta volta com 1 única entrada (number: 1, fee_rate: 0.00, interest_free: true) e max_installments: 1.

Authorizations:
IntegrationApiKey
query Parameters
system
required
string
Example: system={INTEGRATION_NAME}

Identifica a sua integração — mesmo valor {INTEGRATION_NAME} usado no priority e no payment v2.

seller_id
required
string
Example: seller_id=9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d

External ID Greenn do vendedor (UUID — mesma referência do priority/payment v2). Não resolvido → 422 SELLER_NOT_FOUND.

amount
required
number
Example: amount=197

Valor base em BRL usado para calcular a tabela de parcelamento.

payment_method
string
Default: "CREDIT_CARD"
Enum: "CREDIT_CARD" "TWO_CREDIT_CARDS" "BOLETO" "PIX"

Default CREDIT_CARD. TWO_CREDIT_CARDS usa as mesmas taxas do CREDIT_CARD (a tabela retornada é para o valor total — o parceiro divide amount_per_installment / 2 por cartão no lado dele). BOLETO e PIX não têm parcelamento — resposta gracieuse com 1 entrada e max_installments: 1.

Responses

Response samples

Content type
application/json
{
  • "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
  • "base_amount": 197,
  • "payment_method": "CREDIT_CARD",
  • "max_installments": 12,
  • "installments": [
    ]
}