pcall POST "/api/v1/partner/webhooks/endpoints" '{
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
}'const res = await call("POST", "/api/v1/partner/webhooks/endpoints", {
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
});
const { data } = await res.json();res = call("POST", "/api/v1/partner/webhooks/endpoints", {
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
})
data = res.json()["data"]<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-bc.userecord.io/api/v1/partner/webhooks/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://ats.example.com/hooks/record',
'description' => 'Production ATS',
'event_types' => [
'candidate.result'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-secret-key: <api-key>"
],
]);
$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-bc.userecord.io/api/v1/partner/webhooks/endpoints"
payload := strings.NewReader("{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-secret-key", "<api-key>")
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-bc.userecord.io/api/v1/partner/webhooks/endpoints")
.header("x-api-key", "<api-key>")
.header("x-secret-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-bc.userecord.io/api/v1/partner/webhooks/endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["x-secret-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"endpoint": {
"endpoint_id": "we_3f9a1c7e5b2d4086a1b3c5d7e9f01234",
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
],
"status": "active",
"paused_reason": null,
"consecutive_failures": 0,
"last_success_at": "2026-10-05T12:41:12.000Z",
"last_failure_at": null,
"created_at": "2026-10-01T08:00:00.000Z"
},
"existing": false
}
}{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
],
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
],
"request_id": "<string>"
}
}Create an endpoint
Register the HTTPS URL that receives result events. Deliveries are signed with your API secret key.
Scope: webhooks:manage · Idempotency-Key: optional
pcall POST "/api/v1/partner/webhooks/endpoints" '{
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
}'const res = await call("POST", "/api/v1/partner/webhooks/endpoints", {
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
});
const { data } = await res.json();res = call("POST", "/api/v1/partner/webhooks/endpoints", {
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
]
})
data = res.json()["data"]<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-bc.userecord.io/api/v1/partner/webhooks/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://ats.example.com/hooks/record',
'description' => 'Production ATS',
'event_types' => [
'candidate.result'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>",
"x-secret-key: <api-key>"
],
]);
$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-bc.userecord.io/api/v1/partner/webhooks/endpoints"
payload := strings.NewReader("{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("x-secret-key", "<api-key>")
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-bc.userecord.io/api/v1/partner/webhooks/endpoints")
.header("x-api-key", "<api-key>")
.header("x-secret-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-bc.userecord.io/api/v1/partner/webhooks/endpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["x-secret-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"https://ats.example.com/hooks/record\",\n \"description\": \"Production ATS\",\n \"event_types\": [\n \"candidate.result\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"endpoint": {
"endpoint_id": "we_3f9a1c7e5b2d4086a1b3c5d7e9f01234",
"url": "https://ats.example.com/hooks/record",
"description": "Production ATS",
"event_types": [
"candidate.result"
],
"status": "active",
"paused_reason": null,
"consecutive_failures": 0,
"last_success_at": "2026-10-05T12:41:12.000Z",
"last_failure_at": null,
"created_at": "2026-10-01T08:00:00.000Z"
},
"existing": false
}
}{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
],
"request_id": "<string>"
}
}{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"details": [
{
"path": "<string>",
"message": "<string>"
}
],
"request_id": "<string>"
}
}Authorizations
Your key id, VFN_TEST_… or VFN_LIVE_…. Sent on every request.
Your secret, VFN_SK_…. Not a real header, and never sent to the API. It is only a form field for Try it, which uses it to sign your request in your browser. In your own code you sign each request with the secret and send x-api-key, x-timestamp and x-signature (see Authentication).
Headers
Optional. A retry with the same key returns the first answer (kept 24 h). Leave empty in Try it: a new one is made for every call.
255Body
Your HTTPS endpoint (port 443, public host). Record POSTs each event here and counts any 2xx as the acknowledgement
2048Up to 200 characters.
200Default: candidate.result
1 elementcandidate.result Also deliver events from this time on (at most 30 days back)

