curl --request POST \
--url https://api.synci.io/api/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>'})
};
fetch('https://api.synci.io/api/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.synci.io/api/v1/webhooks"
payload = { "url": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.synci.io/api/v1/webhooks",
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' => '<string>'
]),
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.synci.io/api/v1/webhooks"
payload := strings.NewReader("{\n \"url\": \"<string>\"\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))
}{
"message": "Webhook endpoint created.",
"data": {
"id": "<string>",
"url": "<string>",
"description": "<string>",
"enabled": "<string>",
"type": "<string>",
"omit_sensitive_identifiers": "<string>",
"events": "<string>",
"payload_version": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"financial_accounts": "<string>",
"health": {
"status": "<string>",
"integrator_message": "<string>",
"failure_count": "<string>",
"transient_message": "<string>",
"transient_failure_count": "<string>",
"last_attempt_at": "<string>"
},
"secret": "<string>"
}
}{
"message": "<string>"
}{
"message": "You have reached the limit for webhook endpoints in your current plan. Please upgrade to continue.",
"feature": "webhook_endpoint",
"current": 1,
"limit": 123,
"formatted_limit": "<string>"
}{
"message": "<string>",
"errors": {}
}Create new webhook endpoint
The endpoint’s signing secret is included in this response only — it
cannot be read again later, but can be rotated at any time. The number
of webhook endpoints is subject to your plan’s limits (403 when
exceeded).
curl --request POST \
--url https://api.synci.io/api/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: '<string>'})
};
fetch('https://api.synci.io/api/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.synci.io/api/v1/webhooks"
payload = { "url": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.synci.io/api/v1/webhooks",
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' => '<string>'
]),
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.synci.io/api/v1/webhooks"
payload := strings.NewReader("{\n \"url\": \"<string>\"\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))
}{
"message": "Webhook endpoint created.",
"data": {
"id": "<string>",
"url": "<string>",
"description": "<string>",
"enabled": "<string>",
"type": "<string>",
"omit_sensitive_identifiers": "<string>",
"events": "<string>",
"payload_version": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"financial_accounts": "<string>",
"health": {
"status": "<string>",
"integrator_message": "<string>",
"failure_count": "<string>",
"transient_message": "<string>",
"transient_failure_count": "<string>",
"last_attempt_at": "<string>"
},
"secret": "<string>"
}
}{
"message": "<string>"
}{
"message": "You have reached the limit for webhook endpoints in your current plan. Please upgrade to continue.",
"feature": "webhook_endpoint",
"current": 1,
"limit": 123,
"formatted_limit": "<string>"
}{
"message": "<string>",
"errors": {}
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
The HTTPS URL that will receive event deliveries.
512Optional label to help you identify the endpoint.
255Whether the endpoint receives deliveries. Defaults to true.
The event types this endpoint should receive. Canonical names:
transactions.created, transactions.updated, balance.updated,
holdings.updated, account.created, account.updated,
account.deleted. Legacy aliases (bank_account.created,
bank_account.updated, bank_account.deleted) are accepted but
cannot be mixed in the same array with their canonical counterparts.
1transactions.created, transactions.updated, balance.updated, holdings.updated, account.created, account.updated, account.deleted, bank_account.created, bank_account.updated, bank_account.deleted, connection.created, connection.activated, connection.reauthorized, connection.expiring, connection.expired, connection.failing, connection.recovered, connection.disabled, connection.deleted Limit deliveries to these financial account IDs. Omit or pass null to receive events for all accounts.
WEBHOOK (default) for a standard endpoint, ZAPIER for an
endpoint used with the Zapier integration, or N8N for an
endpoint registered by the Synci n8n trigger node.
WEBHOOK, ZAPIER, N8N Shape of payloads delivered to this endpoint. Defaults to v2
(canonical account.* event names + financial_account payload key).
Pass v1 to opt into the legacy shape (bank_account.* event-type
aliases + bank_account payload key) — only useful for clients
migrating an existing integration. Pinned at creation;
updates are ignored. If omitted, the version is inferred from the events array: any
bank_account.* subscription implies v1, otherwise v2.
v1, v2 When true, sensitive account identifiers (IBAN/BBAN) are omitted from delivered payloads. Must be true for Zapier endpoints.
yes, on, 1, 1, true, true