diff --git a/.github/workflows/validate-translations.yml b/.github/workflows/validate-translations.yml
index f9e03bc7..fd0c342b 100644
--- a/.github/workflows/validate-translations.yml
+++ b/.github/workflows/validate-translations.yml
@@ -9,6 +9,7 @@ on:
- "openapi/**"
- "package.json"
- "account/**"
+ - "company/**"
- "admin-api/**"
- "api-reference/**"
- "components/**"
diff --git a/company/security.mdx b/company/security.mdx
new file mode 100644
index 00000000..e3eaf620
--- /dev/null
+++ b/company/security.mdx
@@ -0,0 +1,118 @@
+---
+title: Security
+description: How Trophy protects customer data, controls access, and approaches compliance.
+og:description: How Trophy protects customer data, controls access, and approaches compliance.
+icon: shield-check
+---
+
+## Data Residency {#data-residency}
+
+All customer data is stored and processed on cloud infrastructure hosted in London within GDPR compliance.
+
+Other data residency options are available. [Contact support](mailto:support@trophy.so) to discuss them.
+
+## Data Security {#data-security}
+
+### Encryption {#encryption}
+
+| Control area | Status | Notes |
+| --- | --- | --- |
+| Encryption in transit (TLS 1.2+) | In place | All API and web traffic uses HTTPS/TLS. |
+| Encryption at rest | In place | Application volumes are encrypted. |
+| Database encryption at rest | In place | Database volumes and cache stores are encrypted. |
+| Secrets management | In place | Environment variables are stored in secure vaults. |
+
+### Data Classification {#data-classification}
+
+Trophy processes the following categories of end-user data:
+
+- User identifiers (anonymous external IDs provided by customers)
+- Time zone identifiers (IANA)
+- Gamification event data (actions, points, leaderboard ranks, timestamps, and similar events)
+- Notification preferences (push notification and email subscription flags)
+
+By default, Trophy does not store personally identifiable information (PII) directly. It is possible to send the following PII to Trophy, but it is not required:
+
+- User name
+- Email address
+
+It is also possible to send custom attributes (customer-managed key-value pairs attached to users and events) to Trophy with PII-status determined by the customer use case.
+
+Trophy processes the following categories of customer data:
+
+- Customer account and billing information
+
+Trophy does not have access to customer passwords or credit card data.
+
+### Data Retention and Deletion {#data-retention-and-deletion}
+
+- Customer data is retained for the duration of the contract and deleted within 30 days of contract termination on written request.
+- You can request deletion of your data at any time by contacting [support@trophy.so](mailto:support@trophy.so).
+
+### Backups {#backups}
+
+- Daily automated snapshots of all databases
+- Restore procedures are tested annually
+
+## Access Controls {#access-controls}
+
+### Internal Access {#internal-access}
+
+| Control area | Status | Notes |
+| --- | --- | --- |
+| Role-based access control (RBAC) | In place | Enabled on all cloud providers |
+| Multi-factor authentication (MFA) | In place | Enabled on all cloud providers |
+| SSO / identity provider | In place | Enabled on relevant internal systems |
+| Access reviews | In place | Reviewed annually |
+
+### Principle of Least Privilege {#principle-of-least-privilege}
+
+All internal access follows least-privilege principles. Engineers are granted access only to the systems required for their role. Production database access is restricted to senior engineers and requires justification.
+
+### Customer Data Isolation {#customer-data-isolation}
+
+Each customer's data is isolated using customer-scoped API keys and row-level filtering. Customers can only access their own data.
+
+## Application Security {#application-security}
+
+### Development Practices {#development-practices}
+
+- All production code undergoes mandatory peer review before merge.
+- Branch protection policies enforce this at the repository level, preventing direct commits.
+- Dependency vulnerabilities are monitored continuously through GitHub security alerts.
+- Secrets are never committed to source control.
+
+### Vulnerability Management {#vulnerability-management}
+
+| Control area | Status | Notes |
+| --- | --- | --- |
+| Dependency vulnerability scanning | In place | Automated on builds |
+| Security patch SLA | In place | Critical patches applied within 24 hours |
+
+### API Security {#api-security}
+
+- All API access requires authenticated API keys scoped to the customer account.
+- API keys can be rotated and revoked at any time in the Trophy dashboard.
+- API keys are encrypted before they are stored in the database.
+- Rate limiting is applied to all API endpoints to prevent abuse.
+- Webhook signature verification is under customer control. Trophy recommends [verifying signatures](/webhooks/security) in webhook endpoints.
+
+### Web Application Security {#web-application-security}
+
+- Access to the Trophy dashboard is secured by an identity provider that holds an independent SOC 2 Type II certification. The identity provider manages user authentication, including credential storage, session management, and token issuance. Trophy does not store or handle raw user passwords.
+- Dashboard access follows the principle of least privilege. Admin accounts grant and revoke access for other members.
+- Multi-factor authentication (MFA) for customer accounts is available [on request](mailto:support@trophy.so).
+- Single sign-on (SSO) for customer accounts is available [on request](mailto:support@trophy.so).
+- Sessions use short-lived JWT tokens with automatic expiry.
+- Customer accounts are fully isolated at the data layer. Authenticated sessions are scoped to the issuing organisation and cannot access data belonging to other customers.
+- Application development follows the OWASP Top 10 as a baseline for identifying and mitigating common web application vulnerabilities, including injection attacks, broken authentication, and security misconfiguration.
+
+## GDPR {#gdpr}
+
+- Trophy acts as a data processor for customer data under GDPR.
+- Trophy is fully compliant with all GDPR practices and procedures for data handling.
+- We are happy to enter into a Data Processing Agreement (DPA) with customers. Request one from your account contact.
+
+
+ Contact [support@trophy.so](mailto:hello@trophy.so) for a copy of our full security and trust policies.
+
diff --git a/docs.json b/docs.json
index 3d68c002..b8e756f9 100644
--- a/docs.json
+++ b/docs.json
@@ -118,6 +118,12 @@
"account/branding",
"account/billing"
]
+ },
+ {
+ "group": "Company",
+ "pages": [
+ "company/security"
+ ]
}
]
},
@@ -527,6 +533,12 @@
"es/account/branding",
"es/account/billing"
]
+ },
+ {
+ "group": "Empresa",
+ "pages": [
+ "es/company/security"
+ ]
}
]
},
diff --git a/es/company/security.mdx b/es/company/security.mdx
new file mode 100644
index 00000000..6ce8c2d0
--- /dev/null
+++ b/es/company/security.mdx
@@ -0,0 +1,120 @@
+---
+title: Seguridad
+description: Cómo Trophy protege los datos de los clientes, controla el acceso y
+ aborda el cumplimiento normativo.
+og:description: Cómo Trophy protege los datos de los clientes, controla el
+ acceso y aborda el cumplimiento normativo.
+icon: shield-check
+---
+
+## Residencia de datos {#data-residency}
+
+Todos los datos de clientes se almacenan y procesan en infraestructura en la nube alojada en Londres dentro del cumplimiento de GDPR.
+
+Hay otras opciones de residencia de datos disponibles. [Contacta con soporte](mailto:support@trophy.so) para discutirlas.
+
+## Seguridad de datos {#data-security}
+
+### Cifrado {#encryption}
+
+| Área de control | Estado | Notas |
+| --- | --- | --- |
+| Cifrado en tránsito (TLS 1.2+) | Implementado | Todo el tráfico de API y web utiliza HTTPS/TLS. |
+| Cifrado en reposo | Implementado | Los volúmenes de aplicación están cifrados. |
+| Cifrado de base de datos en reposo | Implementado | Los volúmenes de base de datos y almacenes de caché están cifrados. |
+| Gestión de secretos | Implementado | Las variables de entorno se almacenan en bóvedas seguras. |
+
+### Clasificación de datos {#data-classification}
+
+Trophy procesa las siguientes categorías de datos de usuario final:
+
+- Identificadores de usuario (IDs externos anónimos proporcionados por los clientes)
+- Identificadores de zona horaria (IANA)
+- Datos de eventos de gamificación (acciones, puntos, rangos de clasificación, marcas de tiempo y eventos similares)
+- Preferencias de notificación (indicadores de suscripción a notificaciones push y correo electrónico)
+
+Por defecto, Trophy no almacena información de identificación personal (PII) directamente. Es posible enviar la siguiente PII a Trophy, pero no es obligatorio:
+
+- Nombre de usuario
+- Dirección de correo electrónico
+
+También es posible enviar atributos personalizados (pares clave-valor gestionados por el cliente adjuntos a usuarios y eventos) a Trophy con el estado de PII determinado por el caso de uso del cliente.
+
+Trophy procesa las siguientes categorías de datos de cliente:
+
+- Información de cuenta de cliente y facturación
+
+Trophy no tiene acceso a las contraseñas de clientes ni a los datos de tarjetas de crédito.
+
+### Retención y Eliminación de Datos {#data-retention-and-deletion}
+
+- Los datos de clientes se retienen durante la vigencia del contrato y se eliminan dentro de los 30 días posteriores a la terminación del contrato mediante solicitud por escrito.
+- Puede solicitar la eliminación de sus datos en cualquier momento contactando a [support@trophy.so](mailto:support@trophy.so).
+
+### Copias de Seguridad {#backups}
+
+- Instantáneas automatizadas diarias de todas las bases de datos
+- Los procedimientos de restauración se prueban anualmente
+
+## Controles de Acceso {#access-controls}
+
+### Acceso Interno {#internal-access}
+
+| Área de control | Estado | Notas |
+| --- | --- | --- |
+| Control de acceso basado en roles (RBAC) | Implementado | Habilitado en todos los proveedores de nube |
+| Autenticación multifactor (MFA) | Implementado | Habilitado en todos los proveedores de nube |
+| SSO / proveedor de identidad | Implementado | Habilitado en sistemas internos relevantes |
+| Revisiones de acceso | Implementado | Revisado anualmente |
+
+### Principio de Mínimo Privilegio {#principle-of-least-privilege}
+
+Todo el acceso interno sigue los principios de mínimo privilegio. A los ingenieros se les concede acceso únicamente a los sistemas requeridos para su rol. El acceso a la base de datos de producción está restringido a ingenieros senior y requiere justificación.
+
+### Aislamiento de Datos de Clientes {#customer-data-isolation}
+
+Los datos de cada cliente están aislados mediante claves API con alcance de cliente y filtrado a nivel de fila. Los clientes solo pueden acceder a sus propios datos.
+
+## Seguridad de la Aplicación {#application-security}
+
+### Prácticas de Desarrollo {#development-practices}
+
+- Todo el código de producción se somete a revisión obligatoria por pares antes de la fusión.
+- Las políticas de protección de ramas lo aplican a nivel de repositorio, evitando commits directos.
+- Las vulnerabilidades de dependencias se monitorean continuamente mediante alertas de seguridad de GitHub.
+- Los secretos nunca se incluyen en el control de versiones.
+
+### Gestión de vulnerabilidades {#vulnerability-management}
+
+| Área de control | Estado | Notas |
+| --- | --- | --- |
+| Escaneo de vulnerabilidades de dependencias | Implementado | Automatizado en compilaciones |
+| SLA de parches de seguridad | Implementado | Parches críticos aplicados en 24 horas |
+
+### Seguridad de API {#api-security}
+
+- Todo acceso a la API requiere claves de API autenticadas con ámbito limitado a la cuenta del cliente.
+- Las claves de API pueden rotarse y revocarse en cualquier momento desde el panel de Trophy.
+- Las claves de API se cifran antes de almacenarse en la base de datos.
+- Se aplica un límite de solicitudes a todos los endpoints de la API para prevenir abusos.
+- La verificación de firma de webhooks está bajo control del cliente. Trophy recomienda [verificar las firmas](/es/webhooks/security) en los endpoints de webhook.
+
+### Seguridad de aplicaciones web {#web-application-security}
+
+- El acceso al panel de Trophy está protegido por un proveedor de identidad que posee una certificación SOC 2 Type II independiente. El proveedor de identidad gestiona la autenticación de usuarios, incluyendo el almacenamiento de credenciales, la gestión de sesiones y la emisión de tokens. Trophy no almacena ni maneja contraseñas de usuario sin procesar.
+- El acceso al panel sigue el principio de mínimo privilegio. Las cuentas de administrador otorgan y revocan el acceso de otros miembros.
+- La autenticación multifactor (MFA) para cuentas de clientes está disponible [bajo solicitud](mailto:support@trophy.so).
+- El inicio de sesión único (SSO) para cuentas de clientes está disponible [bajo solicitud](mailto:support@trophy.so).
+- Las sesiones utilizan tokens JWT de corta duración con vencimiento automático.
+- Las cuentas de clientes están completamente aisladas en la capa de datos. Las sesiones autenticadas tienen un ámbito limitado a la organización emisora y no pueden acceder a datos pertenecientes a otros clientes.
+- El desarrollo de aplicaciones sigue el OWASP Top 10 como base para identificar y mitigar vulnerabilidades comunes de aplicaciones web, incluyendo ataques de inyección, autenticación rota y configuración de seguridad incorrecta.
+
+## GDPR {#gdpr}
+
+- Trophy actúa como procesador de datos para los datos de clientes según el GDPR.
+- Trophy cumple completamente con todas las prácticas y procedimientos del GDPR para el manejo de datos.
+- Estamos encantados de firmar un Acuerdo de Procesamiento de Datos (DPA) con los clientes. Solicite uno a su contacto de cuenta.
+
+
+ Contacte a [support@trophy.so](mailto:hello@trophy.so) para obtener una copia de nuestras políticas completas de seguridad y confianza.
+
diff --git a/i18n.json b/i18n.json
index 588ac6a5..11da0c05 100644
--- a/i18n.json
+++ b/i18n.json
@@ -11,6 +11,7 @@
"mdx": {
"include": [
"account/*.mdx",
+ "company/*.mdx",
"admin-api/*.mdx",
"admin-api/endpoints/points/*.mdx",
"admin-api/endpoints/streaks/*.mdx",
diff --git a/i18n.lock b/i18n.lock
index 463df373..bdae07b3 100644
--- a/i18n.lock
+++ b/i18n.lock
@@ -7192,3 +7192,46 @@ checksums:
content/12: af0feb53dc5665ddb60c7e0bf27f5ba1
content/13: 10e8e9a59847ddd720c6d06b12c7b120
content/14: 9799b973234bf2d10d5c971b267f55a5
+ b12885456ed1864406f2ce97d9fcddac:
+ meta/title: 4b34923fef858a2b9a4a914c3e822889
+ meta/description: cabe1c4819aac67ef4b216de43e848e6
+ meta/og%3Adescription: cabe1c4819aac67ef4b216de43e848e6
+ meta/icon: 4411b430bd6f32cc473899fddcb3723f
+ content/0: 3de1446c907ea726449066f005efbbdc
+ content/1: 9c1114c4a96b56a9d36988082867fb9a
+ content/2: 4e3c48254394049468fe51313878c9e3
+ content/3: 5345c4f922a2fb7b0c8654a3471989ac
+ content/4: 7f8a1ceae4b9cda385fc79e56c4fcd93
+ content/5: 31033ba8cdf5b12a289c069c149b9618
+ content/6: 7e1deea7042cec2e7d80abd039257a4f
+ content/7: fc09f49ee728df9d3412ffe86066112c
+ content/8: 1fd67040516c1a712dc4eabd87830166
+ content/9: c918d347b35b89f41c6eeb2810bd483f
+ content/10: 2408230c588d05860fd25eb5f55c5338
+ content/11: f697719766521a2389365f4396dd788c
+ content/12: a322dd8d71d623c966d4880559e6dbfe
+ content/13: 936a355223019fb8c5ae7a9dcc39b045
+ content/14: 42fbb7764e9f8e74494535ecc9f9a2ca
+ content/15: ca443c8a177297c51e283907a020f726
+ content/16: 7b7766cdf904710cd5fa26dc0b3b2503
+ content/17: 462eb78cca682d5fa8dd12ded276a715
+ content/18: 8146f2ae449691abbe568d9d6645d865
+ content/19: 925161c9f0b0ac4cfa57b1b63f255791
+ content/20: 200f0452d03f8d59d1dce97effbaf556
+ content/21: 86b43935a5c916acf781559c8431d13b
+ content/22: ea606c6c2f769dee430d565c78b2384b
+ content/23: 6dd4920577fbdb678338e268ed1cccbb
+ content/24: b15e392a1cba3f8edc8e36774ff53997
+ content/25: e1ff7669de34060bd8e56c2f721582c1
+ content/26: 1eae55014550f66fcf7a968314867700
+ content/27: bf188985846fd00d2bf4026f379164a4
+ content/28: 500e899b0e6e8243b8e4a0bbb5726ab4
+ content/29: 486a211700e759f0e8f8d475aa8855ba
+ content/30: 3f272c95744ed4401623dad9c324ec8a
+ content/31: 01bc5f76f5b827cfb45076830a219a7a
+ content/32: 9497354d005936b3c6052488b8e0bd24
+ content/33: f4c9e69fe46c374a0836f8c348908518
+ content/34: 8e6479dac30c04886d317cb99924e942
+ content/35: f787576def79d901e78006d8ec376ef5
+ content/36: 68256a2c31bee1a8202cc744b404e9ea
+ content/37: bb510f929be90e357007553f458c4a92
diff --git a/styles/config/vocabularies/Trophy/accept.txt b/styles/config/vocabularies/Trophy/accept.txt
index 74f11f66..42d286a5 100644
--- a/styles/config/vocabularies/Trophy/accept.txt
+++ b/styles/config/vocabularies/Trophy/accept.txt
@@ -23,6 +23,7 @@ localStorage
shadcn
agentic
sandboxed
+misconfiguration
# Markdown rich text
_[\w\s]+_