As well as sending alerts via email, Slack, and HipChat; SpeedCurve also supports sending alerts to any webhook. Follow the steps below to set up alerts to your webhooks.

  1. In the "Alerts" section of your SpeedCurve settings, click the Add Webhook button and enter the URL of your webhook.
  2. For each performance budget, make sure that you have the "Send alerts for this budget" checkbox checked.

That's it! Your webhook will receive a POST request for each performance budget alert.

Webhook payload details

Each performance budget alert will be sent as a separate payload to your webhook. The payload will be a HTTP POST request, where the request body is a JSON-encoded string. See below for the JSON schema.

    // Information about the budget that is alerting
    "budget": {
        "metric": "SpeedIndex",
        "threshold": "1.8 seconds",
        "threshold_absolute": 1.8,
        "threshold_relative": 10

    // Information about the chart that the budget is set on
    "chart": {
        "title": "Start Render, SpeedIndex | Wildly Inaccurate | Home | AVG",
        "chart_type": "timeseries",
        "metric": [
        "correlation_metrics": [],
        "correlation_stat": null,
        "stat": "50",
        "site_ids": [
        "label": [
        "region": [
        "test_profile_name": [
        "customer_data": []

    // An array of crossing objects, each describing a data series that crossed
    // the budget threshold
    "crossings": [
            // Whether the series went over or under the budget threshold
            "type": "under",

            // The value of the threshold that this series crossed
            "threshold": 1.8,

            // The type of threshold that this series crossed (absolute or relative)
            "threshold_type": "absolute",

            // Upper and lower bounds that were used for relative thresholds
            "threshold_lower": null,
            "threshold_upper": null,

            // By how much the threshold was crossed
            "difference_from_threshold": 0.36111111111111116,

            // The value in the series that triggered this alert
            "latest_value": "1.15",

            "series": {
                // The name that this series has in the chart
                "name": "SpeedIndex (Syn), BBC News, Home",

                // Information about the metric
                "metrictype": "time",
                "metricName": "SpeedIndex",
                "metricQualified": "SYN|speedindex",

                // An array of data points that were evaluated against the budget
                "data": [
                        // A timestamp for this data point, expressed in milliseconds
                        "x": "1545658800000",

                        // The value of the metric at this point
                        "y": "1.12",

                        // For synthetic data, how many tests made up this data point
                        "num": "16",

                        // For synthetic median and 95th percentile queries, the
                        // test ID for this data point
                        "test": "181224_4Q_ab33515a52212727a28cd0cae080220c"
                        // More data points

    // A copy of the crossing object with the largest difference_from_threshold value
    "largest_crossing": {
        // ...

    // A URL to an image of the chart series at the time of the alert
    "chart_image_url": "https:\/\/\/n.php?hash=...",

    // A public ("share") URL to the Favorites dashboard containing the chart
    "chart_web_url": "https:\/\/\/my-account\/favorite\/...",

    // Used by some services like VictorOps
    "message_type": "INFO"
Did this answer your question?