Download OpenAPI specification:
Contrato de integração de pagamento para parceiros da Greenn.
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) |
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:
status: paid na hora, ou recusa de cobrança (PAYMENT_DECLINED — ver Retentativa de cobrança);status: waiting_payment + qrcode para o comprador pagar;status: 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.
A coleta antifraude usa o Fingerprint (agente JavaScript). As duas chamadas — priority 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 v2 — nunca 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).
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:
payment v2 veio com retryable: true;attempts preenchido, junto dos dados de pagamento;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.
422.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).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).offer{}), pode vir vazia → usa a oferta default (= valor do produto). offer_id existente → valida amount; não bate → 422.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.payment v2 aceita apenas os tokens do priority. Qualquer dado bruto de cartão (number/cvv/...) no body → 422 imediato.CREDIT_CARD), dois cartões (TWO_CREDIT_CARDS), boleto (BOLETO) e PIX (PIX).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.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.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.
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.
| X-Fingerprint-RID required | string
|
| system required | string Identifica a sua integração — valor |
| payment_method required | string Enum: "CREDIT_CARD" "TWO_CREDIT_CARDS" "BOLETO" "PIX" |
| action | string or null
|
| installments | integer [ 1 .. 12 ] Parcelamento em até 12x — somente para cartão e dois cartões. Boleto é à vista (envie |
| seller_id required | string External ID Greenn do usuário vendedor (UUID — disponível no painel da Greenn). Mesma referência usada depois no |
| transaction_type | string Fixo 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 |
{- "system": "{INTEGRATION_NAME}",
- "payment_method": "CREDIT_CARD",
- "action": "CARD",
- "installments": 1,
- "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
- "transaction_type": "transaction",
- "attempts": [
- "string"
], - "cards": [
- {
- "country": "BR",
- "holder_name": "string",
- "number": "4111111111111111",
- "exp_month": "12",
- "exp_year": "2030",
- "cvv": "string",
- "costumer": {
- "document": "string",
- "zipcode": "string",
- "type": "string"
}
}
]
}{- "gateway": "PAGARME",
- "parent_id": "string",
- "attempts": [
- "string"
], - "cards": [
- {
- "id": "card_token_xyz",
- "last_digits": "1096",
- "first_digits": "520000",
- "amount": "197.00",
- "total": "197.00",
- "brand": "Mastercard",
- "is_v5": true,
- "expiration_date": "12/2030"
}
]
}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).
| X-Fingerprint-RID required | string
|
| system required | string Identifica a sua integração — mesmo valor |
| 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 |
| method required | string Enum: "CREDIT_CARD" "TWO_CREDIT_CARDS" "BOLETO" "PIX" Ver Diferenças por método nas descrições de |
| amount | number Valor sem juros — informativo. A fonte de verdade é a oferta de cada produto ( |
| 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 |
| 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 → |
| 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 → |
| name | string Nome do comprador — obrigatório para criar (quando |
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 |
required | Array of objects (ProductItem) non-empty Cada item é um produto. |
Array of objects (AffiliateItem) Opcional. Top-level — com vários produtos, vale para todos. No máximo UM item | |
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 ( |
{- "system": "{INTEGRATION_NAME}",
- "method": "CREDIT_CARD",
- "amount": 197,
- "total": 197,
- "installments": 1,
- "gateway": "PAGARME",
- "parent_id": "string",
- "attempts": [
- "string"
], - "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
- "client_id": "client_ref_99",
- "name": "string",
- "cellphone": "+5511999999999",
- "document": "string",
- "country_code": "BR",
- "uuid": "string",
- "zipcode": "string",
- "street": "string",
- "number": "string",
- "complement": "string",
- "neighborhood": "string",
- "city": "string",
- "state": "CE",
- "products": [
- {
- "product_id": "prod_ref_42",
- "amount": 197,
- "coupon": "string",
- "name": "string",
- "type": "string",
- "description": "string",
- "warranty": 0,
- "category_id": 0,
- "offer": {
- "offer_id": "offer_ref_123",
- "amount": 197,
- "name": "string",
- "method": "string",
- "period": 0
}
}
], - "affiliates": [
- {
- "external_id": "a7d2f4b1-3c5e-4f6a-8b9c-0d1e2f3a4b5c",
- "type": "affiliate",
- "comission": 30
}
], - "cards": [
- {
- "id": "card_token_xyz",
- "last_digits": "1096",
- "first_digits": "520000",
- "amount": "197.00",
- "total": "197.00",
- "brand": "Mastercard",
- "is_v5": true,
- "expiration_date": "12/2030"
}
]
}{- "sales": [
- {
- "nano_id": "AB12CD3",
- "status": "paid",
- "method": "CREDIT_CARD",
- "installments": 0,
- "product": {
- "name": "string",
- "amount": 0,
- "offer_id": "string"
}, - "qrcode": "string",
- "imgQrcode": "string",
- "expires_in": 86400,
- "boleto_url": "string",
- "boleto_barcode": "string",
- "boleto_expiration_date": "2019-08-24"
}
], - "parent_id": "string",
- "client": {
- "client_id": "client_ref_99",
- "email": "string",
- "created": true
}
}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.
| X-Webhook-Token required | string Token estático da sua integração (entregue no onboarding) — valide em toda entrega. |
| event required | string Enum: "sale.paid" "sale.waiting_payment" "sale.refused" "sale.refunded" "sale.chargedback" "sale.refund_pending" Evento — |
| version required | string Versão do envelope do webhook. |
| nano_id required | string Identificador único e público da venda — o mesmo devolvido em |
| 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). |
{- "event": "sale.paid",
- "version": "2.0",
- "nano_id": "AB12CD3",
- "status": "paid",
- "transaction_id": "1234567",
- "paid_at": "2026-07-07 10:20:10"
}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.
| system required | string Example: system={INTEGRATION_NAME} Identifica a sua integração — mesmo valor |
| seller_id required | string Example: seller_id=9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d External ID Greenn do vendedor (UUID — mesma referência do |
| 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 |
{- "seller_id": "9d2c5a3e-7f41-4b8a-9c0d-1e2f3a4b5c6d",
- "base_amount": 197,
- "payment_method": "CREDIT_CARD",
- "max_installments": 12,
- "installments": [
- {
- "number": 2,
- "amount_per_installment": 100.48,
- "total": 200.96,
- "fee_rate": 0.99,
- "interest_free": false
}
]
}