Referência da API
Checkout hospedado
Como a sua loja cria e gerencia sessões. Base https://api.pbintegracoes.com/v1. O comprador paga em https://checkout.pbintegracoes.com/c/{id} — a página hospedada cuida do restante.
Visão geral
- Sua loja chama POST /checkouts com a Connect Key e recebe
id,urlelinks. - Redirecione o comprador para
url(oulinkscomrel: PAY). - A página hospedada coleta dados e processa o pagamento. Sua loja é avisada via
notification_urls(webhook).
Valores em centavos (7900 = R$ 79,00). Create com sucesso = HTTP 201.
reusable: false (padrão) fecha a sessão no primeiro pagamento. reusable: true gera um pedido novo a cada pagamento.
Autenticação
Todos os endpoints abaixo usam Authorization: Bearer {connectKey}.
- Prefixo
CONVD…/CONVDSANDBOX…→ API v1 (Vindi). - Keys
CON…/CONSANDBOX…(PagBank) não autenticam nesta API v1.
Validação rápida: GET https://api.pbintegracoes.com/v1/connectInfo com o mesmo Bearer.
curl -sS 'https://api.pbintegracoes.com/v1/connectInfo' \
-H "Authorization: Bearer $CONNECT_KEY" \
-H "Accept: application/json"Endpoints (lojista)
| Operação | Método | Path | HTTP |
|---|---|---|---|
| Criar sessão | POST | /checkouts | 201 |
| Consultar sessão | GET | /checkouts/{id} | 200 |
| Inativar | POST | /checkouts/{id}/inactivate | 200 |
| Cancelar assinatura | POST | /subscriptions/{id}/cancel | 200 |
A página hospedada usa rotas internas (tokenização, parcelas, frete, pagamento). Sua integração não precisa chamá-las — basta criar a sessão e enviar o comprador para url.
POST /checkouts
POSThttps://api.pbintegracoes.com/v1/checkouts→ 201
Cria a sessão e devolve o link de pagamento.
Body
| Campo | Tipo | Notas |
|---|---|---|
reference_id | string | Opcional. Seu id interno; default gerado. |
items[] | array | Itens. Ou use amount (centavos) + description no lugar. |
items[].unit_amount | int | Centavos. Quantidade ≥ 1. |
items[].image_url | string | Opcional. https + .png/.jpg/.jpeg/.gif/.webp (sem SVG). |
items[].width/length/depth/weight | number | Obrigatórios se shipping.type = CALCULATE (mm e g). |
discount_amount | int | Centavos. Total items − discount ≥ 100. |
customer | object | Prefill opcional (name, email, tax_id, phone, address). |
customer.address | object | Endereço de cobrança (não é entrega). |
customer_modifiable | bool | Default true. false trava campos já preenchidos. |
shipping | object | FIXED | FREE | CALCULATE. Ver seção Frete. |
payment_methods | array | CREDIT_CARD, PIX, BOLETO. Default: os três. Com recurrence → só cartão. |
payment_methods_configs | array | INSTALLMENTS_LIMIT e INTEREST_FREE_INSTALLMENTS. |
notification_urls | string[] | Webhooks após pagamento. |
return_url | string | Alias: redirect_url. |
cancel_url | string | Opcional. |
expiration_date | string | ISO opcional → expires_at. |
reusable | bool | Default false. |
branding | object | name, theme, colors (painel até 5), logo_url opcional, font. |
extras.summary_background_image | string | https png/jpg/webp (ou auto=format). |
analytics.ga4_measurement_id | string | G-… |
recurrence | object | Assinatura (só cartão). |
Exemplo
{
"reference_id": "pedido-1001",
"customer_modifiable": true,
"customer": {
"name": "Maria Silva",
"email": "maria@example.com",
"tax_id": "39053344705",
"phone": "11999990000",
"address": {
"street": "Avenida Brigadeiro Faria Lima",
"number": "1384",
"complement": "cj 12",
"locality": "Pinheiros",
"city": "São Paulo",
"region_code": "SP",
"country": "BRA",
"postal_code": "01452002"
}
},
"items": [
{
"reference_id": "sku-1",
"name": "Camiseta",
"quantity": 1,
"unit_amount": 7900,
"image_url": "https://loja.example/produtos/camiseta.jpg"
}
],
"discount_amount": 0,
"shipping": {
"type": "FIXED",
"service_type": "SEDEX",
"amount": 1234,
"estimated_delivery_time_in_days": 5,
"address_modifiable": true
},
"payment_methods": [
{ "type": "CREDIT_CARD" },
{ "type": "PIX" },
{ "type": "BOLETO" }
],
"payment_methods_configs": [
{
"type": "credit_card",
"config_options": [
{ "option": "INSTALLMENTS_LIMIT", "value": "12" },
{ "option": "INTEREST_FREE_INSTALLMENTS", "value": "3" }
]
}
],
"notification_urls": ["https://loja.example/webhook"],
"return_url": "https://loja.example/pedido/obrigado",
"cancel_url": "https://loja.example/pedido/cancelado",
"reusable": false,
"branding": {
"name": "Loja Exemplo",
"theme": "painel",
"colors": ["#171717", "#171717", "#f5f5f4", "#171717", "#ffffff"],
"font": "inter",
"logo_url": "https://loja.example/logo.png"
},
"extras": {
"summary_background_image": "https://loja.example/bg.jpg"
},
"analytics": {
"ga4_measurement_id": "G-XXXXXXXX"
}
}curl -sS -X POST 'https://api.pbintegracoes.com/v1/checkouts' \
-H "Authorization: Bearer $CONNECT_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d @checkout-session.jsonResposta e links
{
"id": "chk_…",
"url": "https://checkout.pbintegracoes.com/c/chk_…",
"status": "OPEN",
"expires_at": null,
"expiration_date": null,
"links": [
{
"rel": "SELF",
"href": "https://api.pbintegracoes.com/v1/checkouts/chk_…",
"method": "GET"
},
{
"rel": "PAY",
"href": "https://checkout.pbintegracoes.com/c/chk_…",
"method": "GET"
},
{
"rel": "INACTIVATE",
"href": "https://api.pbintegracoes.com/v1/checkouts/chk_…/inactivate",
"method": "POST"
}
]
}url é a página do comprador. Os links trazem rel, href e method:
| rel | method | Destino |
|---|---|---|
SELF | GET | API …/checkouts/{id} (consultar com Bearer) |
PAY | GET | Página hospedada (mesmo que url) |
INACTIVATE | POST | Só se status = OPEN |
ORDER | GET | Um por id em order_ids (após pagamento) |
Diferente do PagBank: aqui SELF é a API e PAY é o checkout. Não trate as duas URLs como iguais.
GET /checkouts/{id}
GEThttps://api.pbintegracoes.com/v1/checkouts/{id}→ 200
Com Bearer: status, order_ids, notification_urls, url e links. Útil para acompanhar se a sessão ainda está OPEN ou já gerou pedidos.
POST /checkouts/{id}/inactivate
POSThttps://api.pbintegracoes.com/v1/checkouts/{id}/inactivate→ 200
Fecha a sessão. Resposta: { "id", "status": "INACTIVE" }.
POST /subscriptions/{id}/cancel
POSThttps://api.pbintegracoes.com/v1/subscriptions/{id}/cancel→ 200
Cancela assinatura criada por um checkout com recurrence. Id no formato sub_….
Cobrança vs entrega
No create, customer.address é o endereço de cobrança (prefill). Não existe billing_address separado. O endereço de entrega, quando houver frete, é tratado na página hospedada.
Frete no create (shipping)
Configure no body do POST /checkouts:
| type | Comportamento |
|---|---|
FIXED | Valor pré-calculado (amount em centavos). Opcional: service_type (SEDEX/PAC), estimated_delivery_time_in_days. |
FREE | Frete grátis (amount = 0). Mesmos campos opcionais. |
CALCULATE | Cotação na página (Envio Fácil): origin_postal_code + boxes[] + dimensões nos itens. |
address_modifiable (default true): se false, shipping.address é obrigatório.
Snapshot canônico: após o pagamento, GET /checkouts/{id}, o order do complete e os webhooks devolvem o frete efetivo (address de entrega, amount, type, service_type/provider/method) — seja FIXED do create ou CALCULATE cotado na página. No complete, com frete físico envie shipping.address (entrega); customer.address continua sendo cobrança.
Compatibilidade: quote: "envio_facil" → CALCULATE; só amount (sem type) → FIXED.
Parcelas no create
Defina limites em payment_methods_configs. A página hospedada calcula e exibe as opções ao comprador.
{
"type": "credit_card",
"config_options": [
{ "option": "INSTALLMENTS_LIMIT", "value": "12" },
{ "option": "INTEREST_FREE_INSTALLMENTS", "value": "3" }
]
}INSTALLMENTS_LIMIT— máx. 1–12 (default 12).INTEREST_FREE_INSTALLMENTS— 0 ou ≥ 2; nunca 1.
Branding e extras
| Campo | Tipo | Notas |
|---|---|---|
branding.theme | string | painel (até 5 cores), coluna (2), central (3). |
branding.colors | string[] | Hex #RRGGBB. painel: botão, resumo, fundo, texto, texto do resumo. |
branding.logo_url | string | Opcional. https … .png/.jpg/.jpeg/.webp |
branding.name | string | Nome da loja (até 80). Pode usar só o nome, sem logo. |
branding.font | string | inter (padrão), system, georgia ou arial. |
extras.summary_background_image | string | Fundo do resumo (URL da imagem). |
Recorrência
Só cartão. interval.unit = MONTH ou YEAR com length: 1. billing_cycles opcional.
{
"name": "Assinatura mensal",
"interval": { "unit": "MONTH", "length": 1 },
"billing_cycles": 12
}A primeira cobrança fica na página hospedada; renovações são cobradas pelo job da PB. Cancele com POST /subscriptions/{id}/cancel.