Disparar webhook manualmente
curl --request POST \
--url https://garu.com.br/api/webhook-endpoints/{id}/trigger \
--header 'Authorization: Bearer <token>'import requests
url = "https://garu.com.br/api/webhook-endpoints/{id}/trigger"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://garu.com.br/api/webhook-endpoints/{id}/trigger', 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://garu.com.br/api/webhook-endpoints/{id}/trigger",
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://garu.com.br/api/webhook-endpoints/{id}/trigger"
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://garu.com.br/api/webhook-endpoints/{id}/trigger")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://garu.com.br/api/webhook-endpoints/{id}/trigger")
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_bodyWebhooks e Exemplos
Disparar webhook manualmente
Substituto leve de sandbox: dispare um payload de exemplo de qualquer evento já assinado
POST
/
api
/
webhook-endpoints
/
{id}
/
trigger
Disparar webhook manualmente
curl --request POST \
--url https://garu.com.br/api/webhook-endpoints/{id}/trigger \
--header 'Authorization: Bearer <token>'import requests
url = "https://garu.com.br/api/webhook-endpoints/{id}/trigger"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://garu.com.br/api/webhook-endpoints/{id}/trigger', 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://garu.com.br/api/webhook-endpoints/{id}/trigger",
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://garu.com.br/api/webhook-endpoints/{id}/trigger"
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://garu.com.br/api/webhook-endpoints/{id}/trigger")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://garu.com.br/api/webhook-endpoints/{id}/trigger")
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_bodyDisponível a partir da v0.8.1. Permite disparar um payload de exemplo de qualquer evento Garu para um endpoint específico — útil para validar sua integração ponta-a-ponta antes de tráfego real.
Pré-condições
- O endpoint precisa estar inscrito no evento que você quer disparar (configure em Dashboard → Configurações → Webhooks).
- O
eventprecisa pertencer à whitelist (qualquer evento que a Garu emita, excetowebhook.test— esse continua atendido pelo endpoint legado/test).
Body
{
"event": "transaction.payment.failed",
"payloadOverrides": {
"failureCode": "card_expired"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
event | string | Tipo do evento (ex: transaction.payment.failed, scheduled_charge.cycle_failed) |
payloadOverrides | object | (opcional) Mesclado raso no data.object do payload de exemplo |
Resposta
Retorna oOutgoingWebhookEvent já entregue, com status, número de tentativas e código HTTP da resposta do seu endpoint.
{
"id": 12345,
"endpointId": 7,
"eventType": "transaction.payment.failed",
"payload": {
"id": "evt_test_1730000000_abc",
"type": "transaction.payment.failed",
"data": {
"object": {
"id": 999,
"value": 49.9,
"failureCode": "card_expired",
"failureReason": "Cartão vencido",
"gatewayFailureCode": "54"
}
},
"metadata": { "test": true },
"seller_id": 42
},
"status": "delivered",
"attempts": 1
}
Todo payload disparado por essa rota carrega
metadata.test: true para que seu receiver possa diferenciar evento real de teste.Erros
| Status | Caso |
|---|---|
| 400 | event fora da whitelist |
| 404 | Endpoint não existe ou não pertence ao seller chamando |
| 404 | Endpoint não inscrito no evento informado |
Exemplo: validar handler de cycle_failed
curl -X POST https://garu.com.br/api/webhook-endpoints/7/trigger \
-H "Authorization: Bearer $GARU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event": "scheduled_charge.cycle_failed",
"payloadOverrides": {
"failureCode": "card_expired",
"failureReason": "Cartão vencido"
}
}'
Was this page helpful?