Test Webhook
curl --request POST \
--url https://app.tuco.ai/api/webhooks/{id}/health-check \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.tuco.ai/api/webhooks/{id}/health-check"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.tuco.ai/api/webhooks/{id}/health-check', 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://app.tuco.ai/api/webhooks/{id}/health-check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.tuco.ai/api/webhooks/{id}/health-check"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.tuco.ai/api/webhooks/{id}/health-check")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tuco.ai/api/webhooks/{id}/health-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"statusCode": 123,
"response": "<string>",
"error": "<string>",
"details": "<string>"
}Webhooks
Test Webhook
Fire a test event to verify your Tuco webhook endpoint is reachable and responding. Bearer-token REST endpoint.
POST
/
api
/
webhooks
/
{id}
/
health-check
Test Webhook
curl --request POST \
--url https://app.tuco.ai/api/webhooks/{id}/health-check \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.tuco.ai/api/webhooks/{id}/health-check"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.tuco.ai/api/webhooks/{id}/health-check', 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://app.tuco.ai/api/webhooks/{id}/health-check",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.tuco.ai/api/webhooks/{id}/health-check"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.tuco.ai/api/webhooks/{id}/health-check")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.tuco.ai/api/webhooks/{id}/health-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"statusCode": 123,
"response": "<string>",
"error": "<string>",
"details": "<string>"
}Send a real signed test webhook to your endpoint. Use this to verify your endpoint is reachable, responding with
2xx, and correctly validating the X-Tuco-Signature header.
The test payload includes data.test: true so your handler can distinguish health checks from real events.
Authentication
Authorization: Bearer tuco_sk_xxxxxxxxxxxxx
Path parameters
string
required
Webhook ID.
What gets sent to your endpoint
Tuco sends a realPOST to your webhook URL with:
| Header | Value |
|---|---|
Content-Type | application/json |
X-Tuco-Signature | HMAC-SHA256 signature (same as production webhooks) |
X-Tuco-Event | First event type from your subscription |
X-Tuco-Timestamp | Current ISO timestamp |
Test payload your endpoint receives
{
"event": "message.sent",
"timestamp": "2026-04-12T12:00:00.000Z",
"workspaceId": "org_xxx",
"data": {
"test": true,
"message": "This is a health check test webhook from Tuco AI"
}
}
The signature is real — computed with your webhook’s secret using the same HMAC-SHA256 algorithm as production webhooks. This means your signature verification code gets tested too.
Response
boolean
Whether your endpoint responded with 2xx
string
Human-readable result (on success)
number
HTTP status code from your endpoint
string
Response body from your endpoint
string
Error message (on failure)
string
Error details (on failure)
Examples
curl -X POST "https://app.tuco.ai/api/webhooks/680a1b2c3d4e5f6789012345/health-check" \
-H "Authorization: Bearer tuco_sk_xxxxxxxxxxxxx"
{
"success": true,
"message": "Health check passed",
"statusCode": 200,
"response": "OK"
}
{
"success": false,
"error": "HTTP 502: Bad Gateway",
"details": "upstream connect error",
"statusCode": 502
}
{
"success": false,
"error": "The operation was aborted due to timeout"
}
The test has a 10-second timeout. If your endpoint takes longer, it’ll report a timeout failure. Make sure your handler returns
2xx quickly and does heavy processing asynchronously.