snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
---
title: APIs
description: Consulta y modifica tus datos de CRM de forma programática usando REST o GraphQL.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Twenty fue creado para ser amigable con los desarrolladores, ofreciendo APIs potentes que se adaptan a tu modelo de datos personalizado. Proveemos cuatro tipos de API distintos para satisfacer diferentes necesidades de integración.
## Enfoque centrado en el desarrollador
Twenty genera APIs específicamente para tu modelo de datos:
* **No se requieren IDs largos**: Usa los nombres de tus objetos y campos directamente en los endpoints.
* **Objetos estándar y personalizados tratados por igual**: Tus objetos personalizados reciben el mismo tratamiento de API que los incorporados.
* **Endpoints dedicados**: Cada objeto y campo recibe su propio endpoint de API.
* **Documentación personalizada**: Generada específicamente para el modelo de datos de tu espacio de trabajo.
<Note>
Tu documentación personalizada de la API está disponible en **Configuración → API & Webhooks** después de crear una clave de API. Como Twenty genera APIs que coinciden con tu modelo de datos personalizado, la documentación es única para tu espacio de trabajo.
</Note>
## Los dos tipos de API
### API Principal
Accesible en `/rest/` o `/graphql/`
Trabaja con tus **registros** reales (los datos):
* Crear, leer, actualizar y eliminar Personas, Empresas, Oportunidades, etc.
* Consultar y filtrar datos
* Gestionar relaciones de registros
### API de Metadatos
Accesible en `/rest/metadata/` o `/metadata/`
Administra tu **espacio de trabajo y modelo de datos**:
* Crear, modificar o eliminar objetos y campos
* Configurar ajustes del espacio de trabajo
* Define relaciones entre objetos
## REST vs GraphQL
Tanto las API Core como las de Metadatos están disponibles en formatos REST y GraphQL:
| Formato | Operaciones disponibles |
| ----------- | ----------------------------------------------------------------------------- |
| **REST** | CRUD, operaciones por lotes, upserts |
| **GraphQL** | Lo mismo + **upserts por lotes**, consultas de relaciones en una sola llamada |
Elige según tus necesidades — ambos formatos acceden a los mismos datos.
## Puntos de Acceso de API
| Entorno | URL base |
| ------------------- | ------------------------- |
| **Nube** | `https://api.twenty.com/` |
| **Autoalojamiento** | `https://{your-domain}/` |
## Autenticación
Cada solicitud a la API requiere una clave de API en el encabezado:
```
Authorization: Bearer YOUR_API_KEY
```
### Crear una Clave de API
1. Ve a **Configuración → APIs y Webhooks**
2. Haz clic en **+ Crear clave**
3. Configurar:
* **Nombre**: Nombre descriptivo para la clave
* **Fecha de vencimiento**: Cuándo expira la clave
4. Haga clic en **Guardar**
5. **Copia de inmediato** — la clave solo se muestra una vez
<VimeoEmbed videoId="928786722" title="Creación de clave de API" />
<Warning>
Tu clave de API concede acceso a datos sensibles. No la compartas con servicios no confiables. Si se ve comprometida, desactívala de inmediato y genera una nueva.
</Warning>
### Asignar un rol a una clave de API
Para mayor seguridad, asigna un rol específico para limitar el acceso:
1. Ve a **Ajustes → Miembros → Roles**
2. Haz clic en el rol que deseas asignar
3. Abre la pestaña **Asignación**
4. En **Claves de API**, haz clic en **+ Asignar a clave de API**
5. Selecciona la clave de API
La clave heredará los permisos de ese rol. Consulta [Permisos](/l/es/user-guide/permissions-access/capabilities/permissions) para más detalles.
### Gestionar Claves de API
**Regenerar**: Configuración → APIs & Webhooks → Haz clic en la clave → **Regenerar**
**Eliminar**: Configuración → APIs & Webhooks → Haz clic en la clave → **Eliminar**
## Playground de la API
Prueba tus API directamente en el navegador con nuestro playground integrado — disponible tanto para **REST** como para **GraphQL**.
### Accede al Playground
1. Ve a **Configuración → APIs y Webhooks**
2. Crea una clave de API (obligatorio)
3. Haz clic en **REST API** o **GraphQL API** para abrir el playground
### Lo que obtienes
* **Documentación interactiva**: Generada para tu modelo de datos específico
* **Pruebas en vivo**: Ejecuta llamadas reales a la API en tu espacio de trabajo
* **Explorador de esquemas**: Navega por los objetos, campos y relaciones disponibles
* **Constructor de solicitudes**: Crea consultas con autocompletado
El playground refleja tus objetos y campos personalizados, por lo que la documentación siempre es precisa para tu espacio de trabajo.
## Operaciones por Lotes
Tanto REST como GraphQL admiten operaciones por lotes:
* **Tamaño del lote**: Hasta 60 registros por solicitud
* **Operaciones**: Crear, actualizar y eliminar múltiples registros
**Características exclusivas de GraphQL:**
* **Upsert por lotes**: Crear o actualizar en una llamada
* Usa nombres de objetos en plural (por ejemplo, `CreateCompanies` en lugar de `CreateCompany`)
## Límites de tasa
Las solicitudes a la API se limitan para garantizar la estabilidad de la plataforma:
| Límite | Valor |
| ------------------- | -------------------------- |
| **Solicitudes** | 100 solicitudes por minuto |
| **Tamaño del lote** | 60 registros por llamada |
<Tip>
Usa operaciones por lotes para maximizar el rendimiento — procesa hasta 60 registros en una sola llamada a la API en lugar de hacer solicitudes individuales.
</Tip>

