curl --request GET \
--url https://api.reply.io/v3/webhooks/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/webhooks/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/webhooks/{id}', 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.reply.io/v3/webhooks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://api.reply.io/v3/webhooks/{id}"
req, _ := http.NewRequest("GET", 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.get("https://api.reply.io/v3/webhooks/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/webhooks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": 1823,
"eventType": "email_replied",
"url": "https://example.com/hooks/reply",
"scope": "personal",
"enabled": true,
"createdAt": "2026-04-17T12:00:00+00:00",
"payloadConfig": {
"includeEmailUrl": true,
"includeEmailText": false,
"includeProspectCustomFields": true
}
}{
"title": "Validation failed",
"status": 400,
"detail": "The request contains validation errors.",
"errors": [
{
"pointer": "id",
"detail": "The 'id' parameter must be a positive integer."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Not Found",
"status": 404,
"detail": "Webhook subscription 1823 not found.",
"code": "webHook.notFound"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Get a webhook subscription
webhooks:read scope (or a broader one that includes it).
Get one subscription by id: the event it listens to, its url, scope, enabled flag, creation date, and payload flags.
curl --request GET \
--url https://api.reply.io/v3/webhooks/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.reply.io/v3/webhooks/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.reply.io/v3/webhooks/{id}', 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.reply.io/v3/webhooks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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://api.reply.io/v3/webhooks/{id}"
req, _ := http.NewRequest("GET", 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.get("https://api.reply.io/v3/webhooks/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/webhooks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": 1823,
"eventType": "email_replied",
"url": "https://example.com/hooks/reply",
"scope": "personal",
"enabled": true,
"createdAt": "2026-04-17T12:00:00+00:00",
"payloadConfig": {
"includeEmailUrl": true,
"includeEmailText": false,
"includeProspectCustomFields": true
}
}{
"title": "Validation failed",
"status": 400,
"detail": "The request contains validation errors.",
"errors": [
{
"pointer": "id",
"detail": "The 'id' parameter must be a positive integer."
}
]
}{
"title": "Unauthorized",
"status": 401,
"detail": "Authentication credentials are missing or invalid."
}{
"title": "Not Found",
"status": 404,
"detail": "Webhook subscription 1823 not found.",
"code": "webHook.notFound"
}{
"title": "Too Many Requests",
"status": 429,
"detail": "Rate limit exceeded. Retry after 60 seconds."
}Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Path Parameters
Webhook subscription ID.
Response
Webhook subscription details.
A webhook subscription. The subscription fires a single event type to a configured URL
when activity matching the subscription's scope occurs.
Unique identifier for the webhook subscription.
Event type this subscription fires on. One of the values returned by
GET /v3/webhooks/events.
"email_replied"
Absolute http/https URL that receives the webhook payload.
"https://example.com/hooks/reply"
Scope that determines which users' activity triggers the webhook.
personal— fires only for activity of the subscription owner.team— fires for activity of any member of the owner's team. Creation requires the current user to be the team owner for private teams; anyone can create for public teams.organization— reserved for future use. The API currently rejects creation/update with this value (errorCode: 5).
personal, team, organization "personal"
If false, the subscription does not fire. Toggle via the dedicated
POST /v3/webhooks/{id}/enable and POST /v3/webhooks/{id}/disable
endpoints — the state cannot be changed through PUT.
ISO-8601 timestamp (UTC) when the subscription was created.
Optional flags that enrich the delivered webhook payload with extra fields from the originating email/contact.
Show child attributes
Show child attributes
{
"includeEmailUrl": true,
"includeEmailText": false,
"includeProspectCustomFields": true
}