# Configurar webhooks en ION

#### 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="/files/42fc4741197b8484b4c74ac2a999aa9d15fa5b0b" 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="/files/a5093ecbf13c5a7fc8d60d00da16dccc9196dccd" 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: 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:

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

The question should be specific, self-contained, and written in natural language.
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.
