POST
/
v1
/
webhooks
Create a webhook
curl --request POST \
  --url https://platform.jobbit.uk/v1/webhooks \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "url": "https://hooks.kentphysio.co.uk/jobbit",
  "events": [
    "deployment.succeeded",
    "deployment.failed",
    "balance.low"
  ],
  "description": "Kent Physio deploy alerts",
  "balance_below": "250"
}
'
import requests

url = "https://platform.jobbit.uk/v1/webhooks"

payload = {
"url": "https://hooks.kentphysio.co.uk/jobbit",
"events": ["deployment.succeeded", "deployment.failed", "balance.low"],
"description": "Kent Physio deploy alerts",
"balance_below": "250"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: 'https://hooks.kentphysio.co.uk/jobbit',
events: ['deployment.succeeded', 'deployment.failed', 'balance.low'],
description: 'Kent Physio deploy alerts',
balance_below: '250'
})
};

fetch('https://platform.jobbit.uk/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.jobbit.uk/v1/webhooks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://hooks.kentphysio.co.uk/jobbit',
'events' => [
'deployment.succeeded',
'deployment.failed',
'balance.low'
],
'description' => 'Kent Physio deploy alerts',
'balance_below' => '250'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://platform.jobbit.uk/v1/webhooks"

payload := strings.NewReader("{\n \"url\": \"https://hooks.kentphysio.co.uk/jobbit\",\n \"events\": [\n \"deployment.succeeded\",\n \"deployment.failed\",\n \"balance.low\"\n ],\n \"description\": \"Kent Physio deploy alerts\",\n \"balance_below\": \"250\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://platform.jobbit.uk/v1/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://hooks.kentphysio.co.uk/jobbit\",\n \"events\": [\n \"deployment.succeeded\",\n \"deployment.failed\",\n \"balance.low\"\n ],\n \"description\": \"Kent Physio deploy alerts\",\n \"balance_below\": \"250\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://platform.jobbit.uk/v1/webhooks")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://hooks.kentphysio.co.uk/jobbit\",\n \"events\": [\n \"deployment.succeeded\",\n \"deployment.failed\",\n \"balance.low\"\n ],\n \"description\": \"Kent Physio deploy alerts\",\n \"balance_below\": \"250\"\n}"

response = http.request(request)
puts response.read_body
{
  "id": "wh_q8k2m4x7c1v9b3n5z6a0",
  "url": "https://hooks.kentphysio.co.uk/jobbit",
  "events": [
    "deployment.succeeded",
    "deployment.failed",
    "balance.low"
  ],
  "description": "Kent Physio deploy alerts",
  "balance_below": "250",
  "key_id": "k3x9m2q7w1za",
  "active": true,
  "created_at": "2026-11-05T14:00:00+00:00",
  "secret": "whsec_5f0c9d2a7b1e4c63a8d40f9e12b7c5a3d6e8f0a14b2c7d9e"
}
{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "insufficient_scope",
"message": "this key cannot read what these events carry",
"details": {
"required": [
"deploy:read"
]
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "too_many_webhooks",
"message": "an account may have up to 20 webhooks",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "invalid_url",
"message": "the url must point to a public address",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}

Authorizations

Authorization
string
header
required

An API key from Settings → API keys, sent as Authorization: Bearer jb_live_…

Body

application/json
url
string<uri>
required

A public https address. It is resolved and checked on every delivery, and redirects are not followed. Addresses with a user name, password or fragment, and private addresses, are refused.

Required string length: 9 - 2000
events
enum<string>[]
required

The events to send. The key must be able to read what each event carries: agent:read for agent_task.finished, deploy:read for the deployment events, account:read for balance.low, automations:read for automation_run.finished.

Required array length: 1 - 5 elements
Available options:
agent_task.finished,
deployment.succeeded,
deployment.failed,
balance.low,
automation_run.finished
description
string
default:""

A note for yourself.

Maximum string length: 200
balance_below

For balance.low: send the event when the balance falls below this many credits. Defaults to 100. Needs balance.low in events.

Example:

"250"

Response

The webhook, with its signing secret.

id
string
required

The webhook id.

Pattern: ^wh_[a-z0-9]{20}$
url
string<uri>
required

Where events are sent.

events
enum<string>[]
required

The events it receives.

Available options:
agent_task.finished,
deployment.succeeded,
deployment.failed,
balance.low,
automation_run.finished
key_id
string
required

The key that made the webhook. The webhook works only while this key does, and only hears about the apps and workspaces the key may see.

active
boolean
required

False once the key has been revoked or has expired.

created_at
string<date-time>
required

When it was made.

secret
string
required

The signing secret, starting with whsec_. Use it to check X-Jobbit-Signature on each delivery. Keep it private.

description
string

Your note.

balance_below
string | null

The balance.low threshold in credits. Null if the webhook does not take balance.low.