From 6bc38b92130c725c31c6f0888f15b9461ac47545 Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Tue, 15 Sep 2026 01:15:03 +0100 Subject: [PATCH 1/4] Update docs based on agent experience review --- api-reference/client-libraries.mdx | 5 +- api-reference/errors.mdx | 30 ++++ api-reference/introduction.mdx | 5 +- docs.json | 8 +- es/api-reference/errors.mdx | 30 ++++ es/api-reference/introduction.mdx | 36 ++-- es/getting-started/introduction.mdx | 154 ++++++++++++++--- es/getting-started/production-checklist.mdx | 74 ++++++++ es/getting-started/quickstart.mdx | 155 +++++++++-------- getting-started/introduction.mdx | 145 +++++++++++++--- getting-started/production-checklist.mdx | 71 ++++++++ getting-started/quickstart.mdx | 15 +- i18n.lock | 111 +++++++++--- snippets/metric-change-request-block.mdx | 25 ++- snippets/metric-change-response-block.mdx | 25 ++- snippets/verified-first-event.mdx | 182 ++++++++++++++++++++ 16 files changed, 883 insertions(+), 188 deletions(-) create mode 100644 api-reference/errors.mdx create mode 100644 es/api-reference/errors.mdx create mode 100644 es/getting-started/production-checklist.mdx create mode 100644 getting-started/production-checklist.mdx create mode 100644 snippets/verified-first-event.mdx diff --git a/api-reference/client-libraries.mdx b/api-reference/client-libraries.mdx index 3cc65d88..bf73fb1c 100644 --- a/api-reference/client-libraries.mdx +++ b/api-reference/client-libraries.mdx @@ -1,8 +1,7 @@ --- title: Client Libraries -description: Use Trophy's type-safe SDKs to integrate with the API. -og:description: Use Trophy's type-safe SDKs to integrate with the API and start - building gamified product experiences. +description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repos. +og:description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repos. icon: code-xml --- diff --git a/api-reference/errors.mdx b/api-reference/errors.mdx new file mode 100644 index 00000000..18fafccf --- /dev/null +++ b/api-reference/errors.mdx @@ -0,0 +1,30 @@ +--- +title: Error Codes +description: Common Trophy API HTTP status codes. +og:description: Common Trophy API HTTP status codes. +icon: circle-x +--- + +This page summarizes the HTTP status codes you will see most often when integrating with the Trophy Application API. For endpoint-specific behaviour and response schemas, see the [API reference](/api-reference/introduction). + +## Authentication errors {#authentication-errors} + +| Status | When it happens | What to do | +| --- | --- | --- | +| `401 Unauthorized` | The `X-API-KEY` header is missing or invalid | Create or rotate an application API key and verify [authentication](/api-reference/authentication) set up| + +## Rate limiting {#rate-limiting} + +| Status | When it happens | What to do | +| --- | --- | --- | +| `429 Too Many Requests` | Your organisation exceeded the endpoint [rate limit](/api-reference/rate-limiting) | Back off and retry; request a higher limit if needed | + +## Retry guidance {#retry-guidance} + +- Retry `429` and `5xx` with exponential backoff. +- On retry, send the same idempotency key for the same logical action so Trophy does not double-count. +- Do not retry `401` until the API key is fixed. + +## Get Support {#get-support} + +Want to get in touch with the Trophy team? Reach out to us via [email](mailto:support@trophy.so). We're here to help! diff --git a/api-reference/introduction.mdx b/api-reference/introduction.mdx index 935c28dc..89c77585 100644 --- a/api-reference/introduction.mdx +++ b/api-reference/introduction.mdx @@ -1,6 +1,6 @@ --- title: Introduction -description: Learn about the Trophy API and get started building your integration. +description: Authenticate, handle errors and rate limits, use idempotency, and explore Trophy Application API SDKs. subtitle: Learn about the Trophy API and get started building your integration. --- @@ -36,6 +36,9 @@ Learn more about how to integrate with the Trophy Application API below. Learn how to prevent unintended side effects when retrying requests. + + Common HTTP status codes for auth, rate limits, and metric events. + Use Trophy’s type-safe SDKs to integrate with the API. diff --git a/docs.json b/docs.json index e3d001c5..3d68c002 100644 --- a/docs.json +++ b/docs.json @@ -81,7 +81,8 @@ "group": "Getting Started", "pages": [ "getting-started/introduction", - "getting-started/quickstart" + "getting-started/quickstart", + "getting-started/production-checklist" ] }, { @@ -155,6 +156,7 @@ "api-reference/authentication", "api-reference/rate-limiting", "api-reference/idempotency", + "api-reference/errors", "api-reference/client-libraries" ] }, @@ -488,7 +490,8 @@ "group": "Primeros pasos", "pages": [ "es/getting-started/introduction", - "es/getting-started/quickstart" + "es/getting-started/quickstart", + "es/getting-started/production-checklist" ] }, { @@ -562,6 +565,7 @@ "es/api-reference/authentication", "es/api-reference/rate-limiting", "es/api-reference/idempotency", + "es/api-reference/errors", "es/api-reference/client-libraries" ] }, diff --git a/es/api-reference/errors.mdx b/es/api-reference/errors.mdx new file mode 100644 index 00000000..c18a905d --- /dev/null +++ b/es/api-reference/errors.mdx @@ -0,0 +1,30 @@ +--- +title: Códigos de error +description: Códigos de estado HTTP comunes de la API de Trophy. +og:description: Códigos de estado HTTP comunes de la API de Trophy. +icon: circle-x +--- + +Esta página resume los códigos de estado HTTP que verá con mayor frecuencia al integrar con la API de la aplicación Trophy. Para el comportamiento específico de cada endpoint y los esquemas de respuesta, consulte la [referencia de la API](/es/api-reference/introduction). + +## Errores de autenticación {#authentication-errors} + +| Estado | Cuándo ocurre | Qué hacer | +| --- | --- | --- | +| `401 Unauthorized` | Falta el encabezado `X-API-KEY` o no es válido | Cree o rote una clave de API de aplicación y verifique la configuración de [autenticación](/es/api-reference/authentication)| + +## Límite de solicitudes {#rate-limiting} + +| Estado | Cuándo ocurre | Qué hacer | +| --- | --- | --- | +| `429 Too Many Requests` | Su organización excedió los [Límites de velocidad](/es/api-reference/rate-limiting) del endpoint | Reduzca la frecuencia y reintente; solicite un límite más alto si es necesario | + +## Orientación para reintentos {#retry-guidance} + +- Reintente `429` y `5xx` con backoff exponencial. +- Al reintentar, envíe la misma clave de idempotencia para la misma acción lógica para que Trophy no cuente dos veces. +- No reintente `401` hasta que se corrija la clave de API. + +## Obtener soporte {#get-support} + +¿Quiere ponerse en contacto con el equipo de Trophy? Comuníquese con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudar! diff --git a/es/api-reference/introduction.mdx b/es/api-reference/introduction.mdx index 3ec0bdaf..480f4c7e 100644 --- a/es/api-reference/introduction.mdx +++ b/es/api-reference/introduction.mdx @@ -1,40 +1,50 @@ --- title: Introducción -description: Aprende sobre la API de Trophy y comienza a construir tu integración. -subtitle: Aprende sobre la API de Trophy y comienza a construir tu integración. +description: Autentíquese, gestione errores y límites de velocidad, utilice + idempotencia y explore los SDK de la API de la aplicación Trophy. +subtitle: Aprenda sobre la API de Trophy y comience a desarrollar su integración. --- -La API de aplicaciones de Trophy es un conjunto de endpoints que proporcionan interfaces simples para crear experiencias de gamificación y cubre toda la gama de acciones que un usuario final de tu aplicación puede realizar. -No incluye funciones administrativas globales ni acciones que solo deberían ser realizadas por tus sistemas internos. Si buscas funcionalidad administrativa, consulta la [API de administración](/es/admin-api/introduction). +La API de la aplicación Trophy es un conjunto de endpoints que proporcionan interfaces simples para construir experiencias de gamificación y cubre toda la gama de acciones que un usuario final de su aplicación puede realizar. -La API de aplicaciones es accesible a través de [SDKs](/es/api-reference/client-libraries) disponibles en la mayoría de los lenguajes de programación principales o, para quienes deseen gestionar sus propios clientes HTTP, está disponible en la siguiente URL base. +No incluye funciones administrativas globales ni acciones que solo deben ser realizadas por sus sistemas internos. Si busca funcionalidad administrativa, consulte la [API de administración](/es/admin-api/introduction). + +La API de la aplicación es accesible a través de [SDK](/es/api-reference/client-libraries) disponibles en la mayoría de los principales lenguajes de programación o, para aquellos que deseen gestionar sus propios clientes HTTP, está disponible en la siguiente URL base. ```bash Base URL https://api.trophy.so/v1 ``` + La referencia completa de la API está disponible públicamente en [/openapi](https://api.trophy.so/v1/openapi). + -## Comienza {#get-started} +## Comience {#get-started} -Aprende más sobre cómo integrar la API de aplicaciones de Trophy a continuación. +Aprenda más sobre cómo integrar con la API de la aplicación Trophy a continuación. - Integra de forma segura tus aplicaciones con la API de Trophy utilizando claves de API. + Autentíquese con claves de API de aplicación con alcance de usuario o claves de API de administración a nivel de cuenta. - Aprende sobre la API de Trophy y la Límite de solicitudes de solicitudes. + Aprenda sobre la API de Trophy y el límite de solicitudes. + + + Aprenda cómo prevenir efectos secundarios no deseados al reintentar solicitudes. + + + Códigos de estado HTTP comunes para autenticación, límites de velocidad y eventos métricos. - - Utiliza los SDKs con tipado seguro de Trophy para integrar con la API. + + Use los SDK de tipo seguro de Trophy para integrar con la API. -## Obtener soporte {#get-support} +## Obtenga soporte {#get-support} -¿Quieres ponerte en contacto con el equipo de Trophy? Comunícate con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! +¿Desea ponerse en contacto con el equipo de Trophy? Comuníquese con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudar! diff --git a/es/getting-started/introduction.mdx b/es/getting-started/introduction.mdx index c5ee4b4c..3ded8993 100644 --- a/es/getting-started/introduction.mdx +++ b/es/getting-started/introduction.mdx @@ -1,46 +1,152 @@ --- title: Bienvenido a Trophy -description: Documentación de Trophy para APIs de gamificación, guías de inicio - rápido y tutoriales. +description: Trophy es la capa de gamificación para aplicaciones de consumo. + Crea puntos, logros, rachas y clasificaciones en minutos con las API y SDK + prediseñadas de Trophy. +og:description: Trophy es la capa de gamificación para aplicaciones de consumo. + Crea puntos, logros, rachas y clasificaciones en minutos con las API y SDK + prediseñadas de Trophy. --- -Trophy es un conjunto de herramientas fácil de usar para desarrolladores que permite crear experiencias de producto gamificadas en cualquier aplicación móvil o web. +import SdkInstallCommand from "../../snippets/sdk-install-command.mdx"; +import VerifiedFirstEvent from "../../snippets/verified-first-event.mdx"; +import MetricChangeResponseBlock from "../../snippets/metric-change-response-block.mdx"; -Facilita la creación de funciones como [Logros](/es/features/achievements), [Rachas](/es/features/streaks), [Puntos](/es/features/points) y [Clasificaciones](/es/features/leaderboards) con solo unas pocas líneas de código, y puede enviar [correos electrónicos](/es/features/emails) y [Notificaciones push](/es/features/push-notifications) gamificados para aumentar tu retención y engagement. +Trophy es la capa de gamificación para aplicaciones de consumo. Crea puntos, logros, rachas y clasificaciones en minutos con las API y SDK prediseñadas de Trophy. + +## Primeros pasos {#getting-started} + +Instala un SDK de Trophy para rastrear la actividad de los usuarios y potenciar puntos, logros, rachas y clasificaciones en tu aplicación. + + + + + + Configura una cuenta de Trophy y crea tu primera funcionalidad en cinco minutos. + + + Aprende a usar la API REST para integrar Trophy en tu aplicación. + + + Aplicación de ejemplo completa con un stack de gamificación completo usando Trophy. + + + +## Uso de agentes de IA {#using-ai-agents} + +Conecta los servidores MCP de Trophy para que los agentes puedan leer documentación en tiempo real y configurar tu cuenta durante la integración. + + +Se recomienda usar los servidores MCP de Trophy para una experiencia de configuración y desarrollo más rápida. + + + + + Búsqueda de documentación en tiempo real para agentes de IA. + + + Configura tu cuenta de Trophy usando agentes de IA. + + + Configuración recomendada para usar ambos servidores MCP juntos. + + + +## Envía tu primer evento {#send-your-first-event} + +Todas las funciones de gamificación están impulsadas por [eventos de métricas](/es/features/events). Aquí te mostramos cómo enviar tu primer evento usando un SDK de Trophy: + + + +La respuesta incluye los cambios en el estado de gamificación como resultado del evento, incluyendo: +- El nuevo valor total de la métrica del usuario +- Cualquier logro desbloqueado recientemente +- Nuevos totales de Puntos y recompensas +- Un objeto de Racha actualizado +- Cualquier nueva posición en las Clasificaciones + +Usa esta respuesta para reaccionar a los cambios en el estado de gamificación del usuario e impulsar elementos de UI. + + + +## Construye según el caso de uso {#build-by-use-case} + +Para obtener más información sobre cómo construir funciones de gamificación comunes usando Trophy, consulta las siguientes guías: - - Familiarízate con el modelo mental de gamificación en Trophy. + + Desbloquea logros a partir del progreso o acciones únicas. + + + Impulsa ciclos de hábitos diarios o semanales con detección de zona horaria integrada. + + + Otorga puntos desde acciones dentro de la aplicación y configura niveles e impulsos. + + + } + href="/es/guides/how-to-build-a-leaderboards-feature" > - Integra Trophy en tu backend en menos de 10 minutos. + Crea clasificaciones recurrentes o únicas. - - Usa Trophy para crear soluciones prácticas a casos de uso comunes de gamificación. + + Correos electrónicos del ciclo de vida impulsados por rachas, logros y actividad. - - Explora el API de Trophy y descubre lo que es posible. + + Flujos de notificaciones automatizadas usando datos de gamificación. -## Por qué Trophy {#why-trophy} +## Kit de interfaz de usuario {#ui-kit} + +Implementa interfaces de gamificación más rápido con la biblioteca de componentes React de Trophy, construida sobre shadcn/ui y diseñada para trabajar con las estructuras de datos de Trophy. + + + Explora componentes de interfaz preconstruidos para rachas, logros, clasificaciones, puntos y más. + + +## Lista de verificación de producción {#production-checklist} - - - +Antes de implementar tu integración en producción, revisa los pasos recomendados en la lista de verificación de producción: -Si tu objetivo es que tus usuarios creen un hábito regular de usar tu aplicación —para aprender algo, publicar contenido o incluso hacer ejercicio— la gamificación podría ser para ti. + + Pasos recomendados para asegurar que tu integración esté lista para producción. + -Ha sido comprobado por Duolingo y otros que la gamificación aumenta predeciblemente la retención e incrementa el engagement en la plataforma. +## Precios {#pricing} -Pero construir gamificación a escala puede ser complicado. Tienes una base de usuarios global, todos en diferentes zonas horarias, todos con diferentes patrones de uso que necesitan ser medidos y optimizados en tiempo real. Además, quieres ejecutar experimentos para probar diferentes enfoques y ver cómo impactan la retención, pero esto requiere cambios constantes en el código, lo que retrasa el trabajo en tu producto principal. +Trophy mide el uso por **usuarios activos mensuales (MAU)**. Un MAU es un usuario que envía al menos un [evento de métrica](/es/features/events) en un mes calendario determinado. No se te cobra por usuarios abandonados que dejan de enviar eventos. -Trophy elimina el trabajo pesado involucrado en crear funciones como logros, rachas, sistemas de puntos y clasificaciones, al mismo tiempo que proporciona APIs confiables y escalables para lanzar experiencias de gamificación más rápido que construyéndolas internamente. Además, ofrece una plataforma web para configurar, medir y experimentar fácilmente con la experiencia del producto sin cambios constantes en el código. +El nivel gratuito incluye **1,000 MAU**. Los planes de pago comienzan en $25/mes con cargos por excedente. + + + + Nivel gratuito, planes de pago, asignaciones y excedentes. + + + Obtén un estimado de costos mensuales según el uso esperado. + + -## Obtener soporte {#get-support} +## Obtén soporte {#get-support} -¿Quieres ponerte en contacto con el equipo de Trophy? Escríbenos por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! +¿Quieres ponerte en contacto con el equipo de Trophy? Contáctanos por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! diff --git a/es/getting-started/production-checklist.mdx b/es/getting-started/production-checklist.mdx new file mode 100644 index 00000000..39ee8984 --- /dev/null +++ b/es/getting-started/production-checklist.mdx @@ -0,0 +1,74 @@ +--- +title: Lista de verificación de producción +description: Idempotencia, reintentos, errores, límites de velocidad, webhooks y + configuración de entorno para integraciones de Trophy en producción. +og:description: Idempotencia, reintentos, errores, límites de velocidad, + webhooks y configuración de entorno para integraciones de Trophy en + producción. +--- + +Antes de implementar tu integración de Trophy en producción, revisa los siguientes pasos recomendados: + + + + Protege las escrituras de métricas para que los reintentos y envíos duplicados no dupliquen el conteo de progreso o premios. + + + Más información sobre idempotencia y cómo usarla en tu integración. + + + + + Maneja fallos transitorios al llamar a Trophy y comprende cómo Trophy reintenta la entrega de webhooks a tus endpoints. + + + + Cuándo es seguro reintentar llamadas a la API y cuándo no. + + + Cómo Trophy reintenta entregas fallidas a tus endpoints de webhook. + + + + + + Comprende los diferentes tipos de errores que emite Trophy y cómo manejarlos en tu integración. + + + Códigos de estado HTTP comunes emitidos por la API de Trophy. + + + + + Trophy utiliza límites de velocidad con alcance a nivel de organización para prevenir el abuso y garantizar un uso justo. Comprende cómo mantenerte dentro de ellos y cómo manejar la limitación. + + + El modelo de límite de solicitudes escalonado de Trophy y cómo funciona. + + + + + Si consumes eventos de Trophy en producción mediante webhooks, asegúrate de configurar la verificación de firmas para prevenir la suplantación. + + + + Qué cubren los webhooks de Trophy y cuándo usarlos. + + + Verifica las firmas de webhooks en producción. + + + + + + Aísla la configuración y el tráfico de desarrollo, staging y producción para que el trabajo no productivo no afecte a los usuarios en vivo. + + + Entornos de producción, staging y desarrollo en Trophy. + + + + +## Obtén soporte {#get-support} + +¿Quieres contactar con el equipo de Trophy? Comunícate con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! diff --git a/es/getting-started/quickstart.mdx b/es/getting-started/quickstart.mdx index 9cddfaf0..b5812550 100644 --- a/es/getting-started/quickstart.mdx +++ b/es/getting-started/quickstart.mdx @@ -1,25 +1,26 @@ --- title: Inicio rápido -description: Comienza a usar Trophy en menos de 10 minutos -og:description: Sigue esta guía de inicio rápido para integrar Trophy en tu - backend y añadir funciones gamificadas como logros y rachas en tu aplicación. +description: Instala un SDK de Trophy, autentícate, identifica a un usuario y + envía tu primer evento de métrica en aproximadamente cinco minutos. +og:description: Instala un SDK de Trophy, autentícate, identifica a un usuario y + envía tu primer evento de métrica en aproximadamente cinco minutos. --- import SdkInstallCommand from "../../snippets/sdk-install-command.mdx"; import AddEnvVarBlock from "../../snippets/add-env-var-block.mdx"; import TrophyClientInitBlock from "../../snippets/trophy-client-init-block.mdx"; -import MetricChangeRequestBlock from "../../snippets/metric-change-request-block.mdx"; import MetricChangeResponseBlock from "../../snippets/metric-change-response-block.mdx"; +import VerifiedFirstEvent from "../../snippets/verified-first-event.mdx"; -Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera función gamificada. +Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera función gamificada en aproximadamente cinco minutos. - Estas instrucciones son para usar Trophy con asistentes de IA que soporten MCP — por ejemplo Claude, ChatGPT, Cursor o Claude Code. + Estas instrucciones son para usar Trophy con asistentes de IA que admiten MCP, por ejemplo Claude, ChatGPT, Cursor o Claude Code. - Primero, [crea una cuenta nueva](https://app.trophy.so/sign-up?utm_source=docs&utm_medium=quickstart) si aún no tienes una. Completa la incorporación para configurar tu cuenta. + Primero, [crea una nueva cuenta](https://app.trophy.so/sign-up?utm_source=docs&utm_medium=quickstart) si aún no tienes una. Completa la incorporación para configurar tu cuenta. @@ -28,15 +29,15 @@ Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera - URL del servidor MCP de documentación: `https://docs.trophy.so/mcp` (contexto de documentación en vivo) - URL del servidor MCP de cuenta: `https://mcp.trophy.so/mcp` (acciones de cuenta — inicio de sesión OAuth requerido) - Guías de configuración: [Instalación de MCP de documentación](/es/mcp/docs-mcp-server/installation), [Instalación de MCP de cuenta](/es/mcp/account-mcp-server/installation). + Guías de configuración: [Instalación del MCP de documentación](/es/mcp/docs-mcp-server/installation), [Instalación del MCP de cuenta](/es/mcp/account-mcp-server/installation). Usa el [MCP de documentación](/es/mcp/docs-mcp-server/introduction) como contexto de documentación bajo demanda y el [MCP de cuenta](/es/mcp/account-mcp-server/introduction) para cambios de cuenta. Usa ambos para [mejores prácticas](/es/mcp/best-practice). - - Aquí tienes un prompt que puedes usar con tu asistente de IA para realizar la configuración inicial de Trophy: + + Aquí hay un prompt que puedes usar con tu asistente de IA para realizar la configuración inicial de Trophy: - Estoy añadiendo gamificación a mi aplicación usando Trophy. + Estoy agregando gamificación a mi aplicación usando Trophy. - Antes de hacer cambios, verifica que los servidores MCP de Trophy conectados estén disponibles. Usa el servidor MCP de documentación como la fuente principal de información para los detalles de integración de Trophy, y el servidor MCP de cuenta para configurar mi cuenta. + Antes de realizar cambios, verifica que los servidores MCP de Trophy conectados estén disponibles. Usa el servidor MCP de documentación como la fuente principal de verdad para los detalles de integración de Trophy, y el servidor MCP de cuenta para configurar mi cuenta. - Realiza la configuración inicial completa de principio a fin: - 1. Detecta el lenguaje/framework del backend en este repositorio e instala el SDK oficial de Trophy correspondiente (o utiliza llamadas HTTP si no hay SDK disponible). Informa al soporte de Trophy si no hay SDK disponible. - 2. Agrega `TROPHY_API_KEY` a la configuración de entorno de forma segura (sin secretos comprometidos en git), e intégralo en la inicialización del cliente del SDK de Trophy. - 3. Agrega código para configurar el seguimiento de eventos de métricas para la actividad de usuario elegida (pregunta si aún no se conoce) usando el cliente del SDK de Trophy, conectando todos los atributos de usuario requeridos como ID, y usando marcadores de posición para todos los atributos opcionales como nombre, email, zona horaria y fecha de registro, a menos que ya se conozcan o sean requeridos por el caso de uso. - 4. Agrega manejo básico de errores y registro de eventos alrededor de las llamadas al SDK de Trophy. - 5. Agrega o actualiza una breve sección en el README explicando cómo funciona la integración y cómo ampliarla. + Por favor, realiza la configuración inicial completa de principio a fin: + 1. Detecta el lenguaje/framework del backend en este repositorio e instala el SDK oficial de Trophy correspondiente (o usa llamadas HTTP si no hay SDK disponible). Informa al soporte de Trophy si no hay SDK disponible. + 2. Agrega `TROPHY_API_KEY` a la configuración de entorno de forma segura (sin secretos confirmados en git), e intégralo en la inicialización del cliente del SDK de Trophy. + 3. Agrega código para configurar el seguimiento de eventos de métricas para la actividad de usuario elegida (pregunta si aún no se conoce) usando el cliente del SDK de Trophy, conectando todos los atributos de usuario requeridos como ID, y usando marcadores de posición para todos los atributos opcionales como nombre, email, tz y signUpDate, a menos que ya sean conocidos o requeridos por el caso de uso. + 4. Agrega manejo básico de errores y registro de eventos en torno a las llamadas del SDK de Trophy. + 5. Agrega o actualiza una sección breve del README explicando cómo funciona la integración y cómo extenderla. Restricciones: - - Utiliza los resultados de la herramienta Docs MCP para todas las decisiones de implementación e integraciones específicas de Trophy. - - No te bases en memoria previa para el comportamiento del SDK de Trophy cuando MCP proporcione una respuesta. + - Usa los resultados de la herramienta Docs MCP para todas las decisiones de implementación e integraciones específicas de Trophy. + - No confíes en la memoria previa para el comportamiento del SDK de Trophy cuando MCP proporcione una respuesta. - Mantén los secretos fuera del control de código fuente. - - Usa los patrones y convenciones de nomenclatura del proyecto existentes. + - Usa los patrones y convenciones de nomenclatura existentes del proyecto. - Muestra un resumen conciso de los archivos modificados y cómo probar la configuración. - - Sugiere los próximos pasos basándote en las funciones de gamificación que Trophy soporta y el caso de uso. + - Sugiere los siguientes pasos basados en las funciones de gamificación que Trophy soporta y el caso de uso. Esto hará lo siguiente: - 1. Agregar el [SDK de Trophy](/es/api-reference/client-libraries) relevante a tu aplicación según tu stack tecnológico - 2. Agregar una nueva variable `TROPHY_API_KEY` a tu configuración de entorno - 3. Agregar código para rastrear eventos de métricas para la actividad de usuario elegida usando el cliente del SDK de Trophy - requerido para todas las funciones de gamificación. + 1. Agregará el [SDK de Trophy](/es/api-reference/client-libraries) correspondiente a tu aplicación según tu stack tecnológico + 2. Agregará una nueva variable `TROPHY_API_KEY` a tu configuración de entorno + 3. Agregará código para rastrear eventos de métricas para la actividad de usuario elegida usando el cliente del SDK de Trophy - requerido para todas las funciones de gamificación. Una vez completada la configuración inicial, elige un caso de uso común y pega el prompt correspondiente en tu asistente de IA: @@ -79,17 +80,17 @@ Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera iconType="solid" actions={["copy", "cursor"]} > - Crea una función de racha diaria con Trophy. + Crea una funcionalidad de racha diaria con Trophy. - Usa el MCP de Docs como fuente de referencia para cómo funcionan las rachas, y el MCP de Account para configurar mi cuenta. + Usa el MCP de Documentación como fuente de verdad para cómo funcionan las rachas, y el MCP de Cuenta para configurar mi cuenta. Objetivos: - 1. Impulsa la racha desde una actividad de usuario principal ya rastreada (o que debería rastrearse) como una métrica de Trophy. - 2. Asegúrate de que cada identificación/actualización de usuario y evento de métrica incluya el atributo `tz` del usuario (zona horaria IANA). Esto es necesario para que las rachas evalúen correctamente los días calendario para cada usuario. - 3. Configura la función de racha en Trophy usando un umbral sensato para la métrica elegida. - 4. Habilita los congelamientos de racha y las pausas de racha si se ajustan a este producto; de lo contrario, omítelos y explica por qué. - 5. Conecta cualquier lectura del lado de la aplicación o interfaz necesaria para mostrar la racha actual del usuario, los congelamientos y el estado de pausa. - 6. Resume qué se configuró, qué código cambió y cómo verificar la racha de extremo a extremo. Explica explícitamente por qué enviar `tz` es importante para que funcione correctamente la función de racha. + 1. Impulsar la racha desde una actividad principal del usuario que ya se rastree (o que deberíamos rastrear) como una métrica de Trophy. + 2. Asegurar que cada identificación/actualización de usuario y evento de métrica incluya el atributo `tz` del usuario (zona horaria IANA). Esto es necesario para que las rachas evalúen correctamente los días calendario para cada usuario. + 3. Configurar la funcionalidad de racha en Trophy usando un umbral sensato para la métrica elegida. + 4. Habilitar congelaciones de racha y pausas de racha si encajan con este producto; de lo contrario, omitirlas y explicar por qué. + 5. Conectar cualquier lectura del lado de la aplicación o interfaz necesaria para mostrar la racha actual del usuario, congelaciones y estado de pausa. + 6. Resumir qué se configuró, qué código cambió y cómo verificar la racha de principio a fin. Explicar explícitamente por qué enviar `tz` es importante para que funcione correctamente la funcionalidad de racha. Crea una biblioteca de logros con Trophy. - Usa el MCP de Docs como fuente de referencia para los tipos de logros y disparadores, y el MCP de Account para configurar mi cuenta. + Usa el MCP de Documentación como fuente de verdad para tipos de logros y activadores, y el MCP de Cuenta para configurar mi cuenta. Objetivos: - 1. Crea un conjunto de logros vinculados a acciones de usuario principales rastreadas como eventos de métrica de Trophy. - 2. Agrega cualquier logro único activado por API (y otros tipos de logros) que se ajusten al producto. - 3. Conecta el manejo del lado de la aplicación para los desbloqueos y una forma mínima de listar logros completados vs incompletos. - 4. Resume qué se configuró, qué código cambió y cómo verificar los desbloqueos de extremo a extremo. + 1. Crear un conjunto de logros vinculados a acciones principales del usuario rastreadas como eventos de métrica de Trophy. + 2. Agregar cualquier logro activado por API de una sola vez (y otros tipos de logros) que encajen con el producto. + 3. Conectar el manejo del lado de la aplicación para desbloqueos y una forma mínima de listar logros completados vs incompletos. + 4. Resumir qué se configuró, qué código cambió y cómo verificar los desbloqueos de principio a fin. - Construye un sistema de Puntos XP con Trophy. + Crea un sistema de puntos XP con Trophy. - Utiliza el MCP de Documentación como fuente de verdad para sistemas de Puntos, activadores y niveles, y el MCP de Cuenta para configurar mi cuenta. + Usa el MCP de Documentación como fuente de verdad para sistemas de puntos, activadores y niveles, y el MCP de Cuenta para configurar mi cuenta. Objetivos: - 1. Crear un sistema de Puntos que otorgue XP por algunas acciones clave del usuario rastreadas como Métricas de Trophy. - 2. Configurar activadores en el sistema de Puntos para otorgar XP por las acciones de usuario elegidas. - 3. Configurar niveles e impulsos si son relevantes para el caso de uso. - 4. Conectar lecturas del lado de la aplicación o interfaz necesaria para mostrar el total de XP del usuario y el progreso de nivel. - 5. Resumir qué se configuró, qué código cambió y cómo verificar las asignaciones de Puntos de extremo a extremo. + 1. Crear un sistema de puntos que otorgue XP por algunas acciones clave del usuario rastreadas como métricas de Trophy. + 2. Configurar activadores en el sistema de puntos para otorgar XP por las acciones de usuario elegidas. + 3. Configurar niveles y bonificaciones si son relevantes para el caso de uso. + 4. Implementar las lecturas del lado de la aplicación o la interfaz necesarias para mostrar el total de XP del usuario y el progreso de nivel. + 5. Resumir qué se configuró, qué código cambió y cómo verificar las asignaciones de puntos de extremo a extremo. - Construye una Clasificación semanal recurrente con Trophy. + Crea una clasificación semanal recurrente con Trophy. - Utiliza el MCP de Documentación como fuente de verdad para Clasificaciones, y el MCP de Cuenta para configurar mi cuenta. + Usa el MCP de Documentación como fuente de verdad para clasificaciones, y el MCP de Cuenta para configurar mi cuenta. Objetivos: - 1. Crear una Clasificación recurrente semanal impulsada por una acción principal del usuario rastreada como una Métrica de Trophy. - 2. Configurar la lógica de clasificación basada en la Métrica elegida y configurar el programa de reinicio semanal para la Clasificación. - 3. Conectar lecturas del lado de la aplicación o interfaz necesaria para mostrar clasificaciones de la semana actual y el lugar del usuario actual. + 1. Crear una clasificación recurrente semanal impulsada por una acción central del usuario rastreada como una métrica de Trophy. + 2. Configurar la lógica de clasificación basada en la métrica elegida y configurar el calendario de reinicio semanal para la clasificación. + 3. Implementar las lecturas del lado de la aplicación o la interfaz necesarias para mostrar las clasificaciones de la semana actual y la posición del usuario actual. 4. Resumir qué se configuró, qué código cambió y cómo verificar las clasificaciones de extremo a extremo. @@ -151,10 +152,10 @@ Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera Recompensa a los usuarios por el progreso continuo o por realizar acciones específicas. - Motiva a los usuarios a construir hábitos de uso regulares. + Motiva a los usuarios a crear hábitos de uso regular. - Construye sistemas sofisticados de Puntos para recompensar y retener usuarios. + Crea sistemas de puntos sofisticados para recompensar y retener usuarios. - Entrega correos electrónicos personalizados de ciclo de vida a los usuarios en el momento perfecto. + Envía correos electrónicos de ciclo de vida personalizados a los usuarios en el momento perfecto. - Impulsa flujos de notificaciones automatizadas utilizando datos de gamificación personalizados. + Impulsa flujos de notificación automatizados usando datos de gamificación personalizados. - Estas instrucciones son para quienes desean implementar Trophy manualmente. Si prefieres usar IA, cambia de pestaña arriba. + Estas instrucciones son para quienes desean implementar Trophy manualmente. Si en cambio prefieres usar IA, cambia de pestaña arriba. Primero, [crea una nueva cuenta](https://app.trophy.so/sign-up?utm_source=docs&utm_medium=quickstart) si aún no tienes una y dirígete al [panel de Trophy](https://app.trophy.so). - Completa la configuración inicial para preparar tu cuenta. + Completa la configuración inicial para configurar tu cuenta. - Tenemos bibliotecas del SDK disponibles en los principales lenguajes de programación, pero si no encuentras el tuyo en la lista, ¡avísanos y crearemos uno! + Tenemos bibliotecas SDK disponibles en los principales lenguajes de programación, pero si no ves el tuyo en la lista, ¡avísanos y crearemos uno! @@ -205,22 +206,22 @@ Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera - Dirígete a la [página de integración](https://app.trophy.so/integration) del panel de Trophy y crea una nueva clave de API. + Dirígete a la [página de integración](https://app.trophy.so/integration) del panel de Trophy y crea una nueva clave API. - Añade tu clave de API como variable de entorno en tu aplicación backend: + Añade tu clave API como variable de entorno en tu aplicación backend: - Luego inicializa el cliente de la API de Trophy en tu backend usando esa clave de API: + Luego inicializa el cliente de la API de Trophy en tu backend usando esa clave API: - Asegúrate de que todas las llamadas al SDK de Trophy utilicen este cliente para la autenticación. + Asegúrate de que todas las llamadas del SDK de Trophy usen este cliente para la autenticación. - Todas las funciones de gamificación se basan en interacciones de usuarios. En Trophy, usas [Métricas](/es/features/metrics) para definir y modelar esas interacciones y [Eventos](/es/features/events) para rastrearlas. + Todas las funciones de gamificación se basan en las interacciones de los usuarios. En Trophy, usas [Métricas](/es/features/metrics) para definir y modelar esas interacciones y [Eventos](/es/features/events) para rastrearlos. - Aquí crearás tu primera métrica para comenzar. En el panel de Trophy, dirígete a la [página de métricas](https://app.trophy.so/metrics) y presiona el botón _Nueva Métrica_: + Aquí crearás tu primera métrica para comenzar. En el panel de Trophy, dirígete a la [página de métricas](https://app.trophy.so/metrics) y haz clic en el botón _Nueva Métrica_: - Dale un nombre a la métrica y presiona _Guardar_. + Dale un nombre a la métrica y haz clic en _Guardar_. - Una vez que hayas creado tu métrica, dirígete a la pestaña de configuración y copia su clave de referencia de API única. + Una vez que hayas creado tu métrica, ve a la pestaña de configuración y copia su clave de referencia API única. - Para rastrear un evento asociado a esta métrica cuando un usuario interactúa con tu producto, llama a la [API de eventos de cambio de métrica](/es/api-reference/endpoints/events/submit-a-metric-event), pasando los detalles del usuario que realizó la interacción. En este ejemplo, la clave de métrica sería `flashcards-flipped`: + Para rastrear un evento contra esta métrica cuando un usuario interactúa con tu producto, llama a la [API de evento de cambio de métrica](/es/api-reference/endpoints/events/submit-a-metric-event), pasando los detalles del usuario que realizó la interacción. En este ejemplo, la clave de métrica sería `flashcards-flipped`: - + + + Al realizar esta llamada, le estás indicando a Trophy que un usuario específico realizó una interacción con tu producto. Como resultado, Trophy procesará automáticamente cualquier función de gamificación como logros o rachas que hayas configurado para la métrica. + + Utiliza la respuesta para reaccionar a los cambios en el estado de gamificación del usuario y alimentar elementos de la interfaz: - Al realizar esta llamada, le estás indicando a Trophy que un usuario específico ha interactuado con tu producto. Como resultado, Trophy procesará automáticamente cualquier función de gamificación, como logros o rachas, que hayas configurado para la métrica. + Con una métrica integrada en tu backend, estás listo para comenzar a agregar funciones de gamificación a tu producto. - Sigue los enlaces a continuación para obtener más información sobre cada función que puedes crear con Trophy: + Sigue los enlaces a continuación para conocer más sobre cada función que puedes construir con Trophy: Recompensa a los usuarios por su progreso continuo o por realizar acciones específicas. - Motiva a los usuarios a desarrollar hábitos de uso regular. + Motiva a los usuarios a desarrollar hábitos de uso regulares. - Crea sistemas de puntos sofisticados para recompensar y retener usuarios. + Construye sistemas de puntos sofisticados para recompensar y retener usuarios. } href="/es/features/leaderboards"> - Crea competencias amistosas para aumentar el engagement de los usuarios. + Crea competencias amistosas para aumentar la participación de los usuarios. Envía correos electrónicos personalizados del ciclo de vida a los usuarios en el momento perfecto. - Impulsa flujos de notificaciones automatizados utilizando datos de gamificación personalizados. + Impulsa flujos de notificaciones automatizadas utilizando datos de gamificación personalizados. @@ -307,6 +312,6 @@ Aquí integrarás tu aplicación con Trophy y comenzarás a construir tu primera -## Obtener soporte {#get-support} +## Obtener Soporte {#get-support} -¿Quieres contactar con el equipo de Trophy? Contáctanos por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! +¿Quieres ponerte en contacto con el equipo de Trophy? Contáctanos por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte! diff --git a/getting-started/introduction.mdx b/getting-started/introduction.mdx index 0124a1ba..28572a24 100644 --- a/getting-started/introduction.mdx +++ b/getting-started/introduction.mdx @@ -1,44 +1,147 @@ --- title: Welcome to Trophy -description: Trophy documentation for gamification APIs, quickstart guides and tutorials. +description: Trophy is the gamification layer for consumer apps. Build points, achievements, streaks, and leaderboards in minutes with Trophy's pre-built APIs and SDKs. +og:description: Trophy is the gamification layer for consumer apps. Build points, achievements, streaks, and leaderboards in minutes with Trophy's pre-built APIs and SDKs. --- -Trophy is a developer-friendly toolkit for building gamified product experiences in any mobile or web app. +import SdkInstallCommand from "../snippets/sdk-install-command.mdx"; +import VerifiedFirstEvent from "../snippets/verified-first-event.mdx"; +import MetricChangeResponseBlock from "../snippets/metric-change-response-block.mdx"; -It makes building features like [Achievements](/features/achievements), [Streaks](/features/streaks), [Points](/features/points) and [Leaderboards](/features/leaderboards) simple with just a few lines of code, and can send gamified [Emails](/features/emails) and [Push Notifications](/features/push-notifications) to increase your retention and engagement. +Trophy is the gamification layer for consumer apps. Build points, achievements, streaks, and leaderboards in minutes with Trophy’s pre-built APIs and SDKs. + +## Getting started {#getting-started} + +Install a Trophy SDK to track user activity and power points, achievements, streaks, and leaderboards in your app. + + + + + + Set up a Trophy account and build your first feature in five minutes. + + + Learn how to use the REST API to integrate Trophy into your application. + + + Full example application with a full gamification stack using Trophy. + + + +## Using AI agents {#using-ai-agents} + +Connect Trophy’s MCP servers so agents can read live docs and configure your account while integrating. + + +Using Trophy's MCP servers is reccomended for a faster set up and development experience. + + + + + Live documentation search for AI agents. + + + Configure your Trophy account using AI agents. + + + Recommended setup for using both MCP servers together. + + + +## Send your first event {#send-your-first-event} + +All gamification features are powered by [metric events](/features/events). Here's how to send your first event using a Trophy SDK: + + + +The response includes changes to gamification state as a result of the event including: +- The user's new total value for the metric +- Any newly unlocked achievements +- New points totals and rewards +- An updated streak object +- Any new leaderboard positions + +Use this response to react to changes in the user's gamification state and power UI elements. + + + +## Build by use case {#build-by-use-case} + +For more information on how to build common gamification features using Trophy, see the following guides: - - Get familiar with the mental model of gamification in Trophy. + + Unlock achievements from progress or one-time actions. + + + Drive daily or weekly habit loops with timezone-awareness built-in. + + + Award points from in-app actions and set up levels and boosts. + + + } + href="/guides/how-to-build-a-leaderboards-feature" > - Integrate Trophy into your backend in under 10 minutes. + Create recurring or one-off leaderboards. - - Use Trophy to build solutions to common gamification use cases. + + Lifecycle emails driven by streaks, achievements, and activity. - - Explore the Trophy API and see what's possible. + + Automated notification flows using gamification data. -## Why Trophy {#why-trophy} +## UI Kit {#ui-kit} + +Ship gamification UI faster with Trophy’s React component library, built on shadcn/ui and designed to work with Trophy data shapes. + + + Explore pre-built UI components for streaks, achievements, leaderboards, points and more. + + +## Production checklist {#production-checklist} - - - +Before you deploy your integration to production, review the reccomended steps in the production checklist: -If your goal is for your users to create a regular habit of using your app—to learn something, publish content, or even exercise—gamification could be for you. + + Recommended steps to ensure your integration is production-ready. + -It's been proven by the likes of Duolingo and others to predictably boost retention and increase platform engagement. +## Pricing {#pricing} -But building gamification at scale can be tricky. You have a global userbase, all in different timezones, all with different usage patterns that need to be measured and optimized in realtime. Plus, you want to run experiments to test different approaches and see how they impact retention, but this requires constant code changes, which holds up work on your core product. +Trophy meters usage by **monthly active users (MAUs)**. An MAU is a user who sends at least one [metric event](/features/events) in a given calendar month. You are not charged for churned users who stop sending events. -Trophy takes away the legwork involved in building features like achievements, streaks, points systems and leaderboards while providing reliable, scalable APIs for shipping gamification experiences faster than building in-house. Plus, it provides a web platform to easily configure, measure and experiment with the product experience without constant code changes. +The free tier includes **1,000 MAUs**. Paid plans start at $25/month with overages. + + + + Free tier, paid plans, allowances, and overages. + + + Get an estimate of monthly costs based on expected usage. + + ## Get Support {#get-support} diff --git a/getting-started/production-checklist.mdx b/getting-started/production-checklist.mdx new file mode 100644 index 00000000..c61dd980 --- /dev/null +++ b/getting-started/production-checklist.mdx @@ -0,0 +1,71 @@ +--- +title: Production Checklist +description: Idempotency, retries, errors, rate limits, webhooks, and environment configuration for production Trophy integrations. +og:description: Idempotency, retries, errors, rate limits, webhooks, and environment configuration for production Trophy integrations. +--- + +Before deploying your Trophy integration to production, review the following reccomended steps: + + + + Protect metric writes so retries and duplicate submissions do not double-count progress or awards. + + + More information on idempotency and how to use it in your integration. + + + + + Handle transient failures when calling Trophy, and understand how Trophy retries webhook delivery to your endpoints. + + + + When it's safe to retry API calls, and when it's not. + + + How Trophy retries failed deliveries to your webhook endpoints. + + + + + + Understand the different types of errors Trophy emits, and how to handle them in your integration. + + + Common HTTP status codes emitted by the Trophy API. + + + + + Trophy uses rate limits scoped at the organisation level to prevent abuse and ensure fair usage. Understand how to stay within them, and how to handle being throttled. + + + Trophy's tiered rate limit model and how it works. + + + + + If you consume Trophy events in production via webhooks, ensure to set up signature verification to prevent spoofing. + + + + What Trophy webhooks cover and when to use them. + + + Verify webhook signatures in production. + + + + + + Isolate development, staging, and production configuration and traffic so non-production work cannot affect live users. + + + Production, staging, and development environments in Trophy. + + + + +## Get Support {#get-support} + +Want to get in touch with the Trophy team? Reach out to us via [email](mailto:support@trophy.so). We're here to help! diff --git a/getting-started/quickstart.mdx b/getting-started/quickstart.mdx index 19858435..e48c5397 100644 --- a/getting-started/quickstart.mdx +++ b/getting-started/quickstart.mdx @@ -1,17 +1,16 @@ --- title: Quick Start -description: Get up and running with Trophy in under 10 minutes -og:description: Follow this quick start guide to integrate Trophy into your - backend and add gamified features like achievements and streaks into your app. +description: Install a Trophy SDK, authenticate, identify a user, and submit your first metric event in about five minutes. +og:description: Install a Trophy SDK, authenticate, identify a user, and submit your first metric event in about five minutes. --- import SdkInstallCommand from "../snippets/sdk-install-command.mdx"; import AddEnvVarBlock from "../snippets/add-env-var-block.mdx"; import TrophyClientInitBlock from "../snippets/trophy-client-init-block.mdx"; -import MetricChangeRequestBlock from "../snippets/metric-change-request-block.mdx"; import MetricChangeResponseBlock from "../snippets/metric-change-response-block.mdx"; +import VerifiedFirstEvent from "../snippets/verified-first-event.mdx"; -Here you'll integrate your application with Trophy and start building your first gamified feature. +Here you'll integrate your application with Trophy and start building your first gamified feature in about five minutes. @@ -252,9 +251,13 @@ Here you'll integrate your application with Trophy and start building your first To track an event against this metric when a user interacts with your product, call the [metric change event API](/api-reference/endpoints/events/submit-a-metric-event), passing along details of the user that made the interaction. In this example the metric key would be `flashcards-flipped`: - + By making this call, you're telling Trophy that a specific user made an interaction with your product. As a result, Trophy will process any gamification features like achievements or streaks that you've configured against the metric automatically. + + Use the response to react to changes in the user's gamification state and power UI elements: + + diff --git a/i18n.lock b/i18n.lock index 96e28b89..55ed58ee 100644 --- a/i18n.lock +++ b/i18n.lock @@ -167,8 +167,8 @@ checksums: content/28: 9799b973234bf2d10d5c971b267f55a5 f957a4c6de0f91b449afb7e96daedaef: meta/title: 510e0fcb11a2a956510148bda5ad5ace - meta/description: 33690c4d6ca0e3da8147229707139ce9 - meta/og%3Adescription: 45ad445ee58a69fb3a2f836d2ef25ee6 + meta/description: 3dc4e51b18c16f27b38d44293e7ba386 + meta/og%3Adescription: 3dc4e51b18c16f27b38d44293e7ba386 meta/icon: e4cd2c59f9f209b1f1add208482ae353 content/0: 3e74225e256f07ef6a994577f8e19c55 content/1: ecbd4e322d4c6ad36b851509fd148fb7 @@ -371,7 +371,7 @@ checksums: content/21: 9799b973234bf2d10d5c971b267f55a5 c7655899a5189ba004485e3d927cb1f0: meta/title: 439cb79e8dfd7923d35b85cfbb6fd201 - meta/description: f2638706ddce9c7d9fea48aadb2d8d8f + meta/description: 6efd6bb90f99dc72ec7b9dad5d9d2ce7 meta/subtitle: f2638706ddce9c7d9fea48aadb2d8d8f content/0: e9e63fd2e37a53e4b57fbb8d8beb0733 content/1: b71fe27a6e41c3f057b432f29664bbfe @@ -380,7 +380,7 @@ checksums: content/4: 9a3e928acd2ede61648f44f91d097986 content/5: 661e97346571e3f16d7b8aaf91b7be9f content/6: c4b67660a6923fcadc5678838e949d72 - content/7: afbb93dab75a08031bea8e34c79ea8d2 + content/7: 27aaa27b4e97686236403ad74489a8f0 content/8: 10e8e9a59847ddd720c6d06b12c7b120 content/9: 9799b973234bf2d10d5c971b267f55a5 b4af38dc2d0b2a8bad04b2c13c31c91b: @@ -456,24 +456,45 @@ checksums: content/9: 9799b973234bf2d10d5c971b267f55a5 8f4ff21d5d4dbbcadcb571bf84961d44: meta/title: 88a605c18de258db1a119eb32377af89 - meta/description: 2e8b0385f2d1f523725686f68c6c1bd7 - content/0: 1afd0e053c8f9915148f7daa14eb2294 - content/1: 29835a20d59e7589975e37bef7a19739 - content/2: 475f81a69eeb799ff3f96da0607b659a - content/3: eadf663b83d7e238fbbaee0881e970e9 - content/4: 9519335adbb8eea2f9c5ceb92cbf665f - content/5: 8c067d15221f598260d781f6690ad75d - content/6: 6eca45e711e7322616957cf0b0ef0779 - content/7: d84c9ed6d3c3ff1404ec60198b8ae485 - content/8: 3fca0207e4dfa676f5c7d63dd1e46be5 - content/9: 10e8e9a59847ddd720c6d06b12c7b120 - content/10: 9799b973234bf2d10d5c971b267f55a5 + meta/description: c63369255dd33847980f2a20966b102c + meta/og%3Adescription: c63369255dd33847980f2a20966b102c + content/0: 95797ce1836f2bcd0f114662a329a4dd + content/1: c55b5ec1e8634f72ad561af0ecb3ed2a + content/2: 6b8e7da4daac25ec2892b43145dabd4f + content/3: 4b940fc078126325c3ce96076f91ac83 + content/4: f79087a5dee91cde9b178a1856f67978 + content/5: 8d45725b99559e291e8b0c3432610906 + content/6: ad67b11e3d79712fdc31eba319906efb + content/7: 7e120645ea7a110ba54d53b9e9ff9372 + content/8: 0b087f67cc9a17f0e43e7630679baa5d + content/9: fec2102ff7fff4423ddf794ebb7bd282 + content/10: a860d16e47d820d7081c0032123702da + content/11: 089faa0da48e3083b05c97090ade537d + content/12: db6e6df76d91bfb1ec37eece9eaaf6ac + content/13: d56114413e84a6680d42fdb70c3c4c22 + content/14: 75ad81378f423629f8dee586f760be5e + content/15: 380be3ed5af370f2d36a66f4c55f7f0b + content/16: f9460191080481c6764a4106c3a1f3b7 + content/17: bc201f651e82fa6182253aedb16644e7 + content/18: 579641e7fe5b59aceb1bc1dc3d5e58e4 + content/19: 4992ad4e5540ffe4e58745aeb33ce98c + content/20: 8e305de57220de87816acd6b0181ca1d + content/21: 2fdfeeb48a52310485f732e60508997f + content/22: a902511a5c2cb9740449837e8ca035ba + content/23: 1b23b53af5690161e42892ad61dfb15a + content/24: 6c3a473ca25ba59eceeaecea177667d5 + content/25: 9115457f73326a2803933d910692e144 + content/26: 592405c98d8a268886bc88f3f0fe22b1 + content/27: 625962aa1288ea461a4f16c9499c04d4 + content/28: a2f88525293f1e14f44a31d7175a3074 + content/29: 10e8e9a59847ddd720c6d06b12c7b120 + content/30: 9799b973234bf2d10d5c971b267f55a5 eb1cf4bac81e58672157fa85b4971832: meta/title: 1f7444492b1434872386d0d93df30e6b - meta/description: 2e4b53d1f513ed4b0baf43b3e03c50d0 - meta/og%3Adescription: 0c31ff8357910c4566c5444ba7ec2d9a - content/0: 6e422a40926769a70977ec8760d8678a - content/1: f8e9ee9e70d3979a06b50feb6cbdd428 + meta/description: 31bfee5006caa290c9b1cb5d4ee6a7bb + meta/og%3Adescription: 31bfee5006caa290c9b1cb5d4ee6a7bb + content/0: e183acb85c4572c6ca935ebd7af6aad3 + content/1: 944394a942d30ba8791b20181c0e210d content/2: 8a3d931d7ee427303e7384903d387fb3 content/3: d25e107a9b6556da0b92a9bd3a16db7f content/4: 2d9541b4b7bf812e9354a256be7e3cb5 @@ -515,14 +536,15 @@ checksums: content/40: dffb591a41a53b1baaa93e10c333afef content/41: 9a227656a512c5a79fc25ce848ebf163 content/42: 67b49c25a88dfb4a006ae21c0e23ede7 - content/43: a69085aaa46c9b99c79ca3266d228e00 - content/44: f3931e5548f073249acc2b79e7972bf8 - content/45: 2e43465d0cd62f76e82df405620d29b6 - content/46: 2de31ce64ae2ec0643e35b5d4f3794d7 - content/47: c7293817039526172227474b477af24f - content/48: ff7d593434f7d8110b39a5b55748f428 - content/49: 10e8e9a59847ddd720c6d06b12c7b120 - content/50: 9799b973234bf2d10d5c971b267f55a5 + content/43: f5029e5ae96046c3598069a4c1afb8d7 + content/44: 4bb58da8f4b83d50ec3aaa3fb5595363 + content/45: 6901290f4d34459a89977cdd12bcc614 + content/46: 2e43465d0cd62f76e82df405620d29b6 + content/47: 2de31ce64ae2ec0643e35b5d4f3794d7 + content/48: c7293817039526172227474b477af24f + content/49: ff7d593434f7d8110b39a5b55748f428 + content/50: 10e8e9a59847ddd720c6d06b12c7b120 + content/51: 9799b973234bf2d10d5c971b267f55a5 953868115d4c9e608173a3be973757d5: meta/title: f48ab602c5c8031afd2de550b2778bf0 meta/description: e25074e52204f7c87fd6279e356af78d @@ -7137,3 +7159,36 @@ checksums: content/0: c3d96e3528a55b20b8fbcae10af25b02 content/1: 264d832bc605beaf5168c080bfed567c content/2: 580af53aa9812f2ec29a632e145669a5 + 46f9045599e4bbcaaf6bf72832210ccf: + meta/title: 6026af43b623f7a89b279cef2c0eb63b + meta/description: ab37a9b9f6acaf1f000f2864bd8809e7 + meta/og%3Adescription: ab37a9b9f6acaf1f000f2864bd8809e7 + meta/icon: 646a00658bcecb088682612f65fc1e8f + content/0: aaed86c5b1e8f0134a9fdb9e00401b30 + content/1: e7a3cfc489605455e436b738cdc1d6d4 + content/2: e1b0fb4227aa9dab1acdfcdee549ac3c + content/3: 7afc23af6a797bf70c7ee601b3606e80 + content/4: 47cd3231b591dc2216aa8b1a95f24002 + content/5: 351c9c51642f0b8af0cc2f46c86ca04d + content/6: 6bfd8352dabe99914c458c3615a4e820 + content/7: 10e8e9a59847ddd720c6d06b12c7b120 + content/8: 9799b973234bf2d10d5c971b267f55a5 + c90c7a4d95a78c0966ec9e9c2a401288: + meta/title: b40515e293ba2d7ed8a46ca6f0e760df + meta/description: 74e480d8daead09fca4c4edad8c1f043 + meta/og%3Adescription: 74e480d8daead09fca4c4edad8c1f043 + content/0: ce8caca8834119599d5fc45cb093786c + content/1: 2b01b3b15c2ae1a951e24aba3eda5ebd + content/2: ca171c2921b70969fdfd864007e4805a + content/3: 0fa1a20c6d11a5eccff458ef331fab4a + content/4: 853dd3a76f39664633dfc2b55ec1a0df + content/5: e6e307bb55c1cfc3f697b2f16df73b26 + content/6: 4a5edab17b82ce9bb0587706c5277d8e + content/7: 01354b0d22275b7a3741d3dcef9a56b3 + content/8: 188cb914db3a7780a6f2aa5aff9041ca + content/9: dbe0f5b252d768c76c6452d7e24c9da8 + content/10: 26d96702beb4df56e665d0e3ad3a9638 + content/11: ba29723717bc525661ab294e38af6302 + content/12: af0feb53dc5665ddb60c7e0bf27f5ba1 + content/13: 10e8e9a59847ddd720c6d06b12c7b120 + content/14: 9799b973234bf2d10d5c971b267f55a5 diff --git a/snippets/metric-change-request-block.mdx b/snippets/metric-change-request-block.mdx index af916994..6bc1040e 100644 --- a/snippets/metric-change-request-block.mdx +++ b/snippets/metric-change-request-block.mdx @@ -1,7 +1,8 @@ ```bash cURL -curl -X POST https://app.trophy.so/api/metrics/flashcards-flipped/event \ +curl -X POST https://api.trophy.so/v1/metrics/flashcards-flipped/event \ -H "X-API-KEY: " \ + -H "Idempotency-Key: flashcard-view-42" \ -H "Content-Type: application/json" \ -d '{ "user": { @@ -14,14 +15,20 @@ curl -X POST https://app.trophy.so/api/metrics/flashcards-flipped/event \ ``` ```typescript Node -trophy.metrics.event("flashcards-flipped", { - user: { - id: "18", - email: "user@example.com", - tz: "Europe/London", - }, - value: 750, -}); +import type { EventResponse } from "@trophyso/node/api"; + +const response: EventResponse = await trophy.metrics.event( + "flashcards-flipped", + { + user: { + id: "18", + email: "user@example.com", + tz: "Europe/London", + }, + value: 750, + idempotencyKey: "flashcard-view-42", + } +); ``` ```python Python diff --git a/snippets/metric-change-response-block.mdx b/snippets/metric-change-response-block.mdx index d787bcb0..b83ff392 100644 --- a/snippets/metric-change-response-block.mdx +++ b/snippets/metric-change-response-block.mdx @@ -13,7 +13,9 @@ "metricName": "Flashcards Flipped", "metricValue": 500, "name": "500 Flashcards Flipped", - "description": "Write 500 words in the app.", + "description": "Flip 500 flashcards in the app.", + "badgeUrl": null, + "userAttributes": [], "achievedAt": "2020-01-01T00:00:00Z" } ], @@ -23,7 +25,8 @@ "started": "2025-04-02", "periodStart": "2025-03-31", "periodEnd": "2025-04-05", - "expires": "2025-04-12" + "expires": "2025-04-12", + "extended": true }, "points": { "xp": { @@ -54,7 +57,11 @@ "type": "metric", "metricName": "Flashcards Flipped", "metricThreshold": 100, - "points": 10 + "points": 10, + "status": "active", + "userAttributes": [], + "created": "2021-01-01T00:00:00Z", + "updated": "2021-01-01T00:00:00Z" } } ] @@ -66,18 +73,24 @@ "key": "daily_champions", "name": "Daily Champions", "description": null, + "status": "active", "rankBy": "metric", - "runUnit": null, - "runInterval": 0, + "runUnit": "day", + "runInterval": 1, "maxParticipants": 100, + "breakdownAttributes": [], "metricName": "Flashcards Flipped", "metricKey": "flashcards-flipped", "threshold": 10, "start": "2025-01-01", "end": null, + "startTime": null, + "endTime": null, "previousRank": 50, "rank": 12 } - } + }, + "idempotencyKey": "flashcard-view-42", + "idempotentReplayed": false } ``` diff --git a/snippets/verified-first-event.mdx b/snippets/verified-first-event.mdx new file mode 100644 index 00000000..1f78a8ed --- /dev/null +++ b/snippets/verified-first-event.mdx @@ -0,0 +1,182 @@ +{/* vale off */} + + +```bash cURL +curl -X POST https://api.trophy.so/v1/metrics/flashcards-flipped/event \ + -H "X-API-KEY: $TROPHY_API_KEY" \ + -H "Idempotency-Key: flashcard-view-42" \ + -H "Content-Type: application/json" \ + -d '{ + "user": { + "id": "18", + "email": "user@example.com", + "tz": "Europe/London" + }, + "value": 1 +}' +``` + +```typescript Node +import { TrophyApiClient } from "@trophyso/node"; +import type { EventResponse } from "@trophyso/node/api"; + +const trophy = new TrophyApiClient({ + apiKey: process.env.TROPHY_API_KEY as string, +}); + +// user.id is required. email and tz are optional but recommended +// (tz is required for correct streak calendar days). +const response: EventResponse = await trophy.metrics.event( + "flashcards-flipped", + { + user: { + id: "18", + email: "user@example.com", + tz: "Europe/London", + }, + value: 1, + // Protects against duplicate events from the same flashcard + idempotencyKey: "flashcard-view-42", + } +); +``` + +```python Python +from trophy import Trophy +from trophy.types import EventRequestUser + +client = Trophy( + api_key=os.environ.get("TROPHY_API_KEY"), +) + +# user.id is required. email and tz are optional but recommended +# (tz is required for correct streak calendar days). +response = client.metrics.event( + key="flashcards-flipped", + user=EventRequestUser( + id="18", + email="user@example.com", + tz="Europe/London", + ), + value=1.0, + idempotencyKey="flashcard-view-42", # Protects against duplicate events from the same flashcard +) +``` + +```php PHP +use Trophy\TrophyClient; +use Trophy\Types\EventRequestUser; +use Trophy\Types\MetricsEventRequest; + +$trophy = new TrophyClient([ + 'apiKey' => getenv('TROPHY_API_KEY') +]); + +// user.id is required. email and tz are optional but recommended +// (tz is required for correct streak calendar days). +$user = new EventRequestUser([ + 'id' => '18', + 'email' => 'user@example.com', + 'tz' => 'Europe/London', +]); + +$request = new MetricsEventRequest([ + 'user' => $user, + 'value' => 1, + // Protects against duplicate events from the same flashcard + 'idempotencyKey' => 'flashcard-view-42', +]); + +$response = $trophy->metrics->event("flashcards-flipped", $request); +``` + +```java Java +TrophyApiClient client = TrophyApiClient.builder() + .apiKey(System.getenv("TROPHY_API_KEY")) + .build(); + +// user.id is required. email and tz are optional but recommended +// (tz is required for correct streak calendar days). +MetricsEventRequest request = MetricsEventRequest.builder() + .user( + EventRequestUser.builder() + .id("18") + .email("user@example.com") + .tz("Europe/London") + .build() + ) + .value(1) + // Protects against duplicate events from the same flashcard + .idempotencyKey("flashcard-view-42") + .build(); + +EventResponse response = client.metrics().event("flashcards-flipped", request); +``` + +```go Go +client, err := trophy.NewClient( + option.WithAPIKey(os.Getenv("TROPHY_API_KEY")), +) +if err != nil { + log.Fatal(err) +} + +// user.id is required. email and tz are optional but recommended +// (tz is required for correct streak calendar days). +response, err := client.Metrics.Event( + "flashcards-flipped", + &api.MetricsEventRequest{ + User: &api.EventRequestUser{ + Id: "18", + Email: "user@example.com", + Tz: "Europe/London", + }, + Value: 1, + // Protects against duplicate events from the same flashcard + IdempotencyKey: "flashcard-view-42", + }, +) +``` + +```csharp C# +var trophy = new TrophyClient( + Environment.GetEnvironmentVariable("TROPHY_API_KEY") +); + +// user.id is required. email and tz are optional but recommended +// (tz is required for correct streak calendar days). +var user = new EventRequestUser { + Id = "18", + Email = "user@example.com", + Tz = "Europe/London" +}; + +var request = new MetricsEventRequest { + User = user, + Value = 1, + // Protects against duplicate events from the same flashcard + IdempotencyKey = "flashcard-view-42" +}; + +var response = await trophy.Metrics.EventAsync("flashcards-flipped", request); +``` + +```ruby Ruby +client = TrophyApiClient::Client.new( + :api_key => ENV["TROPHY_API_KEY"] +) + +# user.id is required. email and tz are optional but recommended +# (tz is required for correct streak calendar days). +result = client.metrics.event( + :key => 'flashcards-flipped', + :user => { + :id => '18', + :email => 'user@example.com', + :tz => 'Europe/London' + }, + :value => 1, + :idempotencyKey => 'flashcard-view-42' # Protects against duplicate events from the same flashcard +) +``` + From 2e49b98847c9240a204e16b5121f224484cd2b98 Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Tue, 15 Sep 2026 01:22:52 +0100 Subject: [PATCH 2/4] pr review --- api-reference/client-libraries.mdx | 4 ++-- es/getting-started/production-checklist.mdx | 2 +- getting-started/introduction.mdx | 4 ++-- getting-started/production-checklist.mdx | 4 ++-- styles/config/vocabularies/Trophy/accept.txt | 1 + 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/api-reference/client-libraries.mdx b/api-reference/client-libraries.mdx index bf73fb1c..ebe400b7 100644 --- a/api-reference/client-libraries.mdx +++ b/api-reference/client-libraries.mdx @@ -1,7 +1,7 @@ --- title: Client Libraries -description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repos. -og:description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repos. +description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repositories. +og:description: Official Trophy SDKs for Node, Go, Java, .NET, PHP, Python, and Ruby with install commands and GitHub repositories. icon: code-xml --- diff --git a/es/getting-started/production-checklist.mdx b/es/getting-started/production-checklist.mdx index 39ee8984..2a47d56f 100644 --- a/es/getting-started/production-checklist.mdx +++ b/es/getting-started/production-checklist.mdx @@ -34,7 +34,7 @@ Antes de implementar tu integración de Trophy en producción, revisa los siguie Comprende los diferentes tipos de errores que emite Trophy y cómo manejarlos en tu integración. - + Códigos de estado HTTP comunes emitidos por la API de Trophy. diff --git a/getting-started/introduction.mdx b/getting-started/introduction.mdx index 28572a24..643eb6c8 100644 --- a/getting-started/introduction.mdx +++ b/getting-started/introduction.mdx @@ -37,7 +37,7 @@ Install a Trophy SDK to track user activity and power points, achievements, stre Connect Trophy’s MCP servers so agents can read live docs and configure your account while integrating. -Using Trophy's MCP servers is reccomended for a faster set up and development experience. +Using Trophy's MCP servers is recommended for a faster set up and development experience. @@ -122,7 +122,7 @@ Ship gamification UI faster with Trophy’s React component library, built on sh ## Production checklist {#production-checklist} -Before you deploy your integration to production, review the reccomended steps in the production checklist: +Before you deploy your integration to production, review the recommended steps in the production checklist: Recommended steps to ensure your integration is production-ready. diff --git a/getting-started/production-checklist.mdx b/getting-started/production-checklist.mdx index c61dd980..d51d84b9 100644 --- a/getting-started/production-checklist.mdx +++ b/getting-started/production-checklist.mdx @@ -4,7 +4,7 @@ description: Idempotency, retries, errors, rate limits, webhooks, and environmen og:description: Idempotency, retries, errors, rate limits, webhooks, and environment configuration for production Trophy integrations. --- -Before deploying your Trophy integration to production, review the following reccomended steps: +Before deploying your Trophy integration to production, review the following recommended steps: @@ -31,7 +31,7 @@ Before deploying your Trophy integration to production, review the following rec Understand the different types of errors Trophy emits, and how to handle them in your integration. - + Common HTTP status codes emitted by the Trophy API. diff --git a/styles/config/vocabularies/Trophy/accept.txt b/styles/config/vocabularies/Trophy/accept.txt index 7f635bcd..74f11f66 100644 --- a/styles/config/vocabularies/Trophy/accept.txt +++ b/styles/config/vocabularies/Trophy/accept.txt @@ -1,5 +1,6 @@ # General MAUs +[Bb]ackoff [Gg]amification SDKs gamified From 0f07bf53aa18115456d69ae0dd4cf56a93aa0f4c Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Tue, 15 Sep 2026 01:28:21 +0100 Subject: [PATCH 3/4] update translations --- es/api-reference/client-libraries.mdx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/es/api-reference/client-libraries.mdx b/es/api-reference/client-libraries.mdx index 990d5954..f5b9f447 100644 --- a/es/api-reference/client-libraries.mdx +++ b/es/api-reference/client-libraries.mdx @@ -1,8 +1,7 @@ --- title: Bibliotecas de Cliente -description: Utiliza los SDK con tipado seguro de Trophy para integrar con la API. -og:description: Utiliza los SDK con tipado seguro de Trophy para integrar con la - API y empezar a crear experiencias de producto gamificadas. +description: SDKs oficiales de Trophy para Node, Go, Java, .NET, PHP, Python y Ruby con comandos de instalación y repositorios de GitHub. +og:description: SDKs oficiales de Trophy para Node, Go, Java, .NET, PHP, Python y Ruby con comandos de instalación y repositorios de GitHub. icon: code-xml --- From ceb87ada416695f3d8e24ba3e905db127dae297b Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Tue, 15 Sep 2026 01:28:44 +0100 Subject: [PATCH 4/4] lock --- i18n.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i18n.lock b/i18n.lock index 55ed58ee..463df373 100644 --- a/i18n.lock +++ b/i18n.lock @@ -167,8 +167,8 @@ checksums: content/28: 9799b973234bf2d10d5c971b267f55a5 f957a4c6de0f91b449afb7e96daedaef: meta/title: 510e0fcb11a2a956510148bda5ad5ace - meta/description: 3dc4e51b18c16f27b38d44293e7ba386 - meta/og%3Adescription: 3dc4e51b18c16f27b38d44293e7ba386 + meta/description: c1aff8702a38e42264fd016d2b1e1d22 + meta/og%3Adescription: c1aff8702a38e42264fd016d2b1e1d22 meta/icon: e4cd2c59f9f209b1f1add208482ae353 content/0: 3e74225e256f07ef6a994577f8e19c55 content/1: ecbd4e322d4c6ad36b851509fd148fb7 @@ -466,7 +466,7 @@ checksums: content/5: 8d45725b99559e291e8b0c3432610906 content/6: ad67b11e3d79712fdc31eba319906efb content/7: 7e120645ea7a110ba54d53b9e9ff9372 - content/8: 0b087f67cc9a17f0e43e7630679baa5d + content/8: 2b9e71b2d11cad4e5632e0d7c9650f5d content/9: fec2102ff7fff4423ddf794ebb7bd282 content/10: a860d16e47d820d7081c0032123702da content/11: 089faa0da48e3083b05c97090ade537d @@ -481,7 +481,7 @@ checksums: content/20: 8e305de57220de87816acd6b0181ca1d content/21: 2fdfeeb48a52310485f732e60508997f content/22: a902511a5c2cb9740449837e8ca035ba - content/23: 1b23b53af5690161e42892ad61dfb15a + content/23: 6414da1e3209f59423023a318be61d0d content/24: 6c3a473ca25ba59eceeaecea177667d5 content/25: 9115457f73326a2803933d910692e144 content/26: 592405c98d8a268886bc88f3f0fe22b1 @@ -7177,13 +7177,13 @@ checksums: meta/title: b40515e293ba2d7ed8a46ca6f0e760df meta/description: 74e480d8daead09fca4c4edad8c1f043 meta/og%3Adescription: 74e480d8daead09fca4c4edad8c1f043 - content/0: ce8caca8834119599d5fc45cb093786c + content/0: 647170c85d25f031efb8be32dcf3d319 content/1: 2b01b3b15c2ae1a951e24aba3eda5ebd content/2: ca171c2921b70969fdfd864007e4805a content/3: 0fa1a20c6d11a5eccff458ef331fab4a content/4: 853dd3a76f39664633dfc2b55ec1a0df content/5: e6e307bb55c1cfc3f697b2f16df73b26 - content/6: 4a5edab17b82ce9bb0587706c5277d8e + content/6: db550fdfc0174769142d244aae085187 content/7: 01354b0d22275b7a3741d3dcef9a56b3 content/8: 188cb914db3a7780a6f2aa5aff9041ca content/9: dbe0f5b252d768c76c6452d7e24c9da8