Para aceitar pagamento no v0 da Vercel ou no Bolt com Pix, você cria uma conta sandbox no HeroPay, guarda o token como variável de servidor e manda o prompt pronto desta página. No v0, a chave vive nas Environment Variables do projeto na Vercel e a cobrança sai de um route handler do Next.js. No Bolt, a chave vive em Secrets e a cobrança sai de uma server function do Bolt Cloud (ou de uma edge function, se o projeto usa Supabase). Nos dois, a chamada é POST /payment_links, o checkout vem pronto com Pix, boleto e cartão em até 12x, e um webhook assinado confirma o pagamento. Pix e boleto custam R$ 0 por transação.
Criar conta sandbox Ler a documentação
O essencial em 60 segundos
- O v0 gera apps Next.js que rodam na Vercel; a chave do HeroPay fica em Settings > Environment Variables do projeto e só é lida em route handler ou server action, nunca em componente de cliente.
- O Bolt gera apps fullstack com backend no Bolt Cloud; a chave fica em Secrets e só é lida dentro de uma server function (ou edge function do Supabase, se você conectou um).
- O caminho mais curto nos dois é o link de pagamento: uma chamada
POST /payment_linksdevolve a URL de um checkout pronto com Pix, boleto e cartão. - O HeroPay cobra R$ 0 por Pix e R$ 0 por boleto; no cartão, 3,49% por transação aprovada, em até 12x. Sem mensalidade, ativação ou mínimo (preços).
- O
llms.txtdo HeroPay (heropay.tech/llms.txt) resume o HeroPay para IAs e aponta para a documentação da API; colado no chat junto com o prompt desta página, que já traz o contrato da chamada, o v0 e o Bolt escrevem a integração sem inventar endpoint. - O pagamento se confirma pelo webhook, com assinatura HMAC no header
X-HeroPay-Signature, nunca pela volta do navegador à página de obrigado. - O que o HeroPay não tem hoje: integração nativa no Vercel Marketplace nem botão de conectar no Bolt. A integração é por API, e é isso que os prompts desta página resolvem.
Qual a diferença entre integrar pagamento no v0 e no Bolt?
O fluxo de dinheiro é o mesmo nos dois: o servidor cria o link, o comprador paga no checkout do HeroPay, o webhook avisa o seu app. O que muda é onde o código de servidor mora e onde a chave fica guardada.
| v0 (Vercel) | Bolt (StackBlitz) | |
|---|---|---|
| O que gera | App Next.js (React, TypeScript, Tailwind, shadcn/ui) | App fullstack, front em geral com Vite ou Next |
| Onde roda o backend | Route handlers (app/api/.../route.ts) e server actions, publicados como Vercel Functions | Server functions do Bolt Cloud, ou edge functions do Supabase se o projeto usa Supabase |
| Onde fica a chave | Menu do projeto ... > Settings > Environment Variables (vai para a Vercel) | Ícone de banco de dados > Secrets |
| Prefixo que expõe no navegador | NEXT_PUBLIC_ | VITE_ (Vite), NEXT_PUBLIC_ (Next) |
| Banco de dados | Integração do Marketplace (Supabase, Neon, Upstash) | Bolt Database (padrão) ou Supabase |
| URL do webhook | https://seu-app.vercel.app/api/webhooks/heropay | URL pública da server function heropay-webhook |
| Preview roda servidor? | Sim, o preview usa Vercel Sandbox com rotas de API e env vars | Sim, as server functions são publicadas pelo Bolt |
| Pagamento nativo da ferramenta | Stripe via Vercel Marketplace | Stripe integrado (cria as edge functions e o webhook sozinho) |
Verificado em set/2026. Fontes: v0.app/docs/faqs, vercel.com/docs/environment-variables, vercel.com/marketplace/stripe, support.bolt.new/cloud/bolt-cloud, support.bolt.new/cloud/database/secrets, support.bolt.new/cloud/database/server-functions, support.bolt.new/integrations/stripe.
Regra prática: no v0 você pensa em rota de API; no Bolt você pensa em função de servidor. Em ambos, a regra de ouro não muda: a chave vive no servidor e o preço sai do servidor.
Como aceitar pagamento no v0 ou no Bolt com o HeroPay?
Seis passos, iguais nas duas ferramentas. Onde a tela muda, o passo traz as duas versões.
Passo 1: crie sua conta sandbox
Acesse app.heropay.tech, crie a conta e copie o token de API em configurações. O token é um Bearer JWT. No sandbox, a URL base é https://api.beta.heropay.tech; em produção, https://api.heropay.tech. O sandbox é gratuito, idêntico à produção e não tem fila de homologação.
Não cole o token no chat do v0 nem do Bolt. Ele vai para a área de segredos no passo 3.
Passo 2: coloque o llms.txt no contexto
Abra o projeto e mande, como primeira mensagem:
Leia https://heropay.tech/llms.txt e a documentação em https://docs.heropay.tech e use as duas como referência da API HeroPay neste projeto. Não invente endpoints, headers nem campos que não estejam lá.O llms.txt é um arquivo de texto feito para IAs: resume o que é o HeroPay, lista as páginas do site e aponta para a documentação da API em docs.heropay.tech. É o mesmo que Claude, ChatGPT, Cursor, Lovable e outros leem quando você pede uma integração com o HeroPay. Se a ferramenta não conseguir abrir a URL, baixe o arquivo e anexe no chat. O contrato que mais importa (endpoint, headers, centavos, webhook assinado) já vai escrito no prompt do passo 4.
Passo 3: cadastre os segredos
Os mesmos três nomes nas duas ferramentas:
| Nome | Valor no sandbox |
|---|---|
HEROPAY_API_KEY | seu token do painel |
HEROPAY_API_URL | https://api.beta.heropay.tech |
HEROPAY_WEBHOOK_SECRET | o segredo de assinatura do webhook, exibido no painel (passo 5) |
- No v0: menu do projeto
...> Settings > Environment Variables. As variáveis são do projeto, então todos os chats do projeto enxergam. Não use prefixoNEXT_PUBLIC_. - No Bolt: ícone de banco de dados > Secrets, preencha Name e Value. O Bolt também abre esse painel sozinho quando o código pede um segredo. Não use prefixo
VITE_.
Passo 4: mande o prompt pronto da sua ferramenta
Copie o bloco do v0 ou do Bolt na seção O prompt pronto, troque só o que está entre colchetes e envie.
Passo 5: registre o webhook e teste no sandbox
- Publique o app (no v0, Publish; no Bolt, Publish ou deploy da server function) e pegue a URL pública do webhook que a ferramenta mostrar.
- Registre um webhook por gatilho:
for trigger in spark_payment_confirmed refunded chargeback_request; do
curl -s -X POST https://api.beta.heropay.tech/webhook \
-H "Authorization: Bearer $HEROPAY_API_KEY" \
-H "Accept: application/vnd.herospark.com; version=1" \
-H "Content-Type: application/json" \
-d "{\"webhook\":{\"trigger\":\"$trigger\",\"webhook_url\":\"https://SEU-APP/api/webhooks/heropay\",\"request_method\":\"post\"}}"
done- Copie o segredo de assinatura do webhook, exibido no painel, para
HEROPAY_WEBHOOK_SECRET. No v0, publique de novo: na Vercel, variável alterada só vale para o próximo deploy. - Clique em Comprar no app, confira o pedido
pendingno banco e faça uma compra de teste no checkout do sandbox. - Nos logs (Vercel > Logs, ou Bolt > Server Functions > View Logs), veja chegar
spark_payment_confirmede o pedido virarpaid. - Teste o caminho triste: voltar do checkout sem pagar não libera nada; um POST na URL do webhook sem assinatura válida recebe
401.
Qual prompt usar no v0 e no Bolt?
Os dois prompts pedem as mesmas peças (preço no servidor, pedido no banco, POST /payment_links, webhook com HMAC e idempotência), cada um no dialeto da ferramenta. Cole inteiro e troque só o que está entre colchetes.
Prompt pronto para o v0
Quero aceitar pagamentos neste app Next.js usando a API HeroPay (referência: https://heropay.tech/llms.txt e https://docs.heropay.tech). Siga exatamente estas regras.
CONTEXTO DO PRODUTO
- O que vendo: [ex.: "Plano Pro anual do meu app de finanças"]
- Preço: [ex.: R$ 197,00]
- Parcelamento no cartão: até [12]x
- Métodos: Pix, cartão e boleto
1. VARIÁVEIS DE AMBIENTE
Use só process.env.HEROPAY_API_KEY, process.env.HEROPAY_API_URL e process.env.HEROPAY_WEBHOOK_SECRET, que já estão nas Environment Variables do projeto. Nunca crie variável com prefixo NEXT_PUBLIC_ para elas. Nunca escreva o valor da chave no código.
2. BANCO DE DADOS
Use a integração de banco do projeto (Supabase ou Neon). Crie a tabela "orders" com: id (uuid), user_id, product_key (texto), amount_cents (inteiro), status (pending, paid, refunded, canceled; padrão pending), checkout_url (texto), heropay_payment_link_id (inteiro), paid_at (timestamp nulo), created_at.
Crie "products" com product_key, name, description e price_cents, e cadastre o produto acima. O preço vive no servidor, nunca no front.
3. CRIAR O CHECKOUT: app/api/checkout/route.ts (POST)
- Arquivo só de servidor, com import "server-only" e export const runtime = "nodejs".
- Recebe apenas product_key. Nunca aceite preço vindo do cliente.
- Busca o preço em "products", cria um pedido "pending" em "orders".
- Chama POST {HEROPAY_API_URL}/payment_links com os headers:
Authorization: Bearer {HEROPAY_API_KEY}
Accept: application/vnd.herospark.com; version=1
Content-Type: application/json
- Corpo:
{
"payment_link": {
"name": "<nome do produto>",
"description": "<descrição>",
"price_cents": <centavos, inteiro, mínimo 500>,
"absorbs_fees": true,
"max_installments": [12],
"payment_methods": ["pix", "credit_card", "bank_slip"],
"src": "<id do pedido>"
}
}
- Salve data.id em heropay_payment_link_id e data.offer.url em checkout_url.
- Devolva ao front só checkout_url e o id do pedido. Em erro da API, responda mensagem amigável e registre o corpo do erro com console.error, sem logar a chave.
4. FRONT
- Botão "Comprar" (componente de cliente) faz fetch para /api/checkout, abre checkout_url em nova aba e leva para /pedido/[id].
- Página /pedido/[id]: mostra "Aguardando pagamento" enquanto status = pending e consulta o status a cada 5 segundos. Quando status = paid, mostra "Pagamento confirmado" e libera o acesso.
- Nunca libere acesso porque o usuário voltou do checkout. Quem libera é o status "paid" gravado pelo webhook.
5. WEBHOOK: app/api/webhooks/heropay/route.ts (POST)
- export const runtime = "nodejs". Leia o corpo bruto com await request.text() ANTES de qualquer JSON.parse.
- Calcule HMAC SHA-256 do corpo bruto com HEROPAY_WEBHOOK_SECRET (node:crypto) e compare com o header X-HeroPay-Signature usando crypto.timingSafeEqual. Confira na documentação se a assinatura vem em hex ou base64; se não estiver claro, aceite os dois e me avise. Se não bater, responda 401.
- Leia o gatilho do evento e cart.src, que é o id do pedido.
- spark_payment_confirmed: marque paid e grave paid_at só se o valor pago bater com amount_cents. Idempotente: se já está paid, responda 200 e não faça nada.
- refunded ou chargeback_request: marque refunded e revogue o acesso.
- Responda 200 rápido. cart.src desconhecido: registre no log e responda 200.
- Se o llms.txt descrever a assinatura de forma diferente, siga o llms.txt e me avise.
6. ENTREGA
Ao terminar, me mostre a URL do webhook no domínio publicado (https://<meu-app>.vercel.app/api/webhooks/heropay) e procure no projeto qualquer uso de HEROPAY_ fora de app/api e de arquivos com "server-only". A resposta certa é nenhum.Prompt pronto para o Bolt
Quero aceitar pagamentos neste app usando a API HeroPay (referência: https://heropay.tech/llms.txt e https://docs.heropay.tech). Siga exatamente estas regras.
CONTEXTO DO PRODUTO
- O que vendo: [ex.: "Pacote de 100 créditos do meu app"]
- Preço: [ex.: R$ 29,90]
- Parcelamento no cartão: até [3]x
- Métodos: Pix, cartão e boleto
1. BACKEND E SEGREDOS
Todo acesso à HeroPay acontece em server functions do Bolt Cloud (se este projeto usa Supabase, em edge functions do Supabase). Leia HEROPAY_API_KEY, HEROPAY_API_URL e HEROPAY_WEBHOOK_SECRET do painel Secrets. Nunca crie variável com prefixo VITE_ ou NEXT_PUBLIC_ para elas, nunca coloque a chave em arquivo do front e nunca escreva o valor no código. Se faltar algum segredo, me peça para cadastrar em Secrets.
2. BANCO DE DADOS
Crie a tabela "orders" com: id (uuid), user_id (usuário logado), product_key (texto), amount_cents (inteiro), status (pending, paid, refunded, canceled; padrão pending), checkout_url (texto), heropay_payment_link_id (inteiro), paid_at (timestamp nulo), created_at.
Ative as regras de acesso: o usuário só lê os próprios pedidos e nunca escreve em status, amount_cents ou paid_at. Só as server functions alteram esses campos.
Crie "products" com product_key, name, description e price_cents, e cadastre o produto acima. O preço vive no servidor, nunca no front.
3. SERVER FUNCTION "create-checkout"
- Exige usuário autenticado. Recebe apenas product_key; nunca aceite preço do cliente.
- Busca o preço em "products" e cria um pedido "pending" em "orders".
- Chama POST {HEROPAY_API_URL}/payment_links com os headers:
Authorization: Bearer {HEROPAY_API_KEY}
Accept: application/vnd.herospark.com; version=1
Content-Type: application/json
- Corpo:
{
"payment_link": {
"name": "<nome do produto>",
"description": "<descrição>",
"price_cents": <centavos, inteiro, mínimo 500>,
"absorbs_fees": true,
"max_installments": [3],
"payment_methods": ["pix", "credit_card", "bank_slip"],
"src": "<id do pedido>"
}
}
- Salve data.id em heropay_payment_link_id e data.offer.url em checkout_url. Devolva ao front só checkout_url e o id do pedido.
- Em erro da API, devolva mensagem amigável e registre o corpo do erro no log da função, sem logar a chave.
4. FRONT
- Botão "Comprar": chama create-checkout, abre checkout_url em nova aba e leva para /pedido/:id.
- Página /pedido/:id: "Aguardando pagamento" enquanto status = pending, atualizando sozinha (tempo real do banco ou consulta a cada 5 segundos). Com status = paid, "Pagamento confirmado" e acesso liberado.
- Nunca libere acesso porque o usuário voltou do checkout. Quem libera é o status "paid" gravado pelo webhook.
5. SERVER FUNCTION "heropay-webhook"
- Pública (sem exigir login), só aceita POST.
- Leia o corpo bruto como texto ANTES de fazer parse. Calcule HMAC SHA-256 do corpo bruto com HEROPAY_WEBHOOK_SECRET e compare com o header X-HeroPay-Signature em tempo constante. Confira na documentação se a assinatura vem em hex ou base64; se não estiver claro, aceite os dois e me avise. Se não bater, responda 401.
- Leia o gatilho do evento e cart.src, que é o id do pedido.
- spark_payment_confirmed: marque paid e grave paid_at só se o valor pago bater com amount_cents. Idempotente: se já está paid, responda 200 e não faça nada.
- refunded ou chargeback_request: marque refunded e revogue o acesso.
- Responda 200 rápido. cart.src desconhecido: registre no log e responda 200.
- Se o llms.txt descrever a assinatura de forma diferente, siga o llms.txt e me avise.
6. ENTREGA
Ao terminar, me mostre a URL pública da função heropay-webhook, um comando curl para registrar o webhook na HeroPay e a lista de arquivos do front que leem alguma variável HEROPAY_. A resposta certa é nenhum. Não use a integração de Stripe do Bolt e não crie nada fora do que foi pedido.A última linha do prompt do Bolt existe por um motivo: quando você fala em pagamento, o Bolt tende a oferecer a integração nativa com Stripe. Ela é boa para vender em dólar, mas não traz Pix a R$ 0 nem boleto.
O que o v0 e o Bolt vão gerar?
| Peça | No v0 | No Bolt | O que faz |
|---|---|---|---|
Tabelas products e orders | Banco da integração (Supabase ou Neon) | Bolt Database ou Supabase | Guarda o preço no servidor e o status de cada pedido |
| Criar checkout | app/api/checkout/route.ts | Server function create-checkout | Chama POST /payment_links com a chave do servidor e devolve a URL |
| Página do pedido | app/pedido/[id]/page.tsx | Rota /pedido/:id | Mostra "aguardando" e vira "confirmado" quando o banco muda |
| Webhook | app/api/webhooks/heropay/route.ts | Server function heropay-webhook | Valida o HMAC, marca pago, revoga em estorno |
O webhook no v0 fica mais ou menos assim. O detalhe que mais quebra integração é ler o corpo com request.text(): se o código fizer request.json() antes, o corpo bruto se perde e a assinatura nunca bate.
// app/api/webhooks/heropay/route.ts
import crypto from "node:crypto";
export const runtime = "nodejs";
function assinaturaValida(corpo: string, recebida: string, segredo: string) {
const hmac = () => crypto.createHmac("sha256", segredo).update(corpo);
// confira o formato (hex ou base64) na documentação de webhooks e mantenha só o certo
const esperadas = [hmac().digest("hex"), hmac().digest("base64")];
const r = Buffer.from(recebida);
return esperadas.some((e) => {
const b = Buffer.from(e);
return r.length === b.length && crypto.timingSafeEqual(r, b);
});
}
export async function POST(request: Request) {
const corpo = await request.text(); // corpo bruto, antes de qualquer parse
const recebida = request.headers.get("x-heropay-signature") ?? "";
if (!assinaturaValida(corpo, recebida, process.env.HEROPAY_WEBHOOK_SECRET!)) {
return new Response("assinatura inválida", { status: 401 });
}
const evento = JSON.parse(corpo);
const pedidoId = evento.cart?.src; // o id do pedido que você mandou em src
// spark_payment_confirmed: marque paid só se ainda estiver pending (idempotência)
return new Response("ok", { status: 200 });
}No Bolt, a server function faz o mesmo: lê o texto bruto, calcula o HMAC, compara em tempo constante e só então interpreta o JSON.
O truque que liga tudo é o campo src. O valor que você manda em POST /payment_links é salvo no carrinho e volta em cart.src em todos os webhooks daquela compra. Mandando o id do pedido, o webhook sabe qual linha de orders atualizar, sem casar por e-mail ou valor. O src aceita letras, números e . _ - ~, até 255 caracteres, então um uuid passa sem ajuste.
Quais são as armadilhas mais comuns ao integrar pagamento no v0 e no Bolt?
Chave no front
É o erro mais caro. No v0, qualquer variável com NEXT_PUBLIC_ ou lida dentro de um arquivo com "use client" vai para o bundle do navegador. No Bolt, o mesmo vale para VITE_ e para qualquer .tsx do front. Com o token, alguém cria links, lê suas vendas e consulta seu saldo. A chave só existe em route handler, server action ou server function. Se vazou, regenere o token no painel na hora.
Preço vindo do navegador
Se a rota aceita price_cents do cliente, qualquer um edita a requisição e compra seu plano por R$ 5. O front manda só o identificador do produto; o preço sai da tabela products, no servidor.
Valor em reais onde a API espera centavos
price_cents é inteiro em centavos: R$ 197,00 é 19700. Mandar 197 cria um link de R$ 1,97, que a API recusa com 422 porque o mínimo é R$ 5,00 (500). No cartão, cada parcela precisa ter pelo menos R$ 1,99: um produto de R$ 29,90 vai em até 15 parcelas pela conta, mas o limite é 12x, e um de R$ 10 não passa de 5x. Ajuste max_installments ao ticket.
Confirmar pelo redirect e não pelo webhook
Voltar à página de obrigado não prova pagamento: o Pix pode ser pago minutos depois no celular, o usuário pode fechar a aba, e qualquer um digita a URL de sucesso. A única fonte de verdade é spark_payment_confirmed chegando no webhook. Confie no evento, não no redirect.
Webhook sem HMAC ou sem idempotência
Uma URL pública que marca pedidos como pagos precisa validar X-HeroPay-Signature sobre o corpo bruto, senão qualquer um forja um "pago". E a retentativa automática pode entregar o mesmo evento mais de uma vez: marcar paid só se ainda estiver pending evita liberar em dobro.
Webhook apontando para o preview
No v0, o preview roda de verdade na Vercel Sandbox, mas a URL muda e deployments de preview na Vercel costumam ficar atrás de proteção de acesso, que bloqueia o POST do HeroPay. Registre o webhook na URL do domínio publicado. No Bolt, registre a URL da server function publicada, não a do editor.
Env var alterada e deploy antigo
Na Vercel, trocar uma variável não muda o deploy que já está no ar: vale só para o próximo. Trocou a chave do sandbox pela de produção? Publique de novo antes de testar.
Edge runtime no route handler
Se o v0 gerar export const runtime = "edge" no webhook, node:crypto pode não estar disponível. Use runtime = "nodejs" ou a Web Crypto API (crypto.subtle) para o HMAC.
Dá para cobrar no v0 ou no Bolt sem escrever código?
Dá. Se você só quer validar se alguém paga, pule o backend:
- No painel, crie um link de pagamento com nome, preço e métodos.
- No v0 ou no Bolt, peça: "Adicione um botão Comprar agora na página de preços que abre [URL do link] em nova aba."
- Acompanhe as vendas no painel.
O limite: o app não sabe quem pagou. Você libera acesso à mão ou, quando as vendas começarem, evolui para o fluxo com webhook acima. Para saber de onde veio cada venda, acrescente ?src=instagram (ou o nome da campanha) na URL do botão: o valor é salvo no carrinho e volta em cart.src nos webhooks daquela compra.
Quanto custa receber pagamento num app do v0 ou do Bolt?
| Método | HeroPay | Stripe BR (a opção nativa das duas ferramentas) |
|---|---|---|
| Pix | R$ 0 | 1,19%, só por convite |
| Boleto | R$ 0 | R$ 3,45 |
| Cartão | 3,49%, até 12x | 3,99% + R$ 0,39 |
| Mensalidade | R$ 0 | R$ 0 |
Verificado em set/2026. Fontes: heropay.tech/precos, stripe.com/br/pricing.
Em reais: 1.000 vendas de R$ 29,90 em Pix custam R$ 0 no HeroPay e R$ 355,81 na Stripe BR, quando o Pix está liberado na sua conta. No cartão, o HeroPay também fica mais barato que a Stripe BR em qualquer valor de venda: numa venda de R$ 29,90, o HeroPay cobra R$ 1,04 e a Stripe BR, R$ 1,58. Para ticket baixo, o Pix a R$ 0 continua sendo o melhor caminho; para ticket alto, o cartão em até 12x com aprovação de 93%+ trabalha a seu favor.
Quando usar o pagamento nativo da ferramenta: se você vende em dólar para o mundo e quer zero configuração, a Stripe pelo Vercel Marketplace (no v0) ou a integração de Stripe do Bolt é o caminho mais curto. Se o seu cliente é brasileiro e paga em Pix, a conta muda para o HeroPay, com checkout que traz parcelamento, Apple Pay, Google Pay e recuperação de carrinho.
Perguntas frequentes
Como aceitar pagamento no v0 da Vercel?
Com um route handler do Next.js. Guarde o token do HeroPay em Settings > Environment Variables do projeto no v0 (que grava na Vercel), cole heropay.tech/llms.txt no chat e envie o prompt pronto do v0 desta página. O v0 cria app/api/checkout/route.ts, que chama POST /payment_links e devolve a URL de um checkout com Pix, boleto e cartão, e app/api/webhooks/heropay/route.ts, que valida a assinatura e marca o pedido como pago. Teste no sandbox, publique e troque a chave pela de produção.
Como integrar pagamento com Pix no Bolt?
Pelo backend do Bolt Cloud. Cadastre HEROPAY_API_KEY, HEROPAY_API_URL e HEROPAY_WEBHOOK_SECRET em Secrets (ícone de banco de dados > Secrets) e envie o prompt pronto do Bolt. Ele cria a server function create-checkout, que chama POST /payment_links com "pix" em payment_methods, e a server function heropay-webhook, que confirma o pagamento. O Pix vem com QR Code e copia e cola no checkout do HeroPay e custa R$ 0 por transação. Se o projeto usa Supabase, o mesmo prompt vira edge functions.
Onde colocar a chave de API no v0?
No menu do projeto ... > Settings > Environment Variables. As variáveis são do projeto, então todos os chats dele enxergam, e ficam criptografadas na Vercel. Leia com process.env.HEROPAY_API_KEY só em route handler, server action ou arquivo com import "server-only". Nunca use o prefixo NEXT_PUBLIC_ nem leia a chave em componente com "use client": tudo que vai para o navegador é público. Depois de trocar uma variável, publique de novo, porque o deploy anterior continua com o valor antigo.
Onde colocar a chave de API no Bolt?
No painel Secrets: abra o projeto, clique no ícone de banco de dados e em Secrets, preencha Name (HEROPAY_API_KEY) e Value. O Bolt também abre esse painel sozinho quando o código precisa de um segredo. A chave é lida só dentro de server function (ou edge function do Supabase). Nunca use variável com prefixo VITE_: o Vite embute essas variáveis no código do navegador. Se desconfiar de vazamento, gere um token novo no painel do HeroPay e atualize o secret.
O v0 e o Bolt aceitam Pix?
Nenhum dos dois processa pagamento sozinho: eles geram o código que conversa com um provedor. As opções nativas das duas ferramentas passam pela Stripe, e na Stripe BR o Pix é liberado só por convite (verificado em set/2026). Para aceitar Pix hoje sem depender de convite, o caminho é integrar um provedor brasileiro por API. Com o HeroPay, o Pix vem no link de pagamento, custa R$ 0 por transação e usa o mesmo fluxo que cartão e boleto.
Qual é melhor para um app com pagamento: v0 ou Bolt?
Depende de onde você quer o backend. O v0 é mais forte quando você quer um app Next.js padrão, hospedado na Vercel, com o código no GitHub e rotas de API que qualquer dev reconhece. O Bolt é mais forte quando você quer banco, autenticação, server functions e hospedagem num lugar só, sem configurar nada. Para o HeroPay, tanto faz: a integração é a mesma chamada POST /payment_links mais um webhook. Escolha pela ferramenta em que você já constrói.
Como testar o webhook antes de publicar?
No v0, o preview roda seu app de verdade na Vercel Sandbox, mas a URL de preview muda e costuma ter proteção de acesso, então o jeito mais simples é publicar e registrar o webhook no domínio publicado, ainda com a chave de sandbox. No Bolt, registre a URL pública da server function heropay-webhook. Para só inspecionar o payload, aponte o webhook para um serviço como webhook.site. Pague no checkout de teste e confira o evento nos logs.
Posso cobrar assinatura mensal no v0 ou no Bolt com o HeroPay?
Pode. Mande period: "monthly" (ou quarterly, semiannual, annual) no POST /payment_links e o link vira recorrência, com renovação ilimitada ou limitada por frequency_limit. A recorrência aceita cartão, boleto e Pix; na assinatura via Pix, o comprador autoriza o Pix Automático uma vez e as cobranças seguintes caem sozinhas. Os eventos subscription_activate, subscription_update e subscription_cancel avisam o app.
Quanto custa receber pagamentos no v0 ou no Bolt com o HeroPay?
Pix R$ 0 e boleto R$ 0 por transação. Cartão custa 3,49% por transação aprovada, em até 12x. Não há mensalidade, ativação ou volume mínimo, e o sandbox é gratuito. Nem o v0 nem o Bolt cobram a mais por você chamar uma API externa: você paga seu plano da ferramenta, se tiver, e o uso de hospedagem de cada uma. Numa venda de R$ 97 no cartão, a tarifa do HeroPay fica em cerca de R$ 3,39; no Pix, R$ 0. Detalhes em preços.
Preciso saber programar para integrar o HeroPay no v0 ou no Bolt?
Não para começar. Os prompts desta página descrevem tabelas, rotas e regras de segurança em português, e a ferramenta escreve o código. Você copia o token para a área de segredos, cola o prompt, roda um curl para registrar o webhook e testa uma compra no sandbox. Se nem isso der agora, use a alternativa sem código: crie um link de pagamento no painel e peça um botão que abra esse link. Antes de atender clientes de verdade, peça a alguém para revisar a rota do webhook.
O HeroPay tem integração nativa no Vercel Marketplace ou no Bolt?
Ainda não. Hoje a opção nativa das duas ferramentas é a Stripe: no v0, pelo Vercel Marketplace; no Bolt, pela integração que cria as edge functions e registra o webhook sozinha. O HeroPay entra por API, com a sua conta e a sua chave. Com o llms.txt, a documentação e os prompts desta página, isso sai em minutos, e você fica com controle total do fluxo, do banco e dos eventos.
Posso usar o mesmo fluxo no Lovable, no Cursor ou no Claude?
Pode. O fluxo é sempre o mesmo: backend com a chave, POST /payment_links, webhook confirmando. No Lovable, a chave vai em Secrets e o código em edge function (guia do Lovable). No Claude Code e no Cursor, a regra do projeto guarda o contrato da API e a própria IA roda os curl de teste que você aprovar (Claude Code, Cursor). Claude, ChatGPT, Cursor, Lovable e outros leem o mesmo llms.txt. O MCP server do HeroPay está em desenvolvimento e não é necessário para nenhum desses fluxos.
Comece agora
Crie a conta sandbox, cadastre a chave no v0 ou no Bolt, cole o prompt e faça a primeira venda de teste em minutos. Sem fila de homologação: passou no sandbox, troque a chave e vá pro ar.