Config
Create a webhook endpoint
Creates a labeled webhook endpoint. Each enabled endpoint receives the same webhook events and signs requests with its own secret. The secret is returned once in this response and cannot be read again.
POST
/
config
/
webhooks
Create a webhook endpoint
curl --request POST \
--url https://api.vocobase.com/api/v2/config/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": true
}
'import requests
url = "https://api.vocobase.com/api/v2/config/webhooks"
payload = {
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": True
}
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({label: 'prod', url: 'https://example.com/webhooks/vocobase', enabled: true})
};
fetch('https://api.vocobase.com/api/v2/config/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://api.vocobase.com/api/v2/config/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([
'label' => 'prod',
'url' => 'https://example.com/webhooks/vocobase',
'enabled' => true
]),
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://api.vocobase.com/api/v2/config/webhooks"
payload := strings.NewReader("{\n \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\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://api.vocobase.com/api/v2/config/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/config/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 \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "12345678-abcd-1234-abcd-123456789012",
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": true,
"last_delivery_at": null,
"last_delivery_status": null,
"created_at": "2026-05-25T10:00:00.000Z",
"updated_at": "2026-05-25T10:00:00.000Z",
"secret": "whsec_abc123...",
"message": "Save this secret — it will not be shown again."
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "agent_name is required and must be max 50 characters"
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}Authorizations
API key in format: rg_live_xxxx. Pass as a Bearer token in the Authorization header.
Body
application/json
Partner-chosen endpoint label. Lowercase letters, numbers, and hyphens only; 1-31 characters.
Pattern:
^[a-z0-9][a-z0-9-]{0,30}$Example:
"prod"
HTTPS URL that receives webhook events.
Example:
"https://example.com/webhooks/vocobase"
Whether the endpoint should receive new webhook events.
Previous
Delete a webhook endpointDeletes a webhook endpoint. Delivery attempts that were already created may still use the previous URL and secret, but the deleted endpoint stops receiving new events.
Next
⌘I
Create a webhook endpoint
curl --request POST \
--url https://api.vocobase.com/api/v2/config/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": true
}
'import requests
url = "https://api.vocobase.com/api/v2/config/webhooks"
payload = {
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": True
}
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({label: 'prod', url: 'https://example.com/webhooks/vocobase', enabled: true})
};
fetch('https://api.vocobase.com/api/v2/config/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://api.vocobase.com/api/v2/config/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([
'label' => 'prod',
'url' => 'https://example.com/webhooks/vocobase',
'enabled' => true
]),
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://api.vocobase.com/api/v2/config/webhooks"
payload := strings.NewReader("{\n \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\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://api.vocobase.com/api/v2/config/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.vocobase.com/api/v2/config/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 \"label\": \"prod\",\n \"url\": \"https://example.com/webhooks/vocobase\",\n \"enabled\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": "12345678-abcd-1234-abcd-123456789012",
"label": "prod",
"url": "https://example.com/webhooks/vocobase",
"enabled": true,
"last_delivery_at": null,
"last_delivery_status": null,
"created_at": "2026-05-25T10:00:00.000Z",
"updated_at": "2026-05-25T10:00:00.000Z",
"secret": "whsec_abc123...",
"message": "Save this secret — it will not be shown again."
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "agent_name is required and must be max 50 characters"
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or missing API key"
}
}{
"success": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"success": false,
"error": {
"code": "INTERNAL_ERROR",
"message": "An unexpected error occurred"
}
}