Webhooks
Create a webhook
Subscribe a URL to events. The response carries the signing secret. It is shown once; store it.
POST
/
v2
/
webhooks
Create a webhook
curl --request POST \
--url https://api.opennous.cloud/v2/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://hooks.yourco.com/opennous",
"events": [
"deal.won",
"deal.lost",
"conversation.call_ended"
],
"name": "n8n deal router"
}
'import requests
url = "https://api.opennous.cloud/v2/webhooks"
payload = {
"url": "https://hooks.yourco.com/opennous",
"events": ["deal.won", "deal.lost", "conversation.call_ended"],
"name": "n8n deal router"
}
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.yourco.com/opennous',
events: ['deal.won', 'deal.lost', 'conversation.call_ended'],
name: 'n8n deal router'
})
};
fetch('https://api.opennous.cloud/v2/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.opennous.cloud/v2/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.yourco.com/opennous',
'events' => [
'deal.won',
'deal.lost',
'conversation.call_ended'
],
'name' => 'n8n deal router'
]),
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.opennous.cloud/v2/webhooks"
payload := strings.NewReader("{\n \"url\": \"https://hooks.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\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.opennous.cloud/v2/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://hooks.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opennous.cloud/v2/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.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\n}"
response = http.request(request)
puts response.read_body{
"webhook": {
"id": "3f1c2b7a-9d4e-4b8a-a6c1-2e5f7d9b0c41",
"name": "n8n deal router",
"url": "https://hooks.yourco.com/opennous",
"events": [
"deal.won",
"deal.lost",
"conversation.call_ended"
],
"active": true,
"created_at": "2026-10-01T09:00:00Z",
"updated_at": "2026-10-01T09:00:00Z"
},
"secret": "whsec_9f2c1e7b4a6d8e0f3b5c7a9d1e2f4a6b"
}
Subscribe a URL to one or more events.
name defaults to the URL’s host.
The response carries the signing secret. It is shown once, so store it before you do anything else. Use it to verify each delivery.
The URL must be https or http. Private, loopback and cloud metadata addresses are refused with blocked_internal_host.Authorizations
bearerAuthapiKeyHeader
Workspace API key. Create one in Settings → API keys.
Body
application/json
Where we POST events. https or http; private and internal hosts are refused.
Event types to receive. See GET /v2/webhooks/events.
Available options:
conversation.call_ended, conversation.reply_received, deal.won, deal.lost, deal.stage_changed, interaction.email_received, interaction.email_bounced, interaction.linkedin_connection_accepted, interaction.linkedin_message_received, interaction.meeting_scheduled, interaction.meeting_held Defaults to the URL's host.
⌘I
Create a webhook
curl --request POST \
--url https://api.opennous.cloud/v2/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://hooks.yourco.com/opennous",
"events": [
"deal.won",
"deal.lost",
"conversation.call_ended"
],
"name": "n8n deal router"
}
'import requests
url = "https://api.opennous.cloud/v2/webhooks"
payload = {
"url": "https://hooks.yourco.com/opennous",
"events": ["deal.won", "deal.lost", "conversation.call_ended"],
"name": "n8n deal router"
}
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.yourco.com/opennous',
events: ['deal.won', 'deal.lost', 'conversation.call_ended'],
name: 'n8n deal router'
})
};
fetch('https://api.opennous.cloud/v2/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.opennous.cloud/v2/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.yourco.com/opennous',
'events' => [
'deal.won',
'deal.lost',
'conversation.call_ended'
],
'name' => 'n8n deal router'
]),
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.opennous.cloud/v2/webhooks"
payload := strings.NewReader("{\n \"url\": \"https://hooks.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\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.opennous.cloud/v2/webhooks")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://hooks.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.opennous.cloud/v2/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.yourco.com/opennous\",\n \"events\": [\n \"deal.won\",\n \"deal.lost\",\n \"conversation.call_ended\"\n ],\n \"name\": \"n8n deal router\"\n}"
response = http.request(request)
puts response.read_body{
"webhook": {
"id": "3f1c2b7a-9d4e-4b8a-a6c1-2e5f7d9b0c41",
"name": "n8n deal router",
"url": "https://hooks.yourco.com/opennous",
"events": [
"deal.won",
"deal.lost",
"conversation.call_ended"
],
"active": true,
"created_at": "2026-10-01T09:00:00Z",
"updated_at": "2026-10-01T09:00:00Z"
},
"secret": "whsec_9f2c1e7b4a6d8e0f3b5c7a9d1e2f4a6b"
}