Webhooks
Register Webhook Endpoint
Registers an endpoint on your server that Kravata will call whenever the configured triggerEvent occurs (for example, a user accepting the Terms and Conditions inside the Widget SDK, or an OTP being requested).
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Descriptive name for the webhook. Must be unique. |
| direction | string (enum) | Yes | "OUTBOUND" |
| url | string | Yes | URL on your server that will receive the event (max 500 chars). |
| httpMethod | string (enum) | Yes | "POST" |
| authType | string (enum) | No — default "NONE" | "NONE" |
| triggerEvent | string | No | Event that fires this webhook. Events with real listeners today: “user.accepted_terms”, “auth.otp_requested”, “user.canceled”, “user.created”, “user.updated”, “operation.created”, “operation.status_updated”, “operation.transfer.created”, “operation.transfer.status_updated”, “wallet.created”, “fiat.payin.completed”, “fiat.payout.completed”, “fiat.payment.completed”, “fiat.payin.rejected”, “fiat.payout.rejected” |
| timeoutMs | number | No — default 30000 | Timeout for the call to your server, in milliseconds. |
| retryConfig | object | No | Retry policy — max_attempts (default 3), and on failure, initial_delay_ms (default 1000) / multiplier (default 4) for exponential backoff. |
Response
| Field | Description |
|---|---|
| id | Internal UUID of the created Integration Endpoint. |
| isActive | Whether the webhook is currently active. |
| registerDate | Timestamp set automatically on creation. |
POST
/
api
/
v1
/
integration-endpoints
Register Webhook Endpoint
curl --request POST \
--url https://test-api-kore.kravata.co/api/v1/integration-endpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "operation.status_updated",
"direction": "OUTBOUND",
"url": "https://your-server.example.com/webhooks/kravata",
"httpMethod": "POST",
"authType": "NONE",
"triggerEvent": "operation.status_updated",
"timeoutMs": 30000,
"retryConfig": {
"max_attempts": 3,
"initial_delay_ms": 1000,
"multiplier": 4
},
"requestHeaders": null,
"payloadMapping": null,
"isActive": true
}
'import requests
url = "https://test-api-kore.kravata.co/api/v1/integration-endpoints"
payload = {
"name": "operation.status_updated",
"direction": "OUTBOUND",
"url": "https://your-server.example.com/webhooks/kravata",
"httpMethod": "POST",
"authType": "NONE",
"triggerEvent": "operation.status_updated",
"timeoutMs": 30000,
"retryConfig": {
"max_attempts": 3,
"initial_delay_ms": 1000,
"multiplier": 4
},
"requestHeaders": None,
"payloadMapping": None,
"isActive": True
}
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({
name: 'operation.status_updated',
direction: 'OUTBOUND',
url: 'https://your-server.example.com/webhooks/kravata',
httpMethod: 'POST',
authType: 'NONE',
triggerEvent: 'operation.status_updated',
timeoutMs: 30000,
retryConfig: {max_attempts: 3, initial_delay_ms: 1000, multiplier: 4},
requestHeaders: null,
payloadMapping: null,
isActive: true
})
};
fetch('https://test-api-kore.kravata.co/api/v1/integration-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://test-api-kore.kravata.co/api/v1/integration-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([
'name' => 'operation.status_updated',
'direction' => 'OUTBOUND',
'url' => 'https://your-server.example.com/webhooks/kravata',
'httpMethod' => 'POST',
'authType' => 'NONE',
'triggerEvent' => 'operation.status_updated',
'timeoutMs' => 30000,
'retryConfig' => [
'max_attempts' => 3,
'initial_delay_ms' => 1000,
'multiplier' => 4
],
'requestHeaders' => null,
'payloadMapping' => null,
'isActive' => true
]),
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://test-api-kore.kravata.co/api/v1/integration-endpoints"
payload := strings.NewReader("{\n \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\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://test-api-kore.kravata.co/api/v1/integration-endpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test-api-kore.kravata.co/api/v1/integration-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 \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"isActive": true,
"registerDate": "2026-05-14T06:07:59.016726"
}Body
application/json
Register Webhook Endpoint
curl --request POST \
--url https://test-api-kore.kravata.co/api/v1/integration-endpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "operation.status_updated",
"direction": "OUTBOUND",
"url": "https://your-server.example.com/webhooks/kravata",
"httpMethod": "POST",
"authType": "NONE",
"triggerEvent": "operation.status_updated",
"timeoutMs": 30000,
"retryConfig": {
"max_attempts": 3,
"initial_delay_ms": 1000,
"multiplier": 4
},
"requestHeaders": null,
"payloadMapping": null,
"isActive": true
}
'import requests
url = "https://test-api-kore.kravata.co/api/v1/integration-endpoints"
payload = {
"name": "operation.status_updated",
"direction": "OUTBOUND",
"url": "https://your-server.example.com/webhooks/kravata",
"httpMethod": "POST",
"authType": "NONE",
"triggerEvent": "operation.status_updated",
"timeoutMs": 30000,
"retryConfig": {
"max_attempts": 3,
"initial_delay_ms": 1000,
"multiplier": 4
},
"requestHeaders": None,
"payloadMapping": None,
"isActive": True
}
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({
name: 'operation.status_updated',
direction: 'OUTBOUND',
url: 'https://your-server.example.com/webhooks/kravata',
httpMethod: 'POST',
authType: 'NONE',
triggerEvent: 'operation.status_updated',
timeoutMs: 30000,
retryConfig: {max_attempts: 3, initial_delay_ms: 1000, multiplier: 4},
requestHeaders: null,
payloadMapping: null,
isActive: true
})
};
fetch('https://test-api-kore.kravata.co/api/v1/integration-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://test-api-kore.kravata.co/api/v1/integration-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([
'name' => 'operation.status_updated',
'direction' => 'OUTBOUND',
'url' => 'https://your-server.example.com/webhooks/kravata',
'httpMethod' => 'POST',
'authType' => 'NONE',
'triggerEvent' => 'operation.status_updated',
'timeoutMs' => 30000,
'retryConfig' => [
'max_attempts' => 3,
'initial_delay_ms' => 1000,
'multiplier' => 4
],
'requestHeaders' => null,
'payloadMapping' => null,
'isActive' => true
]),
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://test-api-kore.kravata.co/api/v1/integration-endpoints"
payload := strings.NewReader("{\n \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\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://test-api-kore.kravata.co/api/v1/integration-endpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test-api-kore.kravata.co/api/v1/integration-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 \"name\": \"operation.status_updated\",\n \"direction\": \"OUTBOUND\",\n \"url\": \"https://your-server.example.com/webhooks/kravata\",\n \"httpMethod\": \"POST\",\n \"authType\": \"NONE\",\n \"triggerEvent\": \"operation.status_updated\",\n \"timeoutMs\": 30000,\n \"retryConfig\": {\n \"max_attempts\": 3,\n \"initial_delay_ms\": 1000,\n \"multiplier\": 4\n },\n \"requestHeaders\": null,\n \"payloadMapping\": null,\n \"isActive\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"isActive": true,
"registerDate": "2026-05-14T06:07:59.016726"
}
