UPTIME MONITORING

Test your web application’s availability from all over the world

Instant alerts

100+ test locations

Root cause analysis

Public status pages

Knowing your website is available and accessible to visitors is critical to every business.

See it in action

APIs make life easier

Integrate Pingdom data into your systems, custom applications, and reporting.

Learn more

PAGE SPEED MONITORING

Examine and optimize the load performance of your website’s critical pages.

Simple setup

Performance grades

Page speed history

Filmstrip and timeline metrics

With page speed monitoring you can help avoid slow loading pages, frustrated customers, and abandoned site visits.

See it in action

Do your code justice

Pingdom Page Speed

Identify bottlenecks and speed up your website.

Learn More

TRANSACTION MONITORING

Help ensure your most vital site interactions function as expected.

Instant alerts

Built-in editor

Real browser testing

Easy reporting

Get immediate alerts when transactions fail, so you know there is an issue before your users do.

See it in action

Deliver seamless end user experience

Pingdom Transaction Monitoring

Be the first to know if critical site flows are broken.

Learn More

ALERTING

Reliable alerting for when you and your team need to be the first to know.

Multiple users

Alert levels

Teams

Integrated alerting

Automate delivery of alerts to get the right alert, to the right person, at the right time.

Be the first to know

Pingdom Alerting

Integrate with your favorite applications like Slack, OpsGenie, and more.

Learn More

REAL USER MONITORING (RUM)

Optimize your website performance with insights from actual site visitors.

Live map

Advanced filtering

Page grouping

Shareable and customizable reports

RUM can help you identify poor user experiences before they cost you customers and revenue.

See it in action

Is your site running on WordPress?

Pingdom RUM

Our Wordpress plugin makes it easy to get Real User Monitoring up and running fast.

Learn More

SERVER MONITOR

A simple way to monitor web servers.

StatsD and alerts

Server grouping

90+ open-source plugins

Shareable dashboards

Simple and affordable web server monitoring.

Pingdom and AppOptics - Better Together.

AppOptics

Powerful client-side and server-side monitoring.

Learn More

× Free AppOptics Dev Edition Free, full-function APM tool for testing and troubleshooting application performance before moving into production

Webhooks

header-bg-small-gray

State change webhooks

Pingdom's state change webhooks, or webhooks for short, let you programmatically act on state changes that occur on your uptime or transaction checks. For uptime checks, a state change is when the check changes state from UP to DOWN or vice versa. For transaction checks, a state change is when the check changes state from SUCCESS to FAILING or vice versa.

Webhooks are a perfect solution when you want to create a script or service that executes when a monitored site goes down or a monitored transaction cannot finish - all without having to parse alert messages or continuously poll the Pingdom API for updates.

What is a webhook?

A webhook is an HTTP POST request that Pingdom sends to a URL of your choosing when a certain event occurs. This request is accompanied by a payload of data in the POST body related to the event. A state change webhook is triggered when an uptime or transaction check changes state from UP/SUCCESS to DOWN/FAILING or vice versa.

BeepManager webhooks

State change webhooks should not be confused with BeepManager webhooks. State change webhooks trigger immediately when an uptime or transaction check changes state, as opposed to a BeepManager webhook that triggers only if you 1) use BeepManager as your alerting system and 2) BeepManager is set up to alert a user or alerting endpoint that is configured to trigger a webhook.

This distinction makes the use cases for state change webhooks and BeepManager webhooks different. State change webhooks are perfect when you want to create an integration with Pingdom that reacts upon state changes, e.g. to reboot a server, make a phone call, send a push notification to a mobile device, etc. BeepManager webhooks, on the other hand, are perfect when you want to create an integration with Pingdom that e.g. logs the resolution time of triggered incidents.

How to set up a state change webhook

This documentation is focused on how to consume state change webhooks. For information on how to create a webhook in My Pingdom and use it for your checks, please see this FAQ article.

How to consume a state change webhook

Pingdom's state change webhooks are HTTP POST requests with Content-Type: application/json. The POST body contains a JSON data object with information specific to the check type that triggered the webhook (see below).

Alert bundling

For BeepManager alerts, we support the concept of alert bundling (also known as alert flood protection). This means that data is grouped if multiple incidents are triggered simultaneously. This concept is not applicable to state change webhooks. Every HTTP request will only contain info about one state change.

Examples of webhook JSON output for uptime checks

Note on sending a test webhook from within My Pingdom:

Response parameters first_probe and second_probe will be empty. They represent the first and second opinion to confirm that a state change has actually occurred. Response parameters long_description will have the value "This is a test message triggered by a user in My Pingdom" and description will have the value "test".

When an uptime check changes state from DOWN to UP, parameters long_description and description will have the value "OK". If a probe server does not have an IPv6 address, that parameter will be an empty string.

HTTP check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of HTTP check",
      "check_type": "HTTP",
      "check_params": {
        "basic_auth": false,
        "encryption": true,
        "full_url": "https://www.example.com/path",
        "header": "User-Agent:Pingdom.com_bot",
        "hostname": "www.example.com",
        "ipv6": false,
        "port": 443,
        "url": "/path"
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

HTTP Custom check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of HTTP Custom check",
      "check_type": "HTTP_CUSTOM",
      "check_params": {
        "basic_auth": false,
        "encryption": false,
        "full_url": "https://www.example.com/path",
        "hostname": "www.example.com",
        "ipv6": false,
        "port": 80,
        "url": "/"
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

TCP check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of TCP check",
      "check_type": "PORT_TCP",
      "check_params": {
        "hostname": "www.example.com",
        "basic_auth": false,
        "ipv6": false,
        "port": 80
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

Ping check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of Ping check",
      "check_type": "PING",
      "check_params": {
        "hostname": "www.example.com",
        "basic_auth": false,
        "ipv6": false
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

DNS check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of DNS check",
      "check_type": "DNS",
      "check_params": {
        "hostname": "www.example.com",
        "basic_auth": false,
        "expected_ip": "123.4.5.6",
        "ipv6": false,
        "nameserver": "example.com"
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

UDP check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of UDP check",
      "check_type": "UDP",
      "check_params": {
        "hostname": "www.example.com",
        "basic_auth": false,
        "expect": "string to expect",
        "ipv6": false,
        "port": 80,
        "send": "string to send"
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

SMTP check [POST]

    {
      "check_id": 123456,
      "check_name": "Name of SMTP check",
      "check_type": "SMTP",
      "check_params": {
        "basic_auth": false,
        "encryption": false,
        "hostname": "www.example.com",
        "ipv6": false,
        "port": 25
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

POP3 check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of POP3 check",
      "check_type": "POP3",
      "check_params": {
        "basic_auth": false,
        "encryption": false,
        "hostname": "www.example.com",
        "ipv6": false,
        "port": 110
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

IMAP check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of IMAP check",
      "check_type": "IMAP",
      "check_params": {
        "hostname": "www.example.com",
        "basic_auth": false,
        "encryption": false,
        "ipv6": false,
        "port": 143
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "UP",
      "current_state": "DOWN",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "long_description": "Long error message",
      "description": "Short error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

Examples of webhook JSON output for transaction checks

Note on sending a test webhook from within My Pingdom:

Response parameters first_probe and second_probe will be empty. They represent the first and second opinion to confirm that a state change has actually occurred.

When a transaction check changes state from FAILING to SUCCESS, parameters long_description and description will be empty. If a probe server does not have an IPv6 address, that parameter will be an empty string.

Transaction check [POST]

    {
      "check_id": 12345,
      "check_name": "Name of transaction check",
      "check_type": "TRANSACTION",
      "check_params": {
        "encryption": true,
        "port": 443,
        "url": "https://www.example.com/"
      },
      "tags": [
        "example_tag"
      ],
      "previous_state": "FAILING",
      "current_state": "SUCCESS",
      "importance_level": "HIGH",
      "state_changed_timestamp": 1451610061,
      "state_changed_utc_time": "2016-01-01T01:01:01",
      "description": "Error message",
      "first_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Stockholm, Sweden"
      },
      "second_probe": {
        "ip": "123.4.5.6",
        "ipv6": "2001:4800:1020:209::5",
        "location": "Austin, US",
        "version": 1
      }
    }

Try it free for 14 days

Start monitoring your website’s availability

Start 14-day free trial

Get started now and you can cancel at any time.

Start monitoring for free