NewReleases can send HTTP webhook events that notify your application about new version releases.
This is done by sending a JSON-encoded object via an HTTP POST request to any endpoint URLs that you have defined in your account’s Webhooks settings.
Webhook request data is a JSON-encoded object that contains information about project version release. It contains the following fields:
provider
project provider id (string)
project
project name (string)
version
project version (string)
time
project version release time in RFC3339 format (string)
cve
list of CVE IDs (array of strings, optional)
is_prerelease
true if version a pre-release (boolean, optional)
is_updated
true if version updated (boolean, optional)
note
release note information (object, optional)
title
release note title (string, optional)
message
release note message body in HTML format (string, optional)
account
account information (object)
type
possible values "user" or "organization"
id
unique account identifier
name
account name
tags
project tags (list, optional)
id
unique tag identifier
name
tag name
project_note
custom project note (string, optional)
An example of such request body:
{
"provider": "github",
"project": "nodejs/node",
"version": "v11.5.0",
"time": "2018-12-30T16:08:51.864468Z",
"is_prerelease": true,
"is_updated": true,
"note": {
"title": "Release v11.5.0",
"message": "Release features\u003cbr\u003eBugfixes"
}
"account": {
"type": "user",
"id": "fwykdar796rkd6s2hwmqvhpsd1"
"name": "My Account Name"
}
}
NewReleases is signing every Webhook request that is sends to your endpoints. A hex-encoded HMAC-SHA256 signature is included in X-Newreleases-Signature
HTTP header. The message that is signed is created from X-Newreleases-Timestamp
HTTP request header, a dot .
and a complete HTTP request body.
Read values as strings from X-Newreleases-Signature
and X-Newreleases-Timestamp
from received HTTP request.
You achieve this by concatenating:
X-Newreleases-Timestamp
(as a string)
.
Compute an HMAC with the SHA256 hash function. Use the endpoint's signing secret as the key, and use the string from the Step 2 as the message. Every Webhook have a different secret key which can be revealed on Webhooks settings page by clicking on the "Key" button next to your Webhooks.
Hex-decode signature from X-Newreleases-Signature
and compare it to the computed signature. If a signature matches, compute the difference between the current timestamp and the received UNIX timestamp in X-Newreleases-Timestamp
, then decide if the difference is within your tolerance.
This is a complete webhook service example in Go programming language that listens on 8080
TCP port, handles /webhook
route and validates the signature. You can build this program and start it with --secret YOUR_SECRET_KEY
argument.
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"flag"
"io"
"net/http"
)
var addr = flag.String("addr", ":8080", "")
var secret = flag.String("secret", "", "")
func main() {
flag.Parse()
http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {
// read request body payload
body, err := io.ReadAll(r.Body)
if err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
return
}
// prepare hash function
h := hmac.New(sha256.New, []byte(*secret))
// concatenate timestamp from the header
h.Write([]byte(r.Header.Get("X-NewReleases-Timestamp")))
h.Write([]byte("."))
h.Write(body)
// compute the signature
computedSig := h.Sum(nil)
// decode the signature that needs to be validated
sig := r.Header.Get("X-NewReleases-Signature")
receivedSig, err := hex.DecodeString(sig)
if err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
return
}
// compare signatures
valid := hmac.Equal(receivedSig, computedSig)
if !valid {
w.WriteHeader(http.StatusBadRequest)
return
}
// do something with request body payload
// with your own code
w.WriteHeader(http.StatusOK)
})
http.ListenAndServe(*addr, nil)
}
It is a good practice to protect your endpoints with some sort of API keys or tokens. You can add multiple custom HTTP headers that will be included in every HTTP request.
As JSON-encoded HTTP POST body may not be suitable for every requirements, it is possible to define custom fields that will be sent to the Webhook endpoint. Values in JSON object are strings that can contain template variables like {project}, {version}, {time}, release note {note_message}, or any other information that is available in the standard request body.
To acknowledge receipt of a webhook, your endpoint should return a 2xx
HTTP status code. All response codes outside this range, including 3xx
codes, will indicate that you did not receive the webhook and will be treated as a failure. Any other information returned in the request headers or request body will be ignored.
If you use an HTTPS URL for your webhook endpoint, NewReleases will validate that the connection to your server is secure before sending notification. For this to work, your server must be correctly configured to support HTTPS with a valid server certificate.
We will retry webhook requests if your service does not respond with HTTP status 2xx
or there is network error with an exponential back off or as soon as there is another project release version.
Logged in users have a web form to test webhooks with custom data.