curl --request POST \
--url https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test', 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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test",
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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test"
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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test")
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{
"activated": true,
"detail": "",
"endpoint": {
"activated_at": "2026-10-04T19:25:39.423Z",
"consecutive_failed_deliveries": 0,
"created_date": "2026-10-04T19:25:34.260Z",
"description": "Provisioning",
"health": "healthy",
"id": "6ac2a82edfafd1b6c6a9c27d",
"last_success_at": "2026-10-05T13:23:36.743Z",
"selected_event_types": [
"app.created.v1",
"app.deleted.v1"
],
"state": "active",
"target_url": "https://hooks.example.com/base44"
},
"http_status": 200
}{
"error": {
"code": "invalid_request",
"message": "The request is invalid.",
"details": {
"fields": [
{
"field": "target_url",
"problem": "Field required"
}
]
}
}
}{
"error": {
"code": "unauthenticated",
"message": "Invalid workspace API key.",
"details": {}
}
}{
"error": {
"code": "permission_denied",
"message": "This workspace API key is not permitted to manage outbound webhooks. Needed: [outbound_webhooks:write]",
"details": {}
}
}{
"error": {
"code": "not_found",
"message": "Webhook endpoint not found.",
"details": {}
}
}{
"error": {
"code": "limit_exceeded",
"message": "A workspace may have at most 10 webhook endpoints.",
"details": {
"max_endpoints": 10
}
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after the interval in the Retry-After header.",
"details": {
"retry_after_seconds": 42
}
}
}{
"error": {
"code": "internal_error",
"message": "An internal error occurred. Retry with exponential backoff.",
"details": {}
}
}Test an endpoint
Sends the activation test again, for an endpoint that didn’t activate or whose URL changed. The test is a signed webhook.test.v1 event. The endpoint activates only if it answers with a 2xx status within 5 seconds and returns the event’s data.challenge in its response body. activated says whether it did; when it didn’t, failure_category, http_status and detail say why. Testing an active endpoint leaves it active, and testing a paused one leaves it paused.
curl --request POST \
--url https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test', 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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test",
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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test"
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.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/v1/outbound-webhooks/endpoints/{endpoint_id}/test")
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{
"activated": true,
"detail": "",
"endpoint": {
"activated_at": "2026-10-04T19:25:39.423Z",
"consecutive_failed_deliveries": 0,
"created_date": "2026-10-04T19:25:34.260Z",
"description": "Provisioning",
"health": "healthy",
"id": "6ac2a82edfafd1b6c6a9c27d",
"last_success_at": "2026-10-05T13:23:36.743Z",
"selected_event_types": [
"app.created.v1",
"app.deleted.v1"
],
"state": "active",
"target_url": "https://hooks.example.com/base44"
},
"http_status": 200
}{
"error": {
"code": "invalid_request",
"message": "The request is invalid.",
"details": {
"fields": [
{
"field": "target_url",
"problem": "Field required"
}
]
}
}
}{
"error": {
"code": "unauthenticated",
"message": "Invalid workspace API key.",
"details": {}
}
}{
"error": {
"code": "permission_denied",
"message": "This workspace API key is not permitted to manage outbound webhooks. Needed: [outbound_webhooks:write]",
"details": {}
}
}{
"error": {
"code": "not_found",
"message": "Webhook endpoint not found.",
"details": {}
}
}{
"error": {
"code": "limit_exceeded",
"message": "A workspace may have at most 10 webhook endpoints.",
"details": {
"max_endpoints": 10
}
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after the interval in the Retry-After header.",
"details": {
"retry_after_seconds": 42
}
}
}{
"error": {
"code": "internal_error",
"message": "An internal error occurred. Retry with exponential backoff.",
"details": {}
}
}Authorizations
A workspace API key with the outbound_webhooks:write scope, sent as Authorization: Bearer <key>.
Path Parameters
The endpoint's ID.
"6ac2a82edfafd1b6c6a9c27d"
Response
Successful Response
The endpoint and the result of its activation test.
Show child attributes
Show child attributes
{
"activated_at": "2026-10-04T19:25:39.423Z",
"consecutive_failed_deliveries": 0,
"created_date": "2026-10-04T19:25:34.260Z",
"description": "Provisioning",
"health": "healthy",
"id": "6ac2a82edfafd1b6c6a9c27d",
"last_success_at": "2026-10-05T13:23:36.743Z",
"selected_event_types": ["app.created.v1", "app.deleted.v1"],
"state": "active",
"target_url": "https://hooks.example.com/base44"
}
Whether the endpoint passed the test and is active.
The status your endpoint answered with. Null when it didn't answer.
Why the test failed: timeout, transport (no connection), server_error (5xx), client_error (4xx, or a 2xx without the challenge), redirect, ssrf_rejected (the URL resolved to a non-public address) or internal. Null on success.
A sentence explaining the result. Not a stable contract.
Was this page helpful?