Some web services use webhooks to notify clients something has changed, for example a thermostat's target temperature button has been pressed by the user. A webhook is simply a HTTP request sent to a pre-defined endpoint with some event-related data.

However, because Homey is connected to a LAN network, which is usually behind a firewall or NAT router, these webhooks cannot reach Homey directly. Athom Cloud can serve as a proxy in this case.

Creating a webhook

Your webhook consists of two parts: a cloud-component, and an app-component. Go to https://developer.athom.com/webhooks and click New Webhook.


This is a name for your webhook, and is only used for your own reference.


This ID is automatically generated, and should be used in your /env.json.


This secret is automatically generated, and should be used in your /env.json.

Cloud function

This function is a sandboxed piece of JavaScript that decides which webhook should be forwarded to which Homey. Both the homey_data object (as provided in CloudWebhook) and and webhook_data (as provided by the webhook's server) are available.

Simply return true to forward the webhook, or return false to reject it. This code is run for each registered Homey.

Registering a Homey to your webhook

In Homey, make sure to have a file /env.json with the following properties:


  "WEBHOOK_ID": "<your_id>",
  "WEBHOOK_SECRET: "<your_secret>"

Then, register the webhook in your App:


let id = Homey.env.WEBHOOK_ID;
let secret = Homey.env.WEBHOOK_SECRET;
let data = {
  id: 'abcdef'

let myWebhook = await this.homey.cloud.createWebhook(id, secret, data);

myWebhook.on('message', args => {
  this.log('Got a webhook message!');
  this.log('headers:', args.headers);
  this.log('query:', args.query);
  this.log('body:', args.body);

await myWebhook.unregister();

Firing the webhook

This is usually done by a 3rd party service, but to illustrate our example, let's assume that the following request is made:

POST https://webhooks.athom.com/webhook/56512fd03944692c0a3715da/?id=abcdef

This would result in the following args object in the app, and webhook_data on the server:

// args
  "headers": {
    // ...
  "query": {
    "id": "abcdef"
  "body": {}

Alternatively, if the following webhook was fired:

POST https://webhooks.athom.com/webhook/56512fd03944692c0a3715da/?id=987654

Then the webhook would not trigger the app's message event, because webhook_data.id (987654) is not equal to homey_data.id (abcdef).