> For the complete documentation index, see [llms.txt](https://docs.violetlabs.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.violetlabs.com/es/aplicaciones/i/ion/configurar-webhooks-en-ion.md).

# Configurar webhooks en ION

Habilitar la obtención de datos en tiempo real desde ION hacia Violet

#### Configurar webhooks desde Violet a ION

1. Crear un [integración ION en Violet](/es/aplicaciones/i/ion.md).
2. Navega a la **Página de Webhooks** página en Violet:

<figure><img src="https://3116332745-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvrraExym8pNEUvBDoima%2Fuploads%2F9ElCiUbltWWvQohLtr1E%2Fimage.png?alt=media&amp;token=1a5eb2a8-4a33-43cb-b51b-949d6f32fdfc" alt="" width="249"><figcaption></figcaption></figure>

3. Crea una URL de Webhook en Violet, seleccionando la integración ION cuando se te pida seleccionar una integración.
4. Copia y guarda la URL de Webhook generada en Violet - ***ESTO SOLO SE MOSTRARÁ UNA VEZ***.
5. En ION, navega al ejecutor de consultas GraphQL en la esquina inferior izquierda de tu entorno ION:

   <figure><img src="https://3116332745-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvrraExym8pNEUvBDoima%2Fuploads%2FGdfwdeEkSVvvUKm6AE0a%2Fimage.png?alt=media&amp;token=06a2088a-5172-45cb-9606-58eb9778e97f" alt="" width="333"><figcaption></figcaption></figure>
6. En el ejecutor de consultas de ION, ejecuta el siguiente código para crear un receptor de webhook - *reemplaza el* <mark style="color:$danger;">`webhookUri`</mark> *con el generado en Violet como se muestra en el bloque Input abajo*.

```typescript
# Crear un receptor
mutation CreateWebhookReceiver($input: CreateWebhookReceiverInput!) {
    createWebhookReceiver(input: $input) {
        webhookReceiver {
            id name description webhookUri sharedSecret contentType expectedResponseCode
            active subscriptions { resource action id } headers { key value id }
        }
    }
}

# Input
{
  "input": {
    "name": "Violet",
    "webhookUri": "Reemplaza esto con la URL copiada de Violet"
  }
}
```

6. Copia el ID del Receptor del webhook creado por la consulta anterior.
7. En el ejecutor de consultas de ION, ejecuta la consulta a continuación para suscribirte a todos los tipos de recurso y acción compatibles, reemplazando receiverId con el id del receptor creado arriba. Si quieres, puedes suscribirte solo a algunos tipos de recurso y acción ejecutando solo un subconjunto de las consultas.

```typescript
mutation {
  abomUpdate: createWebhookSubscription(input: { resource: ABOM_INSTALLATIONS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  abomCreate: createWebhookSubscription(input: { resource: ABOM_INSTALLATIONS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  filesUpdate: createWebhookSubscription(input: { resource: FILE_ATTACHMENTS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  filesCreate: createWebhookSubscription(input: { resource: FILE_ATTACHMENTS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  issuesUpdate: createWebhookSubscription(input: { resource: ISSUES, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  issuesCreate: createWebhookSubscription(input: { resource: ISSUES, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  organizationsUpdate: createWebhookSubscription(input: { resource: ORGANIZATIONS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  organizationsCreate: createWebhookSubscription(input: { resource: ORGANIZATIONS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  partsUpdate: createWebhookSubscription(input: { resource: PARTS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  partsCreate: createWebhookSubscription(input: { resource: PARTS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  planInputsUpdate: createWebhookSubscription(input: { resource: PLAN_INPUTS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  planInputsCreate: createWebhookSubscription(input: { resource: PLAN_INPUTS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  planItemsUpdate: createWebhookSubscription(input: { resource: PLAN_ITEMS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  planItemsCreate: createWebhookSubscription(input: { resource: PLAN_ITEMS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  plansUpdate: createWebhookSubscription(input: { resource: PLANS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  plansCreate: createWebhookSubscription(input: { resource: PLANS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  proceduresUpdate: createWebhookSubscription(input: { resource: PROCEDURES, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  proceduresCreate: createWebhookSubscription(input: { resource: PROCEDURES, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  purchaseOrderLinesUpdate: createWebhookSubscription(input: { resource: PURCHASE_ORDER_LINES, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  purchaseOrderLinesCreate: createWebhookSubscription(input: { resource: PURCHASE_ORDER_LINES, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  purchaseOrdersUpdate: createWebhookSubscription(input: { resource: PURCHASE_ORDERS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  purchaseOrdersCreate: createWebhookSubscription(input: { resource: PURCHASE_ORDERS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  receiptsUpdate: createWebhookSubscription(input: { resource: RECEIPTS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  receiptsCreate: createWebhookSubscription(input: { resource: RECEIPTS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  receiptItemsUpdate: createWebhookSubscription(input: { resource: RECEIPT_ITEMS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  receiptItemsCreate: createWebhookSubscription(input: { resource: RECEIPT_ITEMS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  runsUpdate: createWebhookSubscription(input: { resource: RUNS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  runsCreate: createWebhookSubscription(input: { resource: RUNS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  runStepsUpdate: createWebhookSubscription(input: { resource: RUN_STEPS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  runStepsCreate: createWebhookSubscription(input: { resource: RUN_STEPS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  stepUpdate: createWebhookSubscription(input: { resource: STEPS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  stepCreate: createWebhookSubscription(input: { resource: STEPS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }

  suppliersUpdate: createWebhookSubscription(input: { resource: SUPPLIERS, action: UPDATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
  suppliersCreate: createWebhookSubscription(input: { resource: SUPPLIERS, action: CREATE, receiverId: "2" }) {
    webhookSubscription { id _etag }
  }
}

```

8. Ahora, cualquier cambio y creación en los recursos a los que te hayas suscrito llegará a Violet de forma proactiva.

#### Limitaciones conocidas

1. Los eventos de webhook no se activan cuando se crean nuevos `líneas de orden de compra` son creadas
2. Los eventos de webhook no se activan de una manera que Violet soporte actualmente cuando los valores de las propiedades pasan de `vacío` a `poblado`. Estas propiedades se actualizarán correctamente en Violet en la próxima extracción programada.
3. Ciertas propiedades, especialmente las vinculadas a otro objeto de ION (por ejemplo, la dirección de envío en una `Orden`, que hace referencia a un `ubicación` de ION) llegan en un formato no compatible dentro del Webhook. En estos casos, el objeto se actualizará correctamente en Violet en la próxima extracción programada.
4. Para objetos recién creados en ION, algunos campos pueden no estar completamente poblados en Violet hasta la próxima extracción.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.violetlabs.com/es/aplicaciones/i/ion/configurar-webhooks-en-ion.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
