---
title: "JavaScript app | WebhookRelay"
meta:
  "og:description": "Receive webhooks directly inside your application without public IP"
  "og:title": "JavaScript app"
  description: "Receive webhooks directly inside your application without public IP"
---

![Stripes](https://webhookrelay.com/docs/tutorials/edge/javascript-app/images/stripes.svg)

Documentation

**Fundamentals**

# **JavaScript app**

Receive webhooks directly inside your application without public IP

Webhook Relay's [Socket Server](https://docs.webhookrelay.com/products/webhooks/websocket-server) allows users to receive webhooks inside their application without having public IP, domain or even running a web server themselves. Here's a short example application written in JavaScript that subscribes to a stream of webhooks:

## [The code](#the-code)

```
// client.js
const WebSocket = require('ws');

const ws = new WebSocket('wss://my.webhookrelay.com/v1/socket');

var apiKey = process.env.RELAY_KEY;
var apiSecret = process.env.RELAY_SECRET;![](2023-08-27-22-40-21.png)

ws.on('open', function open() {
  // on connection, send our authentication request
  ws.send(JSON.stringify({action: 'auth', key: apiKey, secret: apiSecret}));  
});

ws.on('close', function close() {
  console.log('disconnected');
});

ws.on('message', function incoming(data) {
  console.log(data)
  var msg = JSON.parse(data);
  if (msg.type === 'status' && msg.status === 'authenticated') {
    // if we got authentication confirmation, send subscribe event to the server
    ws.send(JSON.stringify({action: 'subscribe', buckets: ['123']}));
  }
});
```

## [Install websocket library](#install-websocket-library)

We will use the `ws` library for websocket connectivity. It's extremely popular ([https://www.npmjs.com/package/ws](https://www.npmjs.com/package/ws)) and should have a decent support:

```
npm i ws
```

## [Set token key and secret](#set-token-key-and-secret)

Generate your access key and secret in the [tokens page](https://my.webhookrelay.com/tokens)

```
export RELAY_KEY=your-token-key
export RELAY_SECRET=your-token-secret
```

## [Start the application](#start-the-application)

To start it, use `node` directly:

```
node client.js
```

Now, if you send a webhook to your public input endpoint, you should see something similar:

```
$ node client.js
{"type":"status","status":"authenticated","message":"connected successfully, subscribe to buckets"}
{"type":"status","status":"subscribed","message":"subscribed to buckets: 123"}
{"type":"webhook","meta":{"bucked_id":"89e44c32-27ff-4832-8655-8a42d3851b6f","bucket_name":"123","input_id":"ee4ac550-12a4-41a7-837d-dd3356ed1771","input_name":"Default public endpoint"},"headers":{"Content-Length":["15"],"User-Agent":["insomnia/6.0.2"],"Cookie":["__cfduid=dc244a014f0b1e2965544ddb483c3fe1b1525866866"],"Content-Type":["application/json"],"Accept":["*/*"]},"query":"","body":"{\"hi\": \"there\"}","method":"PUT"}
```

Did this page help you?