N8n Webhooks
Einen n8n-Webhook für Änderungen an ERP-Datensätzen registrieren (oder aktualisieren).
POST/api/nodered/webhook
Erwartet JSON-Body: { "webhook_url": "https://n8n.example.com/webhook/inwendo-erp", "reference_class_name": "CRMCompany", // optional, null = alle Klassen "database_action": "update", // optional, null = alle Aktionen "webhook_token": "...", // optional gemeinsames Geheimnis "delivery": "mqtt", // nur Node-RED: über den MQTT-Broker der ERP "instance_id": "..." // nur mqtt, anstelle von webhook_url }
database_action kann auch ein zeitgesteuertes Buchungsereignis sein (booking_pre_start, booking_start, booking_end, booking_post_end oder booking_timed für alle vier, integration_booking_timed_events_enabled); ein solcher Webhook erhält nur diese Ereignisse.
Bei delivery mqtt (integration_mqtt_trigger_enabled) veröffentlicht die ERP den Webhook auf ihrem Broker, und die Antwort enthält "mqtt" (url, username, password, client_id, topic, valid_until) wie bei der Registrierung der Schloss-Bridge; der Node registriert sich vor valid_until erneut.
Existiert bereits ein nicht gelöschter Webhook mit derselben notificationUrl und notificationClientId = 'n8n', wird er an Ort und Stelle aktualisiert (oder unverändert zurückgegeben, wenn alle Felder bereits übereinstimmen).
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/nodered/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/nodered/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/nodered/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/nodered/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/nodered/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/nodered/webhook")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/nodered/webhook"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/nodered/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Alle n8n-Webhooks für eine gegebene Webhook-URL abmelden.
DELETE/api/nodered/webhook
Erwartet JSON-Body: { "webhook_url": "https://n8n.example.com/webhook/inwendo-erp" } oder, für einen Node-RED-Trigger mit MQTT-Zustellung, {"instance_id": "..."}.
Markiert alle nicht gelöschten Einträge, deren notificationUrl übereinstimmt und deren notificationClientId 'n8n' ist, als gelöscht. Webhooks anderer Clients bleiben unverändert.
Antworten
default
curl --request DELETE \
--url https://eure-instanz.iw-erp.de/api/nodered/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/nodered/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/nodered/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://eure-instanz.iw-erp.de/api/nodered/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/nodered/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/nodered/webhook")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/nodered/webhook"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.delete(
Uri.parse('https://eure-instanz.iw-erp.de/api/nodered/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Einen n8n-Webhook für Änderungen an ERP-Datensätzen registrieren (oder aktualisieren).
POST/api/n8n/webhook
Erwartet JSON-Body: { "webhook_url": "https://n8n.example.com/webhook/inwendo-erp", "reference_class_name": "CRMCompany", // optional, null = alle Klassen "database_action": "update", // optional, null = alle Aktionen "webhook_token": "...", // optional gemeinsames Geheimnis "delivery": "mqtt", // nur Node-RED: über den MQTT-Broker der ERP "instance_id": "..." // nur mqtt, anstelle von webhook_url }
database_action kann auch ein zeitgesteuertes Buchungsereignis sein (booking_pre_start, booking_start, booking_end, booking_post_end oder booking_timed für alle vier, integration_booking_timed_events_enabled); ein solcher Webhook erhält nur diese Ereignisse.
Bei delivery mqtt (integration_mqtt_trigger_enabled) veröffentlicht die ERP den Webhook auf ihrem Broker, und die Antwort enthält "mqtt" (url, username, password, client_id, topic, valid_until) wie bei der Registrierung der Schloss-Bridge; der Node registriert sich vor valid_until erneut.
Existiert bereits ein nicht gelöschter Webhook mit derselben notificationUrl und notificationClientId = 'n8n', wird er an Ort und Stelle aktualisiert (oder unverändert zurückgegeben, wenn alle Felder bereits übereinstimmen).
Antworten
default
curl --request POST \
--url https://eure-instanz.iw-erp.de/api/n8n/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/n8n/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/n8n/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://eure-instanz.iw-erp.de/api/n8n/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/n8n/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/n8n/webhook")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/n8n/webhook"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.iw-erp.de/api/n8n/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Alle n8n-Webhooks für eine gegebene Webhook-URL abmelden.
DELETE/api/n8n/webhook
Erwartet JSON-Body: { "webhook_url": "https://n8n.example.com/webhook/inwendo-erp" } oder, für einen Node-RED-Trigger mit MQTT-Zustellung, {"instance_id": "..."}.
Markiert alle nicht gelöschten Einträge, deren notificationUrl übereinstimmt und deren notificationClientId 'n8n' ist, als gelöscht. Webhooks anderer Clients bleiben unverändert.
Antworten
default
curl --request DELETE \
--url https://eure-instanz.iw-erp.de/api/n8n/webhook \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'DELETE', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://eure-instanz.iw-erp.de/api/n8n/webhook', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://eure-instanz.iw-erp.de/api/n8n/webhook"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.delete(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('DELETE', 'https://eure-instanz.iw-erp.de/api/n8n/webhook', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Delete,
RequestUri = new Uri("https://eure-instanz.iw-erp.de/api/n8n/webhook"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://eure-instanz.iw-erp.de/api/n8n/webhook")
.delete(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://eure-instanz.iw-erp.de/api/n8n/webhook"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.delete(
Uri.parse('https://eure-instanz.iw-erp.de/api/n8n/webhook'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);