Webhooks

Send notifications as webhook payload to an HTTP endpoint.

Configuration Parameters

Field / Option

Required

Description

Example

Channel type

✅

Select Webhook as the channel type to send notifications to.

Name

✅

Identifier for the channel, used to configure notification rules.

Name it after the team accessing the channel.

Webhook URL

✅

Webhook URL to the specified HTTP endpoint.

Auth header

Signature to include in the authorization header sent to the HTTP endpoint.

Application link URL

✅

URL to your Validio application instance, used to send notifications.

Note: This is predefined based on the web browser URL.

Webhook Payload

Webhook payload is data embedded in a HTTP POST as JSON format. When your Notification rule is triggered, the webhook payload is sent to the specified HTTP endpoint. The payload structure varies depending on the notification type.

📘

Note

Validio does not send notifications for backfilled incidents.

Validator Incidents

Validator incidents occur when your data breaches a configured Threshold. The payload structure varies depending on Segmentation and Threshold type.

{
  "type": "ValidatorIncident",
  "title": "1 incident triggered on: demo_source (DynamicThreshold threshold)",
  "validatorUrl": "https://your-validio-instance.com/observe/sources/SRC_123/validators/VAL_13",
  "source": {
    "id": "SRC_123",
    "name": "demo_source"
  },
  "validator": {
    "id": "MTR_13",
    "name": "numeric_validator"
  },
  "segmentation": {
    "id": "SGM_123",
    "name": "Unsegmented"
  },
  "incidents": [
    {
      "endTime": "2024-01-01 0:00:01 UTC",
      "message": "placeholder",
      "incident_id": "TAT_123",
      "incident_group_id": "IGP_123",
      "segment": {
        "segmentFields": [
          {
            "field": "Age",
            "value": "123"
          }
        ],
        "segmentId": "PRT_123"
      },
      "startTime": "2024-01-01 0:00:01 UTC",
      "threshold": {
        "backfillMode": false,
        "decisionBoundsType": "UPPER_AND_LOWER",
        "lowerBound": 0,
        "sensitivity": 3,
        "severity": "LOW",
        "thresholdType": "DynamicThreshold",
        "upperBound": 1,
        "value": 0
      },
      "url": "http://your-validio-instance.com/issues/incidents/IGP_123"
    }
  ]
}

Dynamic Threshold

The payload structure for dynamic thresholds include the value, boundary, and decisionBoundsType: LOWER, UPPER, or UPPER_AND_LOWER.

"threshold": {
    "thresholdType": "DynamicThreshold",
    "value": 90,
    "decisionBoundsType": "UPPER_AND_LOWER",
    "lowerBound": 80.47892,
    "upperBound": 84.3383
}
"threshold": {
    "thresholdType": "DynamicThreshold",
    "value": 81,
    "decisionBoundsType": "LOWER",
    "lowerBound": 81.62181
}

Fixed Threshold

The payload structure for fixed thresholds include the comparison value, value, and comparison operator: LESS, LESS_EQUAL, EQUAL, NOT_EQUAL, GREATER, or GREATER_EQUAL.

"threshold": {
    "thresholdType": "FixedThreshold",
    "operator": "LESS",
    "comparisonValue": 8,
    "value": 6
}
"threshold": {
    "thresholdType": "FixedThreshold",
    "operator": "LESS_EQUAL",
    "comparisonValue": 30,
    "value": 24
}

Difference Threshold

The payload structure for difference thresholds include the difference_type which contains either ABSOLUTE or PERCENTAGE.

"threshold": {
  "thresholdType": "DifferenceThreshold",
  "lowerBound": 42.0,
  "upperBound": 42.1,
  "differenceType": "PERCENTAGE",
  "value": 42.2,
  "numberOfWindows": 42
}

Schema Changes

Validio can send notifications about changes in your schema. changeTypes can include one of the following: Nullability, MissingField, JtdType, or UnderlyingType.

{
  "type": "SchemaChangeSourceError",
  "title": "1 schema change found on: demo_source (DemoSource).",
  "sourceUrl": "https://your-validio-instance.com/observe/sources/SRC_123",
  "sourceId": "SRC_123",
  "source": {
    "id": "SRC_123",
    "name": "demo_source"
  },
  "incidents": [
    {
      "changes": {
        "Age": {
          "changeTypes": ["Nullability", "JtdType", "UnderlyingType", "Index"],
          "new": {
            "fieldIndex": 5,
            "name": "Age",
            "nullable": true,
            "type": "float64",
            "underlyingType": "int"
          },
          "old": {
            "fieldIndex": 2,
            "name": "Age",
            "nullable": false,
            "type": "float64",
            "underlyingType": "int"
          }
        },
        "Credit_score": {
          "changeTypes": ["JtdType"],
          "new": {
            "name": "Credit_score",
            "nullable": false,
            "type": "string",
            "underlyingType": "float64"
          },
          "old": {
            "name": "Credit_score",
            "nullable": false,
            "type": "float64",
            "underlyingType": "float64"
          }
        },
        "age2": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "age",
            "nullable": true,
            "type": "float64",
            "underlyingType": "FLOAT"
          }
        },
        "age3": {
          "changeTypes": ["JtdType"],
          "new": {
            "name": "age3",
            "nullable": false,
            "type": "float64",
            "underlyingType": "string"
          }
        },
        "buy_cycle": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "buy_cycle",
            "nullable": true,
            "type": "float64",
            "underlyingType": "INTEGER"
          }
        },
        "country": {
          "changeTypes": ["AddedField"],
          "new": {
            "name": "country",
            "nullable": false,
            "type": "string",
            "underlyingType": "string"
          },
          "old": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          }
        },
        "exam_28d": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "exam_28d",
            "nullable": true,
            "type": "float64",
            "underlyingType": "INTEGER"
          }
        },
        "exam_7d": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "exam_7d",
            "nullable": true,
            "type": "float64",
            "underlyingType": "INTEGER"
          }
        },
        "gender": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "gender",
            "nullable": true,
            "type": "float64",
            "underlyingType": "INTEGER"
          }
        },
        "new_nps": {
          "changeTypes": ["MissingField"],
          "new": {
            "name": "",
            "nullable": false,
            "type": "",
            "underlyingType": ""
          },
          "old": {
            "name": "new_nps",
            "nullable": true,
            "type": "float64",
            "underlyingType": "FLOAT"
          }
        }
      }
    }
  ]
}

Segment Limits

{
  "type": "SegmentLimitExceededSourceError",
  "title": "1 segment limit exceeded on: demo_source (DemoSource).",
  "sourceUrl": "https://your-validio-instance.com/observe/sources/SRC_123",
  "sourceId": "SRC_123",
  "source": {
    "id": "SRC_123",
    "name": "demo_source"
  },
  "incidents": [
    {
      "limit": 1000,
      "segmentation": {
        "id": "SGM_123",
        "name": "Unsegmented"
      },
      "segmentationUrl": "https://your-validio-instance.com/observe/sources/SRC_123/segmentations/SGM_123"
    }
  ]
}

Source Errors

{
  "type": "GenericSourceError",
  "title": "1 source error found on: demo_source (DemoSource).",
  "sourceUrl": "https://your-validio-instance.com/observe/sources/SRC_123",
  "sourceId": "SRC_123",
  "source": {
    "id": "SRC_123",
    "name": "demo_source"
  },
  "incidents": [
    {
      "message": "An unknown error has occurred in the source."
    }
  ]
}