Catálogo completo
Produtos, subprodutos, fotos e entregas.
Referência · API v1
Gerencie catálogo e estoque, gere cobranças Pix, acompanhe pagamentos, solicite saques e consulte seus dados com uma única chave LoopPay.
Produtos, subprodutos, fotos e entregas.
Confirmação na instituição e crédito sem duplicidade.
Permissões, idempotência e logs de requisições.
# Domínio público temporário da LoopPay: flowpayments.net.
LOOPPAY_URL=https://flowpayments.net
LOOPPAY_API_KEY=loopSUA_CHAVE_DE_16_CARACTERES
# Base: $LOOPPAY_URL/api/v1O ambiente sandbox ou produção é definido no servidor da plataforma. A chamada não pode trocar esse ambiente. As moedas EUR, GBP e USDT do cadastro de links não habilitam recebimento via esta API Pix; o recebimento implementado é BRL.
Crie uma chave em Dashboard → API Keys. Copie o segredo exibido uma única vez e envie Authorization: Bearer SUA_CHAVE. A chave identifica a aplicação; nenhum applicationId enviado pelo cliente muda a loja autorizada. Chaves revogadas ou expiradas retornam 401.
Permissões de escrita exigem também a leitura correspondente na criação da chave. Estoque privado, pagamentos, saques, aprovação de saque, métricas e avaliações têm permissões separadas. Chaves anteriores não recebem novas permissões automaticamente. Integre pelo seu servidor: não há autenticação por cookies nem liberação CORS para expor a chave no site do comprador.
curl "$LOOPPAY_URL/api/v1/products?limit=20&page=1" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Valores em centavos inteiros: 2500 = R$ 25,00. Agregados financeiros podem vir como strings para preservar precisão. Datas ISO 8601 em UTC. Listas usam page e limit (1–100, padrão 20), com items, total, page e limit. from é inclusivo; to é exclusivo.
POST, PATCH e PUT exigem Idempotency-Key com UUID. Gere uma vez por operação e reutilize com o mesmo corpo em novas tentativas. Operação concluída retorna replayed: true; outro corpo retorna 409. Até 120 chamadas por minuto por chave; 429 inclui Retry-After: 60. Cobranças e saques também têm limites próprios.
Em 503, a requisição pode ter sido aceita pela instituição. Não crie uma nova cobrança ou saque cegamente. Use operationId para consultar o recurso: em pagamentos, GET /payments?requestKey=operationId; em saques e catálogo, operationId é o ID reservado. Se houver pagamento em creating, POST /payments/id/refresh tenta recuperar a cobrança. Se uma operação permanece em andamento, o mesmo Idempotency-Key retorna 409 em vez de executá-la novamente.
{
"data": {
"id": "identificador-do-recurso"
},
"requestId": "uuid-da-requisicao"
}{
"error": {
"code": "scope_required",
"message": "Permissão necessária: payments:write."
},
"requestId": "uuid-da-requisicao"
}| 200 / 201 | Consulta ou alteração concluída / recurso criado. |
|---|---|
| 400 / 413 / 415 | Dados inválidos / corpo grande / conteúdo diferente de JSON. |
| 401 / 403 | Chave inválida / permissão insuficiente. |
| 404 / 405 | Recurso da aplicação não encontrado / método indisponível. |
| 409 | Conflito de idempotência, estoque alterado, saldo ou recurso indisponível. |
| 429 | Limite de requisições atingido. |
| 503 | Banco ou instituição indisponível; consulte o recurso antes de repetir. |
Crie uma categoria e depois um produto. Nome e preço são obrigatórios; descrição, imagem e subprodutos são opcionais.
Para entrega automática, configure deliveryType automatic e cadastre estoque com stockText. Para manual, o vendedor envia o conteúdo depois do pagamento.
Se houver variações, crie subprodutos com preço e estoque próprios. Use o id da opção comprada em productId.
Gere um pagamento com name, email, productId e quantity. Exiba o br_code como QR Code ou Pix copia e cola.
Consulte o estado ou chame refresh. O webhook assinado da Woovi e a reconciliação conferem o pagamento na instituição. Não há endpoint público para forçar aprovação.
Em produção, a confirmação credita o valor líquido uma única vez e entrega o estoque. O comprador vê o conteúdo no checkout; a integração consulta /delivery. No sandbox não há crédito real nem consumo de estoque.
Taxa por pagamento: 2% + R$ 0,50, arredondada em centavos. Os dados do estoque ficam criptografados no banco. Um pedido sem estoque suficiente após confirmação fica aguardando o vendedor. A verificação usa a API oficial da Woovi; a chave da instituição fica somente no servidor da plataforma.
Cadastre um destino HTTPS público, selecione eventos e guarde o segredo whsec_. Cada envio usa X-LoopPay-Event-Id, X-LoopPay-Delivery-Id, X-LoopPay-Timestamp e X-LoopPay-Signature. A assinatura é v1=HEX(HMAC-SHA256(secret, timestamp + '.' + corpo bruto)). Valide antes de interpretar o JSON, rejeite timestamps com mais de 5 minutos de diferença e deduplique event.id no banco.
A entrega pode repetir e chegar fora de ordem. Responda 2xx após persistir o evento em uma fila durável. Até 8 tentativas com espera crescente: 1 min, 5 min, 15 min, 1 h, 3 h, 6 h e 24 h. Redirecionamentos não são seguidos. Produtos e avaliações têm environment null; pagamentos e saques respeitam o ambiente selecionado. Eventos não incluem estoque privado ou chave Pix.
O worker deve ser agendado no servidor. O botão Processar pendentes permite processamento manual pelo painel. Testes retornam 202 quando enfileirados, não quando entregues. Consulte tentativas e reprocessamentos em Fluxos → Logs → Webhooks.
Exemplo de validação e guia para IA →Catálogo
/api/v1/productsproducts:readProdutos principais da aplicação. Use q para buscar pelo nome. Os subprodutos têm uma listagem própria.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": null,
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/products" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Catálogo
/api/v1/productsproducts:writeCria o produto no banco e retorna o endereço de checkout. Valores recebidos usam camelCase; projeções do banco usam snake_case.
namestringObrigatórioNome de 2 a 120 caracteres.
priceCentsintegerObrigatórioPreço unitário em centavos. De 1 a 999999999; preço × quantidade mínima deve ser pelo menos 200.
descriptionstringDescrição de até 10000 caracteres. Padrão: vazio.
slugstringEndereço com até 100 caracteres. Gerado a partir do nome se omitido.
comparePriceCentsinteger | nullPreço anterior; deve ser igual ou maior que o preço atual. Padrão: null.
minQuantityintegerQuantidade mínima de 1 a 10000. Padrão: 1.
maxQuantityintegerMáximo por pedido, de minQuantity a 10000. Padrão: 10000.
deliveryTypemanual | automaticmanual: entrega pelo vendedor. automatic: consome o estoque após confirmação em produção. Padrão: manual.
stockFormatlines | blocklines: uma unidade por linha. block: todo o texto é uma unidade. Padrão: lines.
stockTextstringConteúdo privado de até 100000 caracteres. Exige também stock:write. Omitido na edição preserva o estoque.
instructionsstringInstruções após pagamento, até 5000 caracteres. Nunca são enviadas ao comprador antes da confirmação.
imageUrlstringURL HTTPS pública, até 2000 caracteres. Também pode enviar a imagem em /image.
videoUrlstringURL HTTPS do vídeo, até 2000 caracteres.
categoryIduuid | nullCategoria da mesma aplicação. Padrão: null.
visiblebooleanExibe e permite a compra quando true. Padrão: true. false preserva o histórico.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": null,
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/products" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Acesso mensal",
"priceCents": 2500,
"description": "Licença por 30 dias",
"deliveryType": "manual",
"imageUrl": "https://sua-loja.com/produto.png"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Catálogo
/api/v1/products/{id}products:readRetorna nome, preço, descrição, foto, estoque disponível, entrega, categoria, parent_id e links. Não retorna conteúdo privado do estoque.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": null,
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Catálogo
/api/v1/products/{id}products:writeEnvie apenas os campos que deseja alterar. Para desativar sem apagar pedidos, envie visible: false. Ao mudar o formato do estoque ou o tipo de entrega, envie também stockText e tenha stock:write.
namestringNome de 2 a 120 caracteres.
priceCentsintegerPreço unitário em centavos. De 1 a 999999999; preço × quantidade mínima deve ser pelo menos 200.
descriptionstringDescrição de até 10000 caracteres. Padrão: vazio.
slugstringEndereço com até 100 caracteres. Gerado a partir do nome se omitido.
comparePriceCentsinteger | nullPreço anterior; deve ser igual ou maior que o preço atual. Padrão: null.
minQuantityintegerQuantidade mínima de 1 a 10000. Padrão: 1.
maxQuantityintegerMáximo por pedido, de minQuantity a 10000. Padrão: 10000.
deliveryTypemanual | automaticmanual: entrega pelo vendedor. automatic: consome o estoque após confirmação em produção. Padrão: manual.
stockFormatlines | blocklines: uma unidade por linha. block: todo o texto é uma unidade. Padrão: lines.
stockTextstringConteúdo privado de até 100000 caracteres. Exige também stock:write. Omitido na edição preserva o estoque.
instructionsstringInstruções após pagamento, até 5000 caracteres. Nunca são enviadas ao comprador antes da confirmação.
imageUrlstringURL HTTPS pública, até 2000 caracteres. Também pode enviar a imagem em /image.
videoUrlstringURL HTTPS do vídeo, até 2000 caracteres.
categoryIduuid | nullCategoria da mesma aplicação. Padrão: null.
visiblebooleanExibe e permite a compra quando true. Padrão: true. false preserva o histórico.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": null,
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X PATCH "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Acesso mensal Premium",
"priceCents": 3000,
"visible": true
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Mídia
/api/v1/products/{id}/imageproducts:writeValida a assinatura do arquivo, hospeda no bucket público product-media e vincula ao produto. Até 2 MB; PNG, JPEG ou WebP. Não envie arquivos de entrega neste bucket.
base64stringObrigatórioConteúdo do arquivo em base64, sem prefixo data:.
contentTypestringObrigatórioimage/png, image/jpeg ou image/webp; deve corresponder ao arquivo.
{
"data": {
"productId": "00000000-0000-4000-8000-000000000001",
"imageUrl": "https://seu-projeto.supabase.co/storage/v1/object/public/product-media/foto.png"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001/image" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"base64": "BASE64_DO_ARQUIVO",
"contentType": "image/png"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Subprodutos
/api/v1/products/{id}/subproductsproducts:readOpções independentes do produto principal. Cada opção tem id, nome, preço, descrição, foto e estoque próprios.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": null,
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001/subproducts" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Subprodutos
/api/v1/products/{id}/subproductsproducts:writeUsa os mesmos campos de um produto. Até 50 opções por produto, sem níveis aninhados. Para editar depois, use PATCH /products/{id_do_subproduto}. Comprar usa productId do subproduto. O produto principal continua sendo uma opção.
namestringObrigatórioNome de 2 a 120 caracteres.
priceCentsintegerObrigatórioPreço unitário em centavos. De 1 a 999999999; preço × quantidade mínima deve ser pelo menos 200.
descriptionstringDescrição de até 10000 caracteres. Padrão: vazio.
slugstringEndereço com até 100 caracteres. Gerado a partir do nome se omitido.
comparePriceCentsinteger | nullPreço anterior; deve ser igual ou maior que o preço atual. Padrão: null.
minQuantityintegerQuantidade mínima de 1 a 10000. Padrão: 1.
maxQuantityintegerMáximo por pedido, de minQuantity a 10000. Padrão: 10000.
deliveryTypemanual | automaticmanual: entrega pelo vendedor. automatic: consome o estoque após confirmação em produção. Padrão: manual.
stockFormatlines | blocklines: uma unidade por linha. block: todo o texto é uma unidade. Padrão: lines.
stockTextstringConteúdo privado de até 100000 caracteres. Exige também stock:write. Omitido na edição preserva o estoque.
instructionsstringInstruções após pagamento, até 5000 caracteres. Nunca são enviadas ao comprador antes da confirmação.
imageUrlstringURL HTTPS pública, até 2000 caracteres. Também pode enviar a imagem em /image.
videoUrlstringURL HTTPS do vídeo, até 2000 caracteres.
categoryIduuid | nullCategoria da mesma aplicação. Padrão: null.
visiblebooleanExibe e permite a compra quando true. Padrão: true. false preserva o histórico.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Acesso mensal",
"description": "Licença digital por 30 dias",
"price_cents": 2500,
"delivery_type": "automatic",
"stock_format": "lines",
"stock_count": 2,
"image_url": "https://sua-loja.com/produto.png",
"parent_id": "00000000-0000-4000-8000-000000000001",
"visible": true,
"checkout_path": "/checkout/00000000-0000-4000-8000-000000000001"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001/subproducts" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Acesso anual",
"priceCents": 24000,
"description": "12 meses de acesso",
"deliveryType": "manual"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Estoque e entrega
/api/v1/products/{id}/stockstock:readRetorna o conteúdo descriptografado somente para a integração autorizada. A versão deve acompanhar a substituição do estoque. Não exponha esta chamada no navegador do comprador.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"productId": "00000000-0000-4000-8000-000000000001",
"stockText": "LICENCA-A\nLICENCA-B",
"stockCount": 2,
"stockFormat": "lines",
"version": "2026-11-02T18:00:00.000Z"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001/stock" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Estoque e entrega
/api/v1/products/{id}/stockstock:writeSubstitui todo o conteúdo, não acrescenta. Para repor, leia a versão atual e envie o conteúdo desejado. Se outra operação alterou o produto, retorna 409 stock_changed. Estoque automático é consumido uma única vez por pagamento confirmado.
stockTextstringObrigatórioAté 100000 caracteres; linhas vazias não contam.
stockFormatlines | blockObrigatórioUma unidade por linha ou todo o conteúdo em uma unidade.
versionstringObrigatórioValor version da consulta de estoque.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"stock_count": 2,
"stock_format": "lines",
"updated_at": "2026-11-02T18:01:00Z"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X PUT "$LOOPPAY_URL/api/v1/products/00000000-0000-4000-8000-000000000001/stock" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"stockText": "LICENCA-A\nLICENCA-B",
"stockFormat": "lines",
"version": "2026-11-02T18:00:00.000Z"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Categorias
/api/v1/categoriesproducts:readCategorias da aplicação, paginadas.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Licenças",
"slug": "licencas",
"visible": true
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/categories" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Categorias
/api/v1/categoriesproducts:writeOrganiza os produtos da aplicação.
namestringObrigatório2 a 80 caracteres; não pode ser Sem categoria.
subtitlestringAté 160 caracteres.
descriptionstringAté 2000 caracteres.
slugstringAté 100 caracteres; gerado do nome se omitido.
visiblebooleanPadrão: true.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Licenças",
"slug": "licencas",
"visible": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/categories" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Licenças",
"subtitle": "Entrega digital",
"visible": true
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Categorias
/api/v1/categories/{id}products:writeAceita os mesmos campos da criação; envie somente as alterações.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Licenças digitais",
"visible": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X PATCH "$LOOPPAY_URL/api/v1/categories/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Licenças digitais",
"visible": true
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Pagamentos Pix
/api/v1/paymentspayments:writeGera cobrança Pix dinâmica na Woovi e salva a reserva na aplicação da chave. Informe productId e quantity para vender um produto/subproduto; o servidor determina o preço. Para cobrança avulsa, omita productId e informe title e amountCents. Moeda de recebimento: BRL.
namestringObrigatórioNome do comprador; 2 a 100 caracteres.
emailstringObrigatórioE-mail válido, até 254 caracteres.
productIduuidID do produto ou subproduto da aplicação. Não enviar amountCents neste modo.
quantityintegerPadrão 1; deve respeitar os limites e o estoque do produto.
titlestringObrigatório para cobrança avulsa; 2 a 120 caracteres.
amountCentsintegerObrigatório para cobrança avulsa; 200 a 100000000 centavos.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"environment": "sandbox",
"amount_cents": 2500,
"fee_cents": 100,
"net_cents": 2400,
"status": "pending",
"br_code": "000201…",
"expires_at": "2026-11-02T19:00:00Z",
"paid_at": null,
"kind": "product",
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1,
"requestKey": "00000000-0000-4000-8000-000000000001"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/payments" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1,
"name": "Cliente exemplo",
"email": "cliente@exemplo.com"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Pagamentos Pix
/api/v1/paymentspayments:readFiltre por status (creating, pending, completed, expired) ou requestKey retornado na criação. Ambiente definido pelo servidor. A consulta não força confirmação na instituição.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"environment": "sandbox",
"amount_cents": 2500,
"fee_cents": 100,
"net_cents": 2400,
"status": "pending",
"br_code": "000201…",
"expires_at": "2026-11-02T19:00:00Z",
"paid_at": null,
"kind": "product",
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/payments" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Pagamentos Pix
/api/v1/payments/{id}payments:readRetorna o estado salvo. completed é confirmação; pending não libera saldo. Conteúdo de entrega fica na rota /delivery.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"environment": "sandbox",
"amount_cents": 2500,
"fee_cents": 100,
"net_cents": 2400,
"status": "pending",
"br_code": "000201…",
"expires_at": "2026-11-02T19:00:00Z",
"paid_at": null,
"kind": "product",
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/payments/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Pagamentos Pix
/api/v1/payments/{id}/refreshpayments:writeConsulta a cobrança na Woovi e confere correlação, valor e ambiente. Somente uma confirmação válida credita a carteira; chamadas repetidas não duplicam crédito ou entrega. Não aceita status informado pelo cliente. Envie {} no corpo.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"environment": "sandbox",
"amount_cents": 2500,
"fee_cents": 100,
"net_cents": 2400,
"status": "completed",
"br_code": "000201…",
"expires_at": "2026-11-02T19:00:00Z",
"paid_at": "2026-11-02T18:02:00Z",
"kind": "product",
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/payments/00000000-0000-4000-8000-000000000001/refresh" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Estoque e entrega
/api/v1/payments/{id}/deliveryorders:readConteúdo e instruções ficam disponíveis após confirmação em produção. No modo automático, o comprador também os vê no checkout original. No sandbox, o estoque não é consumido e content é null.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"status": "delivered",
"content": "LICENCA-A",
"instructions": "Use esta licença no seu aplicativo."
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/payments/00000000-0000-4000-8000-000000000001/delivery" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Estoque e entrega
/api/v1/payments/{id}/deliveryorders:writeSalva uma entrega privada para produto pago em produção com delivery_status waiting_seller. O conteúdo aparece no checkout do comprador. Não substitui uma entrega já concluída.
contentstringObrigatórioConteúdo de entrega com 1 a 100000 caracteres.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"delivery_status": "delivered"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/payments/00000000-0000-4000-8000-000000000001/delivery" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"content": "Seu acesso está disponível: instruções de ativação."
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Saques
/api/v1/withdrawalswithdrawals:writeReserva saldo e cria a transferência sem aprová-la. Tarifa R$ 0,70; mínimo líquido R$ 10,00. O saldo é da conta do proprietário e é compartilhado entre lojas. O ambiente acompanha a configuração do servidor. Não é necessário chamar Account Data Check.
keyTypeCPF | CNPJ | EMAIL | PHONE | RANDOMObrigatórioTipo da chave Pix.
keystringObrigatórioChave de destino; telefone em formato internacional. Guardada criptografada.
amountCentsintegerObrigatórioValor líquido, ou total caso deductFee seja true. Máximo 100000000.
deductFeebooleanfalse: soma tarifa ao total reservado. true: deduz tarifa do valor informado.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"pix_key_type": "EMAIL",
"pix_key_mask": "•••• .com",
"amount_cents": 1000,
"fee_cents": 70,
"total_cents": 1070,
"status": "created",
"provider_status": "CREATED"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/withdrawals" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"keyType": "EMAIL",
"key": "financeiro@exemplo.com",
"amountCents": 1000,
"deductFee": false
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Saques
/api/v1/withdrawalswithdrawals:readLista solicitações da aplicação no ambiente atual. As chaves Pix aparecem mascaradas.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"environment": "sandbox",
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"pix_key_type": "EMAIL",
"pix_key_mask": "•••• .com",
"amount_cents": 1000,
"fee_cents": 70,
"total_cents": 1070,
"status": "created",
"provider_status": "CREATED"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/withdrawals" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Saques
/api/v1/withdrawals/{id}withdrawals:readConsulta local paginada, com items contendo no máximo a solicitação informada.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"environment": "sandbox",
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"pix_key_type": "EMAIL",
"pix_key_mask": "•••• .com",
"amount_cents": 1000,
"fee_cents": 70,
"total_cents": 1070,
"status": "created",
"provider_status": "CREATED"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/withdrawals/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Saques
/api/v1/withdrawals/{id}/approvewithdrawals_approval:writeAutoriza o envio à chave cadastrada. Use uma chave com esta permissão apenas no servidor. CREATED ainda não é transferência concluída; completed exige CONFIRMED da instituição. Envie {}.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"pix_key_type": "EMAIL",
"pix_key_mask": "•••• .com",
"amount_cents": 1000,
"fee_cents": 70,
"total_cents": 1070,
"status": "processing",
"provider_status": "APPROVED"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/withdrawals/00000000-0000-4000-8000-000000000001/approve" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Saques
/api/v1/withdrawals/{id}/refreshwithdrawals:writeAtualiza o estado pela Woovi. Falha definitiva libera a reserva uma única vez; resposta desconhecida mantém o valor reservado. Em produção, chamadas não retornam de completed para failed. Envie {}.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"pix_key_type": "EMAIL",
"pix_key_mask": "•••• .com",
"amount_cents": 1000,
"fee_cents": 70,
"total_cents": 1070,
"status": "completed",
"provider_status": "CONFIRMED"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/withdrawals/00000000-0000-4000-8000-000000000001/refresh" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Dados e relatórios
/api/v1/balancemetrics:readSaldo em centavos como string. Em produção, considera a carteira real e reservas de saque. No sandbox, considera somente os pagamentos simulados e saques de teste.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"currency": "BRL",
"environment": "sandbox",
"availableCents": "2400",
"scope": "owner_account",
"sharedAcrossApplications": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/balance" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Dados e relatórios
/api/v1/metricsmetrics:readParâmetros from e to em ISO 8601; início inclusivo e fim exclusivo. Padrão: últimos 30 dias. Receita exclui depósitos. MRR usa assinaturas ativas e pagas, normalizadas em 30 dias; é indicador de recorrência, não cobrança automática.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"currency": "BRL",
"environment": "production",
"grossCents": "2500",
"feeCents": "100",
"netCents": "2400",
"approvedPayments": 1,
"sales": 1,
"pendingPayments": 0,
"mrrCents": "2500",
"mrrBasis": "30_days_active_paid_subscriptions"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/metrics" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Dados e relatórios
/api/v1/reportsmetrics:readExportação JSON paginada com valores brutos, taxas, líquidos, ambiente, datas e estado. Use from e to (ISO 8601). Datas UTC; centavos inteiros. Percorra as páginas até atingir total.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"environment": "sandbox",
"amount_cents": 2500,
"fee_cents": 100,
"net_cents": 2400,
"status": "pending",
"br_code": "000201…",
"expires_at": "2026-11-02T19:00:00Z",
"paid_at": null,
"kind": "product",
"productId": "00000000-0000-4000-8000-000000000001",
"quantity": 1
}
],
"total": 1,
"page": 1,
"limit": 20,
"environment": "sandbox",
"currency": "BRL"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/reports" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Clientes e pedidos
/api/v1/customerscustomers:readClientes da aplicação, criados por compras reais ou pelo painel. Dados pessoais devem ser utilizados somente pela integração autorizada.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Cliente exemplo",
"email": "cliente@exemplo.com",
"tags": []
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/customers" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Clientes e pedidos
/api/v1/ordersorders:readPedidos registrados em produção, com produto, valor, cliente, estado e referência. Pagamentos de sandbox não geram pedidos reais.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"order_reference": "00000000-0000-4000-8000-000000000001",
"product_name": "Acesso mensal",
"amount_cents": 2500,
"status": "approved",
"delivery_type": "automatic"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/orders" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Avaliações
/api/v1/reviewsreviews:readFiltro status: pending, published ou hidden. A API não fabrica avaliações: o envio pelo comprador continua exigindo uma compra verificada e autenticação.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"product_id": "00000000-0000-4000-8000-000000000001",
"display_name": "Cliente",
"rating": 5,
"body": "Entrega rápida.",
"status": "pending",
"owner_reply": null
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/reviews" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Avaliações
/api/v1/reviews/{id}reviews:writePublica, oculta ou responde uma avaliação recebida. Não altera a nota nem o texto do comprador.
statuspending | published | hiddenNovo estado da moderação.
replystringResposta de até 2000 caracteres. Vazio remove a resposta.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"status": "published",
"owner_reply": "Obrigado pela confiança!"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X PATCH "$LOOPPAY_URL/api/v1/reviews/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"status": "published",
"reply": "Obrigado pela confiança!"
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Logs
/api/v1/logslogs:readRequisições autenticadas da aplicação: método, rota normalizada, HTTP status, duração, erro, ID da chave e requestId. Sem cabeçalhos de autenticação, corpo, conteúdo do estoque ou chave Pix. Também disponível em Fluxos → Logs → Requisições da API.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"method": "POST",
"route": "/api/v1/payments",
"status": 201,
"duration_ms": 340,
"error_code": null
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/logs" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Categorias
/api/v1/categories/{id}products:readConsulta filtrada pelo UUID. A resposta usa items com no máximo um recurso da aplicação. Categorias da aplicação, paginadas.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Licenças",
"slug": "licencas",
"visible": true
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/categories/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Clientes e pedidos
/api/v1/customers/{id}customers:readConsulta filtrada pelo UUID. A resposta usa items com no máximo um recurso da aplicação. Clientes da aplicação, criados por compras reais ou pelo painel. Dados pessoais devem ser utilizados somente pela integração autorizada.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Cliente exemplo",
"email": "cliente@exemplo.com",
"tags": []
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/customers/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Clientes e pedidos
/api/v1/orders/{id}orders:readConsulta filtrada pelo UUID. A resposta usa items com no máximo um recurso da aplicação. Pedidos registrados em produção, com produto, valor, cliente, estado e referência. Pagamentos de sandbox não geram pedidos reais.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"order_reference": "00000000-0000-4000-8000-000000000001",
"product_name": "Acesso mensal",
"amount_cents": 2500,
"status": "approved",
"delivery_type": "automatic"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/orders/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Avaliações
/api/v1/reviews/{id}reviews:readConsulta filtrada pelo UUID. A resposta usa items com no máximo um recurso da aplicação. Filtro status: pending, published ou hidden. A API não fabrica avaliações: o envio pelo comprador continua exigindo uma compra verificada e autenticação.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"product_id": "00000000-0000-4000-8000-000000000001",
"display_name": "Cliente",
"rating": 5,
"body": "Entrega rápida.",
"status": "pending",
"owner_reply": null
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/reviews/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Webhooks
/api/v1/webhookswebhooks:readLista destinos da aplicação, sem o segredo de assinatura. Até 10 destinos não arquivados.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": true,
"version": 1
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/webhooks" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Webhooks
/api/v1/webhooks/{id}webhooks:readConsulta nome, URL, eventos, ambiente, estado e versão. O segredo não é retornado.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": true,
"version": 1
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Webhooks
/api/v1/webhookswebhooks:writeCria um destino HTTPS público. Retorna o segredo apenas na resposta original, criptografado no banco. A repetição idempotente retorna metadados sem secret. Se perder o segredo, use /rotate.
namestringObrigatórioNome de 2 a 80 caracteres.
urlstringObrigatórioURL HTTPS pública na porta 443, até 2000 caracteres. Sem usuário, senha, fragmento ou IP literal. Segredos não devem ser colocados na URL.
eventsarrayObrigatórioLista dos eventos documentados. Ao menos um. Ex.: payment.completed e delivery.completed.
environmentsandbox | productionObrigatórioFiltra pagamentos e saques. Produtos e avaliações são eventos de catálogo, com environment null.
enabledbooleanObrigatóriotrue ativa; false pausa.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": true,
"version": 1,
"secret": "whsec_SEGREDO_DE_ASSINATURA"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/webhooks" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": true
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Webhooks
/api/v1/webhooks/{id}webhooks:writeEnvie somente os campos desejados. Mudanças se aplicam às tentativas futuras; uma requisição já em andamento pode terminar no destino anterior. Tentativas de um destino pausado são canceladas ao serem processadas.
namestringNome de 2 a 80 caracteres.
urlstringURL HTTPS pública na porta 443, até 2000 caracteres. Sem usuário, senha, fragmento ou IP literal. Segredos não devem ser colocados na URL.
eventsarrayLista dos eventos documentados. Ao menos um. Ex.: payment.completed e delivery.completed.
environmentsandbox | productionFiltra pagamentos e saques. Produtos e avaliações são eventos de catálogo, com environment null.
enabledbooleantrue ativa; false pausa.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": false,
"version": 2
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X PATCH "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{
"enabled": false
}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Webhooks
/api/v1/webhooks/{id}webhooks:writeArquiva e desativa o endpoint, preservando o histórico. Envie {} e um Idempotency-Key.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"archived": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X DELETE "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Webhooks
/api/v1/webhooks/{id}/rotatewebhooks:writeGera e retorna um novo secret apenas na resposta original. O antigo deixa de ser usado nos próximos envios. Atualize o receptor imediatamente; uma requisição já em andamento pode usar o segredo anterior.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"name": "Sistema de pedidos",
"url": "https://seu-sistema.com/webhooks/looppay",
"events": [
"payment.completed",
"delivery.completed"
],
"environment": "sandbox",
"enabled": true,
"version": 2,
"secret": "whsec_NOVO_SEGREDO"
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001/rotate" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Webhooks
/api/v1/webhooks/{id}/testwebhooks:writeCria webhook.test para o destino ativo, independente dos eventos selecionados. Não gera pagamentos. HTTP 202 significa enfileirado; acompanhe a entrega. O worker precisa estar agendado.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"eventId": "00000000-0000-4000-8000-000000000001",
"queued": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001/test" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.
Webhooks
/api/v1/webhooks/{id}/deliverieswebhooks:readHistórico paginado com HTTP status, tentativas, próxima tentativa e erro. Sem corpo da resposta remota ou segredos.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"items": [
{
"id": "00000000-0000-4000-8000-000000000001",
"endpoint_id": "00000000-0000-4000-8000-000000000001",
"event_id": "00000000-0000-4000-8000-000000000001",
"status": "retrying",
"attempts": 1,
"http_status": 500,
"error_code": "http_error",
"next_attempt_at": "2026-11-02T18:01:00Z"
}
],
"total": 1,
"page": 1,
"limit": 20
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/webhooks/00000000-0000-4000-8000-000000000001/deliveries" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Webhooks
/api/v1/webhook-deliveries/{id}webhooks:readRetorna os metadados da entrega, payload do evento e histórico de tentativas. Status: pending, processing, retrying, succeeded, failed e cancelled.
Não há corpo. Listagens aceitam page e limit. Substitua {id}, quando presente, pelo UUID do recurso.
{
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"status": "succeeded",
"attempts": [
{
"attempt": 1,
"http_status": 200,
"duration_ms": 130,
"error_code": null
}
],
"payload": {
"id": "00000000-0000-4000-8000-000000000001",
"type": "payment.completed",
"environment": "sandbox",
"data": {
"id": "00000000-0000-4000-8000-000000000001",
"status": "completed",
"amount_cents": 2500
}
}
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X GET "$LOOPPAY_URL/api/v1/webhook-deliveries/00000000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $LOOPPAY_API_KEY"Webhooks
/api/v1/webhook-deliveries/{id}/retrywebhooks:writeSomente failed, destino ativo e no máximo 3 reprocessamentos manuais. Enfileira novo ciclo de até 8 tentativas. O event_id continua o mesmo: deduplique no receptor. Envie {}.
Envie um objeto JSON. Use a mesma chave de idempotência ao repetir esta operação.
{
"data": {
"queued": true
},
"requestId": "UUID-DA-REQUISICAO"
}Exemplo · cURL
curl -X POST "$LOOPPAY_URL/api/v1/webhook-deliveries/00000000-0000-4000-8000-000000000001/retry" \
-H "Authorization: Bearer $LOOPPAY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: UUID-UNICO-PARA-ESTA-OPERACAO" \
-d '{}'Use uma chave de idempotência UUID real. Nos exemplos, gere uma chave uma única vez e preserve-a para eventuais novas tentativas.