Documentação
Uma tag script por site, uma API REST e um servidor MCP para gerenciar tudo, e webhooks assinados para compras verificadas. Substitua marcadores como site_your_site_key, provedly_your_key e pp_your_widget_token pelos valores do seu painel.
Instale no seu site
Cole o snippet do seu site antes da tag de fechamento do body em todas as páginas. Ele carrega todos os widgets e barras CTA ativos desse site, de forma assíncrona, dentro de um Shadow DOM.
Cada site tem sua própria chave. Copie a linha exata em Sites, seu site, Install on this site. Pausar, retomar ou criar widgets e barras no painel, ou por um assistente de IA, não exige mudar o código. As mudanças no painel chegam aos visitantes em cerca de um minuto.
...
<script src="https://provedly.app/w/site.js" data-site="site_your_site_key" async></script>
</body>
</html>App da Shopify e plugin do WordPress
Se você usa o app do Provedly para Shopify, não precisa instalar nada: o app embed do tema carrega tudo. O Plugin para WordPress continua funcionando normalmente.
Avançado: uma tag por item
O snippet do site cobre quase todos os casos. Cada widget e cada barra também tem sua própria tag, em Advanced na aba Embed, para duas situações: uma barra embutida que precisa aparecer num ponto exato da página (ela aparece onde a tag for colada) e construtores de páginas que só aceitam código por bloco. Uma página com os dois tipos de tag nunca carrega um item duas vezes.
Domínios permitidos
O endpoint de configuração só responde aos domínios cadastrados no site. Subdomínios estão incluídos, então example.com cobre shop.example.com. Adicione os hosts de homologação explicitamente. Deixar a lista vazia libera qualquer domínio, o que não recomendamos.
O que acontece no carregamento
- O snippet do site faz uma única requisição,
GET https://provedly.app/api/s/{site key}/manifest, que retorna cada widget e barra ativos com suas configurações e até 30 registros recentes por widget, além da versão atual do código. - Depois ele carrega o código do widget e o da barra, só se a página precisar deles. Os dois são arquivos versionados que o navegador mantém em cache até a próxima versão.
- O ciclo de notificações começa depois do atraso inicial que você definiu. Cada exibição envia uma impressão para
/track. - Enquanto a aba está aberta, um heartbeat chama
/presencea cada 30 segundos para o contador ao vivo.
Mostre a contagem ao vivo dentro da sua página
Adicione um elemento onde a contagem deve aparecer, por exemplo abaixo do título do produto ou do botão Adicionar ao carrinho. Na Shopify, use um bloco Custom liquid no editor de tema. O snippet do site preenche esse elemento com a mesma contagem real da notificação (visitantes vistos nos últimos 90 segundos) e o mantém oculto abaixo do seu mínimo.
<div data-provedly-live data-template="{n} people are viewing this product right now"></div>Adicione data-style="card" para uma versão em cartão com o número grande e um link Verify para sua página de verificação, ou data-dot="off" para remover o ponto. Com vários widgets na mesma página, coloque o token de um widget no atributo (data-provedly-live="pp_…") para escolher qual.
Vídeos passo a passo: qualquer site ou WordPress e Shopify.
Chaves de API
Crie chaves em Settings, API keys. Uma mesma chave funciona para a API REST, o servidor MCP e o feed de estatísticas. Disponível em todos os planos, inclusive no Free.
| Acesso | Pode ler | Pode alterar |
|---|---|---|
| Somente leitura | Listas e estatísticas | Nada |
| Leitura e escrita | Listas e estatísticas | Pausar e retomar widgets e barras, criar e editar barras, adicionar registros |
Como as chaves funcionam
- As chaves começam com
provedly_e pertencem ao espaço de trabalho, não a um widget específico. - A chave aparece uma única vez, quando você a cria. Guardamos só um hash, então copie-a na hora.
- Revogue uma chave quando quiser, na mesma página. Requisições com uma chave revogada recebem 401.
REST API
Leia seus sites, widgets, barras e estatísticas, e faça as mesmas alterações que faria no painel. As respostas são JSON dentro de um campo data.
https://provedly.app/api/v1
Authorization: Bearer provedly_your_key| Endpoint | Chave | Observações |
|---|---|---|
| GET /account | read | Plano, uso e limites. |
| GET /sites | read | |
| GET /sites/{site}/snippet | read | O código de instalação desse site. |
| GET /widgets[?site=] | read | Filtro opcional por site. |
| GET /widgets/{widget} | read | |
| PATCH /widgets/{widget} | write | Qualquer um entre name, status e as configurações de widget abaixo. Só mudam os campos enviados. Retomar acima do limite de widgets do plano é recusado. |
| GET /bars[?site=] | read | Filtro opcional por site. |
| GET /bars/{bar} | read | |
| POST /bars | write | Cria uma barra. Barras novas começam pausadas. |
| PATCH /bars/{bar} | write | Qualquer um entre name, kind, message, button_text, button_url, ends_at, status e as configurações de barra abaixo. Um novo kind troca o tipo e mantém as estatísticas, o design e a segmentação da barra; countdown exige uma data de término. Barras encerradas ou arquivadas não podem ser editadas. |
| GET /stats?days=30[&site=] | read | days de 1 a 365. |
| POST /widgets/{token}/records | write | A API de registros. Também aceita a chave própria do widget. |
Ids
Widgets e barras aceitam o id (um UUID) ou o token. Sites aceitam o id ou o domínio.
curl -X PATCH https://provedly.app/api/v1/widgets/pp_your_widget_token \
-H "Authorization: Bearer provedly_your_key" \
-H "Content-Type: application/json" \
-d '{"status": "paused"}'Criar uma barra (POST /bars)
| Campo | Regras | Observações |
|---|---|---|
| site | obrigatório | Id ou domínio do site. |
| name | obrigatório | |
| kind | obrigatório | Um destes: countdown, evergreen, counter, orders, static. |
| message | obrigatório | Use {timer} onde o timer deve ficar. Se faltar nos tipos com timer, ele é adicionado ao final. |
| button_text | opcional | |
| button_url | opcional | |
| ends_at | opcional | "2026-12-01 09:00" lido no fuso horário da barra, ou ISO 8601. Contagens regressivas duram 7 dias por padrão. |
| timezone | opcional | Nome IANA. Padrão: UTC. |
Barras novas são criadas pausadas. Ative uma com PATCH /bars/{bar} {"status": "active"}.
Configurações que você pode alterar
As leituras retornam os mesmos campos, então você pode ler um widget ou uma barra, mudar um valor e enviar de volta. As regras de URL aceitam uma lista de caminhos ou um caminho por linha. Se a alteração colocar dois itens ativos no mesmo lugar das mesmas páginas, a resposta traz uma entrada warnings.
| Item | Endpoint | Campos |
|---|---|---|
| Widgets | PATCH /widgets/{widget} | message_template, theme, position, device, url_include, url_exclude, start_delay, display_seconds, gap_seconds, max_per_session, click_url, click_new_tab, verified_only, live_counter_enabled, live_counter_template, live_counter_min_show |
| Barras | PATCH /bars/{bar} | theme, position, target_id (barras embutidas: aparecem dentro do elemento com este id), device, url_include, url_exclude, delay_seconds, finish_action, finish_url, finish_message, evergreen_minutes, counter_start, counter_end, counter_step, counter_interval, orders_window_hours (24, 168, 720), orders_min |
A marca, a página pública de verificação, os registros de exemplo e o design detalhado ficam no painel.
Estatísticas (GET /stats)
Impressões e cliques de widgets e barras, pedidos e receita verificados, pedidos e receita assistidos pela prova, e um detalhamento por widget para o número de dias escolhido.
Erros e limites
{ "error": "...", "message": "..." }
401 missing or invalid key
403 read-only key used for a change
404 not in this workspace
422 refused: validation, plan limit, or an ended or archived barCada chave pode fazer 120 requisições por minuto.
MCP: Claude, Cursor e outras ferramentas de IA
Conecte um assistente de IA ao seu espaço de trabalho pelo servidor MCP. Ele usa a mesma chave de API e segue as mesmas regras do painel.
https://provedly.app/mcp (streamable HTTP)
Authorization: Bearer provedly_your_keyclaude mcp add --transport http provedly https://provedly.app/mcp --header "Authorization: Bearer provedly_YOUR_KEY"Ferramentas
get_account, list_sites, list_widgets, list_bars, get_stats, set_widget_status, update_widget, set_bar_status, create_bar, update_bar, add_record, get_install_snippet.
Regras
- Valem os mesmos limites de plano do painel.
- Barras criadas por um assistente começam pausadas até você pedir para ativá-las.
- Uma chave somente leitura não pode alterar nada.
- Registros adicionados pela API ou MCP nunca são marcados como verificados. Só os webhooks assinados da Stripe, Shopify e WooCommerce são.
Exemplos de comandos
- “Quantas impressões e pedidos verificados meus widgets tiveram nos últimos 7 dias?”
- “Crie uma barra de contagem regressiva em example.com para a liquidação de inverno que termina em 1º de dezembro às 9h, horário de Nova York.”
- “Pause todos os widgets do meu site de homologação.”
- “Me passe o código de instalação da minha loja.”
Feed de estatísticas
Um único endpoint somente leitura com os principais números do seu espaço de trabalho, feito para widgets de desktop e painéis. Uma chave somente leitura basta.
GET https://provedly.app/api/widget/summary?tz=America/New_York
X-API-Key: provedly_your_key
# or
Authorization: Bearer provedly_your_keycurl "https://provedly.app/api/widget/summary?tz=America/New_York" \
-H "X-API-Key: provedly_your_key"O que retorna
Apenas os números desse espaço de trabalho. O parâmetro tz é opcional.
| Campo | Contém | Observações |
|---|---|---|
| impressions | Série | |
| clicks | Série | |
| ctr | Taxa de cliques | |
| visitors | live, unique_today | |
| orders | verified, assisted_30d, revenue_30d, assisted_revenue_30d, currency | verified é uma série. |
| product | sites, widgets_active, bars_active | |
| usage | impressions_month, impressions_limit, percent | Este mês em relação ao seu plano. |
Os campos de série trazem today, yesterday, change_pct, last_7d, last_30d, total, trend_24h, trend_7d, trend_30d.
Os números são recalculados no máximo uma vez por minuto. Cada chave pode fazer 60 requisições por minuto.
API de registros
Envie um registro do seu backend sempre que acontecer uma compra. Somente de servidor para servidor. Use a chave própria do widget, que pode ser trocada na aba Data, ou uma chave de conta com leitura e escrita.
POST https://provedly.app/api/v1/widgets/pp_your_widget_token/records
Authorization: Bearer pk_your_api_key
Content-Type: application/jsoncurl -X POST https://provedly.app/api/v1/widgets/pp_your_widget_token/records \
-H "Authorization: Bearer pk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Doe",
"city": "Berlin",
"country": "DE",
"product_name": "Pro Plan",
"price": "€49",
"external_id": "order_123",
"occurred_at": "2026-10-15T14:03:00Z"
}'| Campo | Regras | Observações |
|---|---|---|
| name | obrigatório, texto, máx. 120 | Formatado pela sua configuração de formato de nome antes de ser exibido. |
| city | opcional, máx. 100 | |
| state | opcional, máx. 100 | Usado pelo formato de localização "cidade, estado". |
| country | opcional, 2 letras | ISO 3166-1 alfa-2. Salvo em maiúsculas. |
| product_name | opcional, máx. 150 | Se faltar, usa o nome de produto padrão do widget. |
| price | opcional, máx. 30 | Texto livre, por exemplo "$49" ou "€39". |
| avatar_url | opcional, URL | Usado quando o estilo de avatar é "image". |
| external_id | opcional, máx. 120 | Único por widget. Uma repetição retorna 422. |
| occurred_at | opcional, data | ISO 8601. Padrão: agora. |
Respostas
201 Created
{ "id": 812, "hash": "9c1e0b7a…", "verified": false, "occurred_at": "2026-10-15T14:03:00+00:00" }
401 Unauthorized wrong or missing bearer key
422 Unprocessable validation errors, including a duplicate external_idO widget exibe os registros da API, mas nunca os marca como verificados. A marca de verificado é reservada aos webhooks assinados. Veja Webhooks.
Importação CSV
Importe o histórico de uma planilha na aba Data do widget. Só o nome é obrigatório.
name,city,state,country,product_name,price,avatar_url,occurred_at
Sarah Mitchell,Austin,TX,US,Pro Plan,$49,,2026-10-15T13:49:00Z
Hugo Martin,Paris,,FR,Annual Pass,€39,,2026-10-15T11:03:00Z
Yui Tanaka,Tokyo,,JP,Lifetime,,,2026-10-14T14:03:00ZRegras
- Linha de cabeçalho obrigatória, colunas em qualquer ordem, colunas extras ignoradas.
- Datas em ISO 8601. Datas ausentes usam o horário da importação.
- "Skip duplicates" ignora linhas cujo nome e cidade coincidem com um registro existente dentro de uma hora.
- As linhas importadas têm a origem
csve não são verificadas. Linhas mais antigas que a sua janela de exibição são salvas, mas não aparecem.
Webhooks (compras verificadas)
Registros de webhook são os únicos que recebem a marca de verificado. Adicione o endpoint na aba Data do widget, cole o segredo de assinatura e depois cadastre a URL no provedor. Disponível em todos os planos, inclusive no gratuito.
Stripe
- Na aba Data do widget, adicione uma fonte Stripe. Copie a URL do endpoint:
https://provedly.app/api/hooks/stripe/pp_your_widget_token- Na Stripe, vá em Developers, Webhooks, Add endpoint. Cole a URL e selecione os eventos que o seu checkout envia:
checkout.session.completedpara pagamentos únicos via Checkout,invoice.paidpara assinaturas epayment_intent.succeededsomente se você cobra com Payment Intents sem Checkout. Uma compra é registrada uma única vez, mesmo que vários deles disparem. - Copie o segredo de assinatura (
whsec_…) para o campo de segredo da fonte no Provedly. - Envie um evento de teste pela Stripe. A fonte mostra "last event" em poucos segundos.
Lemos o nome do cliente, o país e a cidade de entrega ou cobrança quando existirem, o primeiro item do pedido como produto e o total formatado como preço.
App da Shopify (recomendado para lojas Shopify)
- Instale o Provedly pela Shopify App Store (listagem em breve).
- Na página inicial do app, clique em "Open theme editor", confira se o app embed do Provedly está ativado e salve. Sem código, sem tag script.
- Os pedidos viram registros verificados automaticamente: os últimos 60 dias são importados na instalação e cada novo pedido chega por um webhook assinado.
O app roda dentro do seu admin da Shopify com as mesmas ferramentas de design, dados e análise deste painel. Os planos são cobrados pela Shopify na sua fatura normal; o plano Free não exige forma de pagamento. Nomes e cidades dos compradores só aparecem depois que a Shopify aprova o acesso do app aos dados de clientes; até lá, as notificações dizem "Someone just purchased…".
Webhook da Shopify (manual)
- Adicione uma fonte Shopify na aba Data e copie a URL:
https://provedly.app/api/hooks/shopify/pp_your_widget_token- No admin da Shopify, em Settings, Notifications, Webhooks, crie um webhook para
Order payment(orders/paid), formato JSON, com essa URL.Order creationtambém funciona se você quiser incluir pedidos não pagos; o mesmo pedido nunca é registrado duas vezes. - Copie o segredo compartilhado exibido abaixo da lista de webhooks para o campo de segredo da fonte.
Os payloads são verificados pelo cabeçalho HMAC-SHA256. Uma verificação que falha é registrada e descartada. Sem segredo, os eventos são aceitos, mas aparecem como "No signing secret set" no seu painel e não são marcados como verificados.
WooCommerce (plugin do WordPress ou webhook manual)
- Adicione uma fonte WooCommerce na aba Data, copie a URL e escolha um segredo de assinatura (qualquer texto com 8 ou mais caracteres):
https://provedly.app/api/hooks/woocommerce/pp_your_widget_token- Com o plugin: instale o Provedly pelo WordPress.org (Plugins, Add New, busque "Provedly"), abra o Provedly no menu do admin, cole o token do widget, a URL e o segredo, e salve. O plugin insere as tags script, cria o webhook do WooCommerce e envia o id do visitante em cada pedido para a atribuição.
- Manualmente: WooCommerce, Settings, Advanced, Webhooks, Add webhook. Tópico
Order updated, a URL de entrega acima, o mesmo segredo, versão da APIWP REST API v3.
O WooCommerce assina cada envio com HMAC-SHA256 em X-WC-Webhook-Signature. Só pedidos em Processing ou Completed viram registros, uma vez cada, então pedidos pendentes, com falha ou cancelados nunca aparecem.
Atribuição (pedidos assistidos pela prova)
O painel conta um pedido como assistido pela prova só quando o comprador tinha um id de visitante que viu uma notificação do mesmo widget nos 30 dias antes da compra. Nada é estimado. Em lojas Shopify que usam o app isso é automático: o widget grava o id de visitante no carrinho como o atributo provedly_visitor e o webhook do pedido o lê de volta.
Nos demais casos, repasse você mesmo o id de visitante. O widget o guarda no cookie próprio pv_vid e o expõe como window.Provedly.visitorId().
- Stripe: defina
metadata.provedly_visitorna Checkout Session ou no PaymentIntent. - API de registros: envie no campo opcional
visitor.
// at checkout time, on your site
const visitor = window.Provedly?.visitorId();
// Stripe: pass it as metadata.provedly_visitor
// Records API: POST { ..., "visitor": visitor }Página de verificação
Cada widget tem uma página pública que lista suas fontes, sua política e as raízes do seu registro. O selo da notificação leva até ela. Você também pode linkar para ela de qualquer outro lugar.
https://provedly.app/verify/pp_your_widget_tokenO que ela mostra
Contagens de compras verificadas em 24 horas, 7 dias e desde o início; a janela e o mínimo do contador ao vivo; se exemplos são exibidos; se só compras verificadas são exibidas; cada fonte com suas contagens e o último registro; os provedores conectados; as compras verificadas recentes como hashes; e as raízes SHA-256 noturnas do registro. Nomes e cidades nunca aparecem. Leia a página de confiança para entender o motivo.
Conferir um registro com uma raiz
O hash de cada registro é retornado quando você o cria pela API. A raiz de um dia é o SHA-256 da lista ordenada dos hashes dos registros daquele dia. Guarde seus hashes e você pode recalcular a raiz por conta própria.
Solução de problemas
O widget está instalado, mas não mostra nada
Se "Verified purchases only" estiver ativado e o widget ainda não tiver registros verificados, não há nada para mostrar. A página do widget avisa sobre isso. Desative a configuração ou conecte uma loja.
Uma alteração no painel ainda não aparece no meu site
Espere cerca de um minuto e recarregue a página. Com os snippets por item, novas versões do código podem levar alguns minutos.
Nada aparece no meu site
- Abra o console do navegador. Um 403 em
/api/w/…/configsignifica que o domínio da página não está nos domínios permitidos do site. - O widget precisa de pelo menos um registro dentro da janela de exibição. Adicione um registro de exemplo para testar.
- Confira se o status do widget é "active" e se o espaço de trabalho ainda tem impressões neste mês.
- Segmentação por caminho: uma lista de inclusão que não corresponde ao caminho atual deixa o widget em silêncio.
O contador ao vivo nunca aparece
Ele fica oculto abaixo do mínimo que você definiu (padrão 2). Abra a página em dois navegadores, ou numa janela anônima, e espere o primeiro heartbeat. Também é preciso ativar "Enable live counter".
Os eventos do webhook chegam, mas os registros não são verificados
O segredo de assinatura está faltando ou errado. O cartão da fonte mostra "No signing secret set" ou a contagem de eventos para de subir. Cole o segredo de novo e reenvie um evento de teste.
A notificação fica atrás do meu banner de cookies
Aumente o z-index na seção Look do widget. O padrão é 9999.