View File

@@ -0,0 +1,112 @@
---
title: Webhooks
description: Recibe notificaciones en tiempo real cuando ocurran eventos en tu CRM.
---
import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
Los webhooks envían datos a tus sistemas en tiempo real cuando ocurren eventos en Twenty — no se requiere sondeo. Úsalos para mantener sincronizados los sistemas externos, activar automatizaciones o enviar alertas.
## Crear un Webhook
1. Ve a **Configuración → APIs y Webhooks → Webhooks**
2. Haga clic en **+ Crear webhook**
3. Introduce la URL de tu webhook (debe ser públicamente accesible)
4. Haga clic en **Guardar**
El webhook se activa de inmediato y comienza a enviar notificaciones.
<VimeoEmbed videoId="928786708" title="Crear un webhook" />
### Gestionar Webhooks
**Editar**: Haz clic en el webhook → Actualizar la URL → **Guardar**
**Eliminar**: Haz clic en el webhook → **Eliminar** → Confirmar
## Eventos
Twenty envía webhooks para estos tipos de eventos:
| Evento | Ejemplo |
| ---------------------------- | ---------------------------------------------------------- |
| **Se crea un registro** | `person.created`, `company.created`, `note.created` |
| **Se actualiza un registro** | `person.updated`, `company.updated`, `opportunity.updated` |
| **Se elimina un registro** | `person.deleted`, `company.deleted` |
Todos los tipos de eventos se envían a la URL de tu webhook. Es posible que se agregue el filtrado de eventos en versiones futuras.
## Formato de la carga útil
Cada webhook envía una solicitud HTTP POST con un cuerpo JSON:
```json
{
"event": "person.created",
"data": {
"id": "abc12345",
"firstName": "Alice",
"lastName": "Doe",
"email": "alice@example.com",
"createdAt": "2025-02-10T15:30:45Z",
"createdBy": "user_123"
},
"timestamp": "2025-02-10T15:30:50Z"
}
```
| Campo | Descripción |
| ----------------- | -------------------------------------------------- |
| `evento` | Qué ocurrió (p. ej., `person.created`) |
| `datos` | El registro completo que se creó/actualizó/eliminó |
| `marca de tiempo` | Cuándo ocurrió el evento (UTC) |
<Note>
Responde con un **estado HTTP 2xx** (200-299) para confirmar la recepción. Las respuestas que no sean 2xx se registran como errores de entrega.
</Note>
## Validación de Webhook
Twenty firma cada solicitud de webhook por seguridad. Valida las firmas para garantizar que las solicitudes sean auténticas.
### Encabezados
| Encabezado | Descripción |
| ---------------------------- | ------------------------------- |
| `X-Twenty-Webhook-Signature` | Firma HMAC SHA256 |
| `X-Twenty-Webhook-Timestamp` | Marca de tiempo de la solicitud |
### Pasos de validación
1. Obtén la marca de tiempo de `X-Twenty-Webhook-Timestamp`
2. Crea la cadena: `{timestamp}:{JSON payload}`
3. Calcula HMAC SHA256 usando tu secreto de webhook
4. Compara con `X-Twenty-Webhook-Signature`
### Ejemplo (Node.js)
```javascript
const crypto = require("crypto");
const timestamp = req.headers["x-twenty-webhook-timestamp"];
const payload = JSON.stringify(req.body);
const secret = "your-webhook-secret";
const stringToSign = `${timestamp}:${payload}`;
const expectedSignature = crypto
.createHmac("sha256", secret)
.update(stringToSign)
.digest("hex");
const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"];
```
## Webhooks vs flujos de trabajo
| Método | Dirección | Caso de uso |
| --------------------------------------------- | --------- | --------------------------------------------------------------------------------- |
| **Webhooks** | SALIDA | Notificar automáticamente a los sistemas externos cualquier cambio en un registro |
| **Flujo de trabajo + solicitud HTTP** | SALIDA | Enviar datos con lógica personalizada (filtros, transformaciones) |
| **Disparador de webhook de flujo de trabajo** | ENTRADA | Recibir datos en Twenty desde sistemas externos |
Para recibir datos externos, consulta [Configurar un disparador de webhook](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger).