cURL
curl --request POST \
--url https://api.maesn.dev/webhooks \
--header 'Content-Type: application/json' \
--header 'X-ACCOUNT-KEY: <x-account-key>' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"callbackUrl": "https://example.com/webhook-endpoint/12345"
}
'import requests
url = "https://api.maesn.dev/webhooks"
payload = { "callbackUrl": "https://example.com/webhook-endpoint/12345" }
headers = {
"X-API-KEY": "<x-api-key>",
"X-ACCOUNT-KEY": "<x-account-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<x-api-key>',
'X-ACCOUNT-KEY': '<x-account-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({callbackUrl: 'https://example.com/webhook-endpoint/12345'})
};
fetch('https://api.maesn.dev/webhooks', 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.maesn.dev/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([
'callbackUrl' => 'https://example.com/webhook-endpoint/12345'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-ACCOUNT-KEY: <x-account-key>",
"X-API-KEY: <x-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.maesn.dev/webhooks"
payload := strings.NewReader("{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<x-api-key>")
req.Header.Add("X-ACCOUNT-KEY", "<x-account-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.maesn.dev/webhooks")
.header("X-API-KEY", "<x-api-key>")
.header("X-ACCOUNT-KEY", "<x-account-key>")
.header("Content-Type", "application/json")
.body("{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maesn.dev/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<x-api-key>'
request["X-ACCOUNT-KEY"] = '<x-account-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}"
response = http.request(request)
puts response.read_body{
"meta": {
"warnings": [
"Field not used by target system"
],
"pagination": {
"total": 125,
"perPage": 50,
"currentPage": 1,
"totalPages": 3
}
},
"data": {
"id": "94fdb7fd-13ae-47a6-8a2a-000e6ddc60d9",
"callbackUrl": "https://example.com/webhook-endpoint/12345",
"createdDate": "2025-06-01T00:00:00Z",
"expiresDate": "2026-06-01T00:00:00Z",
"secret": "0f9cfb7fe655d00547fa0720ed4fa1777d6ad1a8e3f94c3b16991e7ceaa5a59c",
"updatedDate": "2025-06-01T00:00:00Z"
}
}Webhooks
Create webhook
POST
/
webhooks
cURL
curl --request POST \
--url https://api.maesn.dev/webhooks \
--header 'Content-Type: application/json' \
--header 'X-ACCOUNT-KEY: <x-account-key>' \
--header 'X-API-KEY: <x-api-key>' \
--data '
{
"callbackUrl": "https://example.com/webhook-endpoint/12345"
}
'import requests
url = "https://api.maesn.dev/webhooks"
payload = { "callbackUrl": "https://example.com/webhook-endpoint/12345" }
headers = {
"X-API-KEY": "<x-api-key>",
"X-ACCOUNT-KEY": "<x-account-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<x-api-key>',
'X-ACCOUNT-KEY': '<x-account-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({callbackUrl: 'https://example.com/webhook-endpoint/12345'})
};
fetch('https://api.maesn.dev/webhooks', 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.maesn.dev/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([
'callbackUrl' => 'https://example.com/webhook-endpoint/12345'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-ACCOUNT-KEY: <x-account-key>",
"X-API-KEY: <x-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.maesn.dev/webhooks"
payload := strings.NewReader("{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<x-api-key>")
req.Header.Add("X-ACCOUNT-KEY", "<x-account-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.maesn.dev/webhooks")
.header("X-API-KEY", "<x-api-key>")
.header("X-ACCOUNT-KEY", "<x-account-key>")
.header("Content-Type", "application/json")
.body("{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.maesn.dev/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<x-api-key>'
request["X-ACCOUNT-KEY"] = '<x-account-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"callbackUrl\": \"https://example.com/webhook-endpoint/12345\"\n}"
response = http.request(request)
puts response.read_body{
"meta": {
"warnings": [
"Field not used by target system"
],
"pagination": {
"total": 125,
"perPage": 50,
"currentPage": 1,
"totalPages": 3
}
},
"data": {
"id": "94fdb7fd-13ae-47a6-8a2a-000e6ddc60d9",
"callbackUrl": "https://example.com/webhook-endpoint/12345",
"createdDate": "2025-06-01T00:00:00Z",
"expiresDate": "2026-06-01T00:00:00Z",
"secret": "0f9cfb7fe655d00547fa0720ed4fa1777d6ad1a8e3f94c3b16991e7ceaa5a59c",
"updatedDate": "2025-06-01T00:00:00Z"
}
}Field support per integration
The
callbackUrl should be unique per end user to ensure that each received event can be clearly mapped back to the correct end user.
Business Central
Business Central
If you’re not using the Interactive Authentication Flow, make sure the query parameters
environmentName and companyId are correctly populated.
You can obtain these values by using the GET Environments and GET Companies endpoints available under the Authentication section.string
required
enum
required
Available options:
ACCOUNT, CREDIT_NOTE, CUSTOMER, DIMENSION, EXPENSE, INVOICE, ITEM, JOURNAL_ENTRY, OFFER, SALES_ORDER, SUPPLIER
Exact Online
Exact Online
If you’re not using the Interactive Authentication Flow, make sure the query parameter
companyId is correctly populated.
You can obtain this value by using the GET Companies endpoint available under the Authentication section.string
required
enum
required
Available options:
ACCOUNT, BANK_ACCOUNT, BILL, CONTACT, EXPENSE, INVOICE, JOURNAL_ENTRY, PAYMENT
FreshBooks
FreshBooks
Ensure that the query parameter
_companyId_ is correctly filled with the account ID associated with the contact.
This value can be retrieved by using the GET Companies endpoint in the Authentication section. Use the returned id as the value for _companyId_.string
required
enum
required
Available options:
CREATED, DELETED, UPDATEDenum
required
Available options:
ACCOUNT, CREDIT_NOTE, CUSTOMER, INVOICE, ITEM, PAYMENT, SUPPLIER, TAX_RATE
Lexware Office
Lexware Office

Moneybird
Moneybird
If you’re not using the Interactive Authentication Flow, make sure the query parameter
companyId is correctly populated.
You can obtain this value by using the GET Companies endpoint available under the Authentication section.string
required
enum
required
Available options:
CREATED, DELETED, UPDATEDenum
required
Available options:
CONTACT, INVOICE, PAYMENT, TAX_RATE
QuickBooks
QuickBooks
Supported request parameters:
string
required

weclapp
weclapp

Xero
Xero
Supported request parameters:
string
required
Body
application/json
Example:
"https://example.com/webhook-endpoint/12345"
Available options:
ACCOUNT, BANK_ACCOUNT, BILL, CONTACT, CREDIT_NOTE, CUSTOMER, DIMENSION, EXPENSE, INVOICE, ITEM, JOURNAL_ENTRY, OFFER, PAYMENT, SALES_ORDER, SUPPLIER, TAX_RATE, TOKEN Available options:
CREATED, DELETED, REVOKED, UPDATED Last modified on July 9, 2026
Was this page helpful?