curl --request POST \
--url https://app.hookie.ai/portal/api/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Prod receiver",
"url": "https://hooks.acme.test/in",
"dataset_filter": [
"orders"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Prod receiver',
url: 'https://hooks.acme.test/in',
dataset_filter: ['orders']
})
};
fetch('https://app.hookie.ai/portal/api/destinations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.hookie.ai/portal/api/destinations"
payload = {
"name": "Prod receiver",
"url": "https://hooks.acme.test/in",
"dataset_filter": ["orders"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "9c1f…",
"signing_secret": "whsec_0a1b…"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>"
}Create a destination for this customer
curl --request POST \
--url https://app.hookie.ai/portal/api/destinations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Prod receiver",
"url": "https://hooks.acme.test/in",
"dataset_filter": [
"orders"
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Prod receiver',
url: 'https://hooks.acme.test/in',
dataset_filter: ['orders']
})
};
fetch('https://app.hookie.ai/portal/api/destinations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.hookie.ai/portal/api/destinations"
payload = {
"name": "Prod receiver",
"url": "https://hooks.acme.test/in",
"dataset_filter": ["orders"]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "9c1f…",
"signing_secret": "whsec_0a1b…"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>"
}{
"error": "<string>",
"retry_after": 123,
"upgrade_url": "<string>"
}Authorizations
A hpt_… customer portal token, as Authorization: Bearer. Stored hashed; shown once at issue.
Query Parameters
Portal access token (hpt_…), as an alternative to the Authorization: Bearer header.
Body
Only name, url and dataset_filter are customer-settable. Every other column is server-controlled and cannot be influenced by the request: secret (generated, whsec_ + 48 hex, AES-GCM encrypted at rest), enabled (always 1 on create), created_by (always "portal:<customer_id>"), tenant_id, project_id, portal_id, customer_id (all taken from the token), event_filter (never set) and created_at. Unknown properties in the body are ignored, not rejected.
Must be a non-empty string after trimming; stored trimmed.
1Must start with https:// (case-insensitive). No further URL validation is performed and the value is stored verbatim (not trimmed).
^[Hh][Tt][Tt][Pp][Ss]://Optional subset of the portal's exposed event types. Non-string entries are dropped before validation. Every remaining entry must appear in the portal's event_types or the request is rejected. If omitted or empty: defaults to the portal's full event_types list, or null (all datasets) when the portal exposes none.