Documentación
Una etiqueta script por sitio, una API REST y un servidor MCP para gestionarlo, y webhooks firmados para las compras verificadas. Sustituye marcadores como site_your_site_key, provedly_your_key y pp_your_widget_token por los valores de tu panel.
Instalar en tu sitio
Pega el snippet de tu sitio antes de la etiqueta de cierre del body en todas las páginas. Carga todos los widgets y barras CTA activos de ese sitio, de forma asíncrona y dentro de un Shadow DOM.
Cada sitio tiene su propia clave. Copia la línea exacta desde Sites, tu sitio, Install on this site. Pausar, reanudar o crear widgets y barras desde el panel, o desde un asistente de IA, no requiere cambiar el código. Los cambios del panel llegan a los visitantes en un minuto aproximadamente.
...
<script src="https://provedly.app/w/site.js" data-site="site_your_site_key" async></script>
</body>
</html>App de Shopify y plugin de WordPress
Si usas la app de Provedly para Shopify, no instales nada: el app embed del tema lo carga todo. El Plugin de WordPress sigue funcionando tal cual.
Avanzado: una etiqueta por elemento
El snippet del sitio cubre casi todos los casos. Cada widget y cada barra también tiene su propia etiqueta, en Advanced dentro de su pestaña Embed, para dos situaciones: una barra en línea que debe mostrarse en un punto exacto de la página (aparece donde pegas su etiqueta) y los creadores de páginas que solo aceptan código por bloque. Una página con ambos tipos de etiquetas nunca carga un elemento dos veces.
Dominios permitidos
El endpoint de configuración solo responde a los dominios que figuran en el sitio. Los subdominios están incluidos, así que example.com cubre shop.example.com. Añade los hosts de pruebas de forma explícita. Dejar la lista vacía permite cualquier dominio, algo que no recomendamos.
Qué pasa al cargar
- El snippet del sitio hace una sola petición,
GET https://provedly.app/api/s/{site key}/manifest, que devuelve cada widget y barra activos con sus ajustes y hasta 30 registros recientes por widget, además de la versión actual del código. - Después carga el código del widget y el de la barra, solo si la página los necesita. Ambos son archivos versionados que tu navegador guarda en caché hasta la siguiente versión.
- El ciclo de notificaciones empieza después del retraso inicial que hayas fijado. Cada notificación mostrada envía una impresión a
/track. - Mientras la pestaña está abierta, un latido llama a
/presencecada 30 segundos para el contador en vivo.
Muestra el contador en vivo dentro de tu página
Añade un elemento donde quieras que aparezca el número, por ejemplo bajo el título del producto o el botón Añadir al carrito. En Shopify, usa un bloque Custom liquid en el editor del tema. El snippet del sitio lo rellena con el mismo número real que la notificación (visitantes vistos en los últimos 90 segundos) y lo oculta por debajo de tu mínimo.
<div data-provedly-live data-template="{n} people are viewing this product right now"></div>Añade data-style="card" para una versión en tarjeta con el número grande y un enlace Verify a tu página de verificación, o data-dot="off" para quitar el punto. Si hay varios widgets en una página, pon el token de un widget en el atributo (data-provedly-live="pp_…") para elegir uno.
Vídeos paso a paso: cualquier sitio web o WordPress y Shopify.
Claves de API
Crea claves en Settings, API keys. Una misma clave sirve para la API REST, el servidor MCP y el feed de estadísticas. Disponible en todos los planes, incluido Free.
| Acceso | Puede leer | Puede cambiar |
|---|---|---|
| Solo lectura | Listados y estadísticas | Nada |
| Lectura y escritura | Listados y estadísticas | Pausar y reanudar widgets y barras, crear y editar barras, añadir registros |
Cómo funcionan las claves
- Las claves empiezan por
provedly_y pertenecen al espacio de trabajo, no a un widget concreto. - La clave se muestra una sola vez, al crearla. Solo guardamos un hash, así que cópiala enseguida.
- Revoca una clave cuando quieras desde la misma página. Las peticiones con una clave revocada reciben un 401.
REST API
Lee tus sitios, widgets, barras y estadísticas, y haz los mismos cambios que en el panel. Las respuestas son JSON dentro de un campo data.
https://provedly.app/api/v1
Authorization: Bearer provedly_your_key| Endpoint | Clave | Notas |
|---|---|---|
| GET /account | read | Plan, uso y límites. |
| GET /sites | read | |
| GET /sites/{site}/snippet | read | El código de instalación de ese sitio. |
| GET /widgets[?site=] | read | Opcionalmente filtrado por sitio. |
| GET /widgets/{widget} | read | |
| PATCH /widgets/{widget} | write | Cualquiera de name, status y los ajustes del widget de abajo. Solo cambian los campos enviados. Se rechaza reanudar por encima del límite de widgets del plan. |
| GET /bars[?site=] | read | Opcionalmente filtrado por sitio. |
| GET /bars/{bar} | read | |
| POST /bars | write | Crea una barra. Las barras nuevas empiezan en pausa. |
| PATCH /bars/{bar} | write | Cualquiera de name, kind, message, button_text, button_url, ends_at, status y los ajustes de barra de abajo. Un kind nuevo cambia el tipo y conserva las estadísticas, el diseño y la segmentación de la barra; countdown necesita una fecha de fin. Las barras finalizadas o archivadas no se pueden editar. |
| GET /stats?days=30[&site=] | read | days de 1 a 365. |
| POST /widgets/{token}/records | write | La API de registros. También acepta la clave propia del widget. |
Ids
Los widgets y las barras aceptan su id (un UUID) o su token. Los sitios aceptan su id o su dominio.
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"}'Crear una barra (POST /bars)
| Campo | Reglas | Notas |
|---|---|---|
| site | obligatorio | Id o dominio del sitio. |
| name | obligatorio | |
| kind | obligatorio | Uno de: countdown, evergreen, counter, orders, static. |
| message | obligatorio | Usa {timer} donde va el temporizador. Si falta en los tipos con temporizador, se añade al final. |
| button_text | opcional | |
| button_url | opcional | |
| ends_at | opcional | "2026-12-01 09:00" interpretado en la zona horaria de la barra, o ISO 8601. Las cuentas regresivas duran 7 días por defecto. |
| timezone | opcional | Nombre IANA. Por defecto, UTC. |
Las barras nuevas se crean en pausa. Actívala con PATCH /bars/{bar} {"status": "active"}.
Ajustes que puedes cambiar
Las lecturas devuelven los mismos campos, así que puedes leer un widget o una barra, cambiar un valor y enviarlo de vuelta. Las reglas de URL aceptan una lista de rutas o una ruta por línea. Si el cambio coloca dos elementos activos en el mismo sitio de las mismas páginas, la respuesta incluye una entrada warnings.
| Elemento | 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 en línea: se muestran dentro del elemento con 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 |
La marca, la página pública de verificación, los registros de ejemplo y el diseño detallado se gestionan en el panel.
Estadísticas (GET /stats)
Impresiones y clics de widgets y barras, pedidos e ingresos verificados, pedidos e ingresos asistidos por la prueba, y un desglose por widget para el número de días elegido.
Errores y límites
{ "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 clave puede hacer 120 peticiones por minuto.
MCP: Claude, Cursor y otras herramientas de IA
Conecta un asistente de IA a tu espacio de trabajo a través del servidor MCP. Usa la misma clave de API y sigue las mismas reglas que el panel.
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"Herramientas
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.
Reglas
- Se aplican los mismos límites del plan que en el panel.
- Las barras que crea un asistente empiezan en pausa hasta que pidas activarlas.
- Una clave de solo lectura no puede cambiar nada.
- Los registros añadidos con la API o MCP nunca se marcan como verificados. Solo lo son los webhooks firmados de Stripe, Shopify y WooCommerce.
Ejemplos de instrucciones
- «¿Cuántas impresiones y pedidos verificados tuvieron mis widgets en los últimos 7 días?»
- «Crea una barra de cuenta regresiva en example.com para las rebajas de invierno que terminan el 1 de diciembre a las 9:00, hora de Nueva York.»
- «Pausa todos los widgets de mi sitio de pruebas.»
- «Dame el código de instalación de mi tienda.»
Feed de estadísticas
Un único endpoint de solo lectura con las cifras clave de tu espacio de trabajo, pensado para widgets de escritorio y paneles. Basta con una clave de solo lectura.
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"Qué devuelve
Solo las cifras de ese espacio de trabajo. El parámetro tz es opcional.
| Campo | Contiene | Notas |
|---|---|---|
| impressions | Serie | |
| clicks | Serie | |
| ctr | Tasa de clics | |
| visitors | live, unique_today | |
| orders | verified, assisted_30d, revenue_30d, assisted_revenue_30d, currency | verified es una serie. |
| product | sites, widgets_active, bars_active | |
| usage | impressions_month, impressions_limit, percent | Este mes frente a tu plan. |
Los campos de serie incluyen today, yesterday, change_pct, last_7d, last_30d, total, trend_24h, trend_7d, trend_30d.
Las cifras se recalculan como máximo una vez por minuto. Cada clave puede hacer 60 peticiones por minuto.
API de registros
Envía un registro desde tu backend cada vez que se produzca una compra. Solo de servidor a servidor. Usa la clave propia del widget, que puedes rotar desde la pestaña Data, o una clave de cuenta de lectura y escritura.
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 | Reglas | Notas |
|---|---|---|
| name | obligatorio, texto, máx. 120 | Se formatea según tu ajuste de formato de nombre antes de mostrarse. |
| city | opcional, máx. 100 | |
| state | opcional, máx. 100 | Lo usa el formato de ubicación "ciudad, estado". |
| country | opcional, 2 letras | ISO 3166-1 alfa-2. Se guarda en mayúsculas. |
| product_name | opcional, máx. 150 | Si falta, se usa el nombre de producto por defecto del widget. |
| price | opcional, máx. 30 | Texto libre, p. ej. "$49" o "€39". |
| avatar_url | opcional, URL | Se usa cuando el estilo de avatar es "image". |
| external_id | opcional, máx. 120 | Único por widget. Una repetición devuelve 422. |
| occurred_at | opcional, fecha | ISO 8601. Por defecto, ahora. |
Respuestas
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_idEl widget muestra los registros de la API, pero nunca los marca como verificados. La marca de verificado está reservada a los webhooks firmados. Consulta Webhooks.
Importación CSV
Importa tu historial desde una hoja de cálculo en la pestaña Data del widget. Solo el nombre es obligatorio.
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:00ZReglas
- Fila de encabezado obligatoria, columnas en cualquier orden, las columnas extra se ignoran.
- Fechas en ISO 8601. Si falta la fecha, se usa la hora de la importación.
- "Skip duplicates" ignora las filas cuyo nombre y ciudad coinciden con un registro existente en menos de una hora.
- Las filas importadas tienen el origen
csvy no están verificadas. Las filas más antiguas que tu ventana de antigüedad se guardan, pero no se muestran.
Webhooks (compras verificadas)
Los registros de webhooks son los únicos que reciben la marca de verificado. Añade el endpoint en la pestaña Data del widget, pega el secreto de firma y luego registra la URL en el proveedor. Disponible en todos los planes, incluido el gratuito.
Stripe
- En la pestaña Data del widget, añade una fuente de Stripe. Copia la URL del endpoint:
https://provedly.app/api/hooks/stripe/pp_your_widget_token- En Stripe, ve a Developers, Webhooks, Add endpoint. Pega la URL y selecciona los eventos que envía tu checkout:
checkout.session.completedpara pagos únicos con Checkout,invoice.paidpara suscripciones ypayment_intent.succeededsolo si cobras con Payment Intents sin Checkout. Una compra se registra una sola vez aunque se disparen varios de ellos. - Copia el secreto de firma (
whsec_…) en el campo de secreto de la fuente en Provedly. - Envía un evento de prueba desde Stripe. La fuente muestra "last event" en pocos segundos.
Leemos el nombre del cliente, el país y la ciudad de envío o facturación cuando existen, la primera línea del pedido como producto y el total formateado como precio.
App de Shopify (recomendada para tiendas Shopify)
- Instala Provedly desde la Shopify App Store (ficha disponible pronto).
- En la página de inicio de la app, haz clic en "Open theme editor", comprueba que el app embed de Provedly está activado y guarda. Sin código ni etiqueta script.
- Los pedidos se convierten en registros verificados automáticamente: se importan los últimos 60 días al instalar y cada pedido nuevo llega mediante un webhook firmado.
La app funciona dentro de tu admin de Shopify con las mismas herramientas de diseño, datos y analítica que este panel. Los planes se cobran a través de Shopify en tu factura habitual; el plan Free no necesita método de pago. Los nombres y ciudades de los compradores solo aparecen cuando Shopify aprueba el acceso de la app a los datos de clientes; hasta entonces las notificaciones dicen "Someone just purchased…".
Webhook de Shopify (manual)
- Añade una fuente de Shopify en la pestaña Data y copia la URL:
https://provedly.app/api/hooks/shopify/pp_your_widget_token- En el admin de Shopify, ve a Settings, Notifications, Webhooks y crea un webhook para
Order payment(orders/paid), formato JSON, con esa URL.Order creationtambién funciona si quieres incluir pedidos no pagados; el mismo pedido nunca se registra dos veces. - Copia el secreto compartido que aparece bajo la lista de webhooks en el campo de secreto de la fuente.
Las cargas se verifican con la cabecera HMAC-SHA256. Si la comprobación falla, se registra y se descarta. Sin secreto, los eventos se aceptan pero aparecen como "No signing secret set" en tu panel y no se marcan como verificados.
WooCommerce (plugin de WordPress o webhook manual)
- Añade una fuente de WooCommerce en la pestaña Data, copia la URL y elige un secreto de firma (cualquier texto de 8 caracteres o más):
https://provedly.app/api/hooks/woocommerce/pp_your_widget_token- Con el plugin: instala Provedly desde WordPress.org (Plugins, Add New, busca "Provedly"), abre Provedly en el menú de administración, pega el token del widget, la URL y el secreto, y guarda. El plugin imprime las etiquetas script, crea el webhook de WooCommerce y pasa el id del visitante a cada pedido para la atribución.
- Manualmente: WooCommerce, Settings, Advanced, Webhooks, Add webhook. Tema
Order updated, la URL de entrega de arriba, el mismo secreto, versión de APIWP REST API v3.
WooCommerce firma cada envío con HMAC-SHA256 en X-WC-Webhook-Signature. Solo los pedidos en Processing o Completed se convierten en registros, una vez cada uno, así que los pedidos pendientes, fallidos o cancelados nunca aparecen.
Atribución (pedidos asistidos por la prueba)
El panel cuenta un pedido como asistido por la prueba solo cuando el comprador llevaba un id de visitante que vio una notificación del mismo widget en los 30 días anteriores a la compra. No se estima nada. En las tiendas Shopify que usan la app es automático: el widget escribe el id de visitante en el carrito como el atributo provedly_visitor y el webhook del pedido lo lee de vuelta.
En cualquier otro caso, reenvía tú mismo el id de visitante. El widget lo guarda en la cookie propia pv_vid y lo expone como window.Provedly.visitorId().
- Stripe: define
metadata.provedly_visitoren la Checkout Session o el PaymentIntent. - API de registros: envíalo en el 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 verificación
Cada widget tiene una página pública que muestra sus fuentes, su política y las raíces de su registro. La insignia de la notificación enlaza a ella. También puedes enlazarla desde cualquier otro sitio.
https://provedly.app/verify/pp_your_widget_tokenQué muestra
Recuentos de compras verificadas de 24 horas, 7 días y desde el inicio; la ventana y el mínimo del contador en vivo; si se muestran ejemplos; si solo se muestran compras verificadas; cada fuente con sus recuentos y su último registro; los proveedores conectados; las compras verificadas recientes como hashes; y las raíces SHA-256 nocturnas del registro. Los nombres y las ciudades nunca aparecen. Lee la página de confianza para entender el porqué.
Comprobar un registro contra una raíz
El hash de cada registro se devuelve al crearlo con la API. La raíz de un día es el SHA-256 de la lista ordenada de los hashes de los registros de ese día. Guarda tus hashes y podrás recalcular la raíz tú mismo.
Solución de problemas
El widget está instalado pero no muestra nada
Si "Verified purchases only" está activado y el widget aún no tiene registros verificados, no tiene nada que mostrar. La página del widget te avisa de ello. Desactiva el ajuste o conecta una tienda.
Un cambio del panel todavía no aparece en mi sitio
Espera aproximadamente un minuto y recarga la página. Con los snippets por elemento, las nuevas versiones del código pueden tardar unos minutos.
No aparece nada en mi sitio
- Abre la consola del navegador. Un 403 en
/api/w/…/configsignifica que el dominio de la página no está entre los dominios permitidos del sitio. - El widget necesita al menos un registro dentro de la ventana de antigüedad. Añade un registro de ejemplo para probar.
- Comprueba que el estado del widget es "active" y que al espacio de trabajo le quedan impresiones este mes.
- Segmentación por ruta: una lista de inclusión que no coincide con la ruta actual mantiene el widget en silencio.
El contador en vivo nunca aparece
Se oculta por debajo del mínimo que fijaste (2 por defecto). Abre la página en dos navegadores, o en una ventana privada, y espera al primer latido. También necesita "Enable live counter" activado.
Llegan eventos del webhook pero los registros no están verificados
Falta el secreto de firma o es incorrecto. La tarjeta de la fuente muestra "No signing secret set" o el número de eventos deja de aumentar. Vuelve a pegar el secreto y reenvía un evento de prueba.
La notificación queda detrás de mi banner de cookies
Sube el z-index en la sección Look del widget. El valor por defecto es 9999.