curl --request POST \
--url https://api.salvy.com.br/api/v3/webhook-endpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": [
"phone-account.activated",
"phone-account.canceled"
],
"description": "Integração com o ERP"
}
'import requests
url = "https://api.salvy.com.br/api/v3/webhook-endpoints"
payload = {
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": ["phone-account.activated", "phone-account.canceled"],
"description": "Integração com o ERP"
}
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://exemplo.com.br/webhooks/salvy',
eventTypes: ['phone-account.activated', 'phone-account.canceled'],
description: 'Integração com o ERP'
})
};
fetch('https://api.salvy.com.br/api/v3/webhook-endpoints', 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.salvy.com.br/api/v3/webhook-endpoints",
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://exemplo.com.br/webhooks/salvy',
'eventTypes' => [
'phone-account.activated',
'phone-account.canceled'
],
'description' => 'Integração com o ERP'
]),
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.salvy.com.br/api/v3/webhook-endpoints"
payload := strings.NewReader("{\n \"url\": \"https://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\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.salvy.com.br/api/v3/webhook-endpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.salvy.com.br/api/v3/webhook-endpoints")
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://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\n}"
response = http.request(request)
puts response.read_body{
"id": "ep_2yZwUhtgs5Ai8T9yRQJXA",
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": [
"phone-account.activated",
"phone-account.canceled"
],
"description": "Integração com o ERP",
"disabled": false,
"createdAt": "2026-10-13T14:30:00.000Z",
"secret": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD"
}{
"code": "idempotency-parameters-mismatch-error",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "forbidden",
"message": "<string>"
}{
"code": "resource-not-found",
"message": "<string>"
}{
"code": "payload-too-large",
"message": "<string>"
}{
"code": "input-validation-error",
"message": "<string>",
"details": [
{
"key": "<string>",
"message": "<string>"
}
]
}{
"code": "too-many-attempts",
"message": "<string>"
}{
"code": "unknown",
"message": "<string>"
}Cadastrar endpoint de webhook
Cadastra um endpoint de webhook que passa a receber os tipos de evento escolhidos. A resposta traz o segredo de assinatura (secret), retornado somente nesta chamada: guarde-o para verificar os eventos recebidos.
Escopo necessário: webhook-endpoint:create
curl --request POST \
--url https://api.salvy.com.br/api/v3/webhook-endpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": [
"phone-account.activated",
"phone-account.canceled"
],
"description": "Integração com o ERP"
}
'import requests
url = "https://api.salvy.com.br/api/v3/webhook-endpoints"
payload = {
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": ["phone-account.activated", "phone-account.canceled"],
"description": "Integração com o ERP"
}
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://exemplo.com.br/webhooks/salvy',
eventTypes: ['phone-account.activated', 'phone-account.canceled'],
description: 'Integração com o ERP'
})
};
fetch('https://api.salvy.com.br/api/v3/webhook-endpoints', 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.salvy.com.br/api/v3/webhook-endpoints",
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://exemplo.com.br/webhooks/salvy',
'eventTypes' => [
'phone-account.activated',
'phone-account.canceled'
],
'description' => 'Integração com o ERP'
]),
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.salvy.com.br/api/v3/webhook-endpoints"
payload := strings.NewReader("{\n \"url\": \"https://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\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.salvy.com.br/api/v3/webhook-endpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.salvy.com.br/api/v3/webhook-endpoints")
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://exemplo.com.br/webhooks/salvy\",\n \"eventTypes\": [\n \"phone-account.activated\",\n \"phone-account.canceled\"\n ],\n \"description\": \"Integração com o ERP\"\n}"
response = http.request(request)
puts response.read_body{
"id": "ep_2yZwUhtgs5Ai8T9yRQJXA",
"url": "https://exemplo.com.br/webhooks/salvy",
"eventTypes": [
"phone-account.activated",
"phone-account.canceled"
],
"description": "Integração com o ERP",
"disabled": false,
"createdAt": "2026-10-13T14:30:00.000Z",
"secret": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD"
}{
"code": "idempotency-parameters-mismatch-error",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "forbidden",
"message": "<string>"
}{
"code": "resource-not-found",
"message": "<string>"
}{
"code": "payload-too-large",
"message": "<string>"
}{
"code": "input-validation-error",
"message": "<string>",
"details": [
{
"key": "<string>",
"message": "<string>"
}
]
}{
"code": "too-many-attempts",
"message": "<string>"
}{
"code": "unknown",
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Idempotency key for this request. Will return the same response if the same request is made again with the same key. Fails if parameters are different.
Body
URL HTTPS que vai receber os eventos.
"https://exemplo.com.br/webhooks/salvy"
Tipos de evento que o endpoint vai receber, sem repetição. Os tipos disponíveis estão em GET /webhook-event-types.
11[
"phone-account.activated",
"phone-account.canceled"
]
Descrição para identificar o endpoint.
"Integração com o ERP"
Response
ID do endpoint de webhook.
"ep_2yZwUhtgs5Ai8T9yRQJXA"
URL HTTPS que recebe os eventos.
"https://exemplo.com.br/webhooks/salvy"
Tipos de evento enviados a este endpoint. Um endpoint sem filtro de eventos recebe todos os tipos e lista todos os disponíveis em GET /webhook-event-types.
[
"phone-account.activated",
"phone-account.canceled"
]
Descrição do endpoint; null quando não informada.
"Integração com o ERP"
Indica se o endpoint está desativado. Um endpoint desativado não recebe eventos.
false
Data e hora de criação do endpoint (ISO 8601, UTC).
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$"2026-10-13T14:30:00.000Z"
Segredo usado para verificar a assinatura dos eventos entregues a este endpoint. Retornado apenas na criação: guarde-o em local seguro.
"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD"