Complete API reference for webhook CRUD operations - create, list, get, update, and delete webhooks programmatically.
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/webhooks | Create a new webhook |
| GET | /api/v1/webhooks | List all webhooks |
| GET | /api/v1/webhooks/{webhookId} | Get webhook details |
| PUT | /api/v1/webhooks/{webhookId} | Update a webhook |
| DELETE | /api/v1/webhooks/{webhookId} | Delete a webhook |
Create a new webhook configuration.
POST /api/v1/webhooks
Headers:
Authorization: Bearer {access_token} (required)Content-Type: application/json (required)Body Parameters:
Prop
Type
Description
urlstring (URI)HTTPS endpoint URL where webhook notifications will be sent. Must be publicly accessible and use HTTPS.
methodstring (enum)HTTP method for delivery. Values: `post` (recommended), `put`
statusstring (enum)Initial webhook status. Values: `active`, `inactive`, `archived`
eventsarray<string>Array of event names to subscribe to. Must contain at least 1 event.
secret?string (UUID)Optional secret for HMAC-SHA256 signing. Auto-generated if omitted.
notificationEmail?string (email)Email address for delivery failure notifications.
isIntegrationOnly?booleanWhether webhook is restricted to API-only access.
webhookAttribute?objectCustom headers and legacy field mappings.
curl -X POST https://api-sandbox.fndev.net/api/v1/webhooks \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-endpoint.com/webhooks",
"method": "post",
"status": "active",
"events": [
"workorder.status.published",
"workorder.status.assigned",
"workorder.status.work_done",
"workorder.status.approved"
],
"notificationEmail": "webhook-alerts@example.com",
"webhookAttribute": {
"header": {
"Authorization": "Bearer your-api-token",
"X-Custom-ID": "prod-webhook-001"
}
}
}'Status: 200 OK
{
"metadata": {
"timestamp": "2026-01-15T10:30:00Z"
},
"result": {
"id": 123,
"webhookId": "wh_abc123def456",
"companyId": 789,
"userId": 456,
"url": "https://your-endpoint.com/webhooks",
"method": "post",
"status": "active",
"secret": "01999f51-5c66-4449-b441-6b4a053fee6a",
"events": [
"workorder.status.published",
"workorder.status.assigned",
"workorder.status.work_done",
"workorder.status.approved"
],
"notificationEmail": "webhook-alerts@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-15T10:30:00Z",
"updatedAt": "2026-01-15T10:30:00Z"
}
}Save the secret! The secret field is only returned during creation. Store it securely for signature verification.
Retrieve a paginated list of webhooks.
GET /api/v1/webhooks
Headers:
Authorization: Bearer {access_token} (required)Query Parameters:
Prop
Type
Description
page?numberPage number (starts at 1)
perPage?numberItems per page
status?string (enum)Filter by status: `active`, `inactive`, `archived`
webhookId?stringFilter by specific webhook ID
search?stringSearch query across webhook fields
sortBy?stringField to sort by: `id`, `webhookId`, `createdAt`, `updatedAt`
sortDirection?string (enum)Sort direction: `ASC`, `DESC`
fields?stringComma-separated list of fields to include
curl -X GET "https://api-sandbox.fndev.net/api/v1/webhooks" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"curl -X GET "https://api-sandbox.fndev.net/api/v1/webhooks?status=active" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"curl -X GET "https://api-sandbox.fndev.net/api/v1/webhooks?search=production&sortBy=createdAt&sortDirection=DESC" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"curl -X GET "https://api-sandbox.fndev.net/api/v1/webhooks?fields=id,webhookId,url,status,events" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"Status: 200 OK
{
"metadata": {
"timestamp": "2026-01-15T11:00:00Z",
"count": 2,
"total": 2
},
"result": [
{
"id": 123,
"webhookId": "wh_abc123",
"companyId": 789,
"userId": 456,
"url": "https://your-endpoint.com/webhooks",
"method": "post",
"status": "active",
"secret": "01999f51-5c66-4449-b441-6b4a053fee6a",
"events": ["workorder.status.published", "workorder.status.assigned"],
"notificationEmail": "alerts@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-15T10:00:00Z"
},
{
"id": 124,
"webhookId": "wh_def456",
"companyId": 789,
"userId": 456,
"url": "https://staging.example.com/webhooks",
"method": "post",
"status": "inactive",
"secret": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"events": ["workorder.status.work_done"],
"notificationEmail": "staging@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-14T15:00:00Z",
"updatedAt": "2026-01-15T09:00:00Z"
}
]
}Retrieve detailed information about a specific webhook.
GET /api/v1/webhooks/{webhookId}
Headers:
Authorization: Bearer {access_token} (required)Path Parameters:
webhookId (string, required): Unique webhook identifierQuery Parameters:
Prop
Type
Description
fields?stringComma-separated list of fields to include
webhookAttribute?stringInclude attributes: `header`, `legacy_field`. Comma-separated.
curl -X GET https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"curl -X GET "https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123?webhookAttribute=header" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"Status: 200 OK
{
"metadata": {
"timestamp": "2026-01-15T11:00:00Z"
},
"result": {
"id": 123,
"webhookId": "wh_abc123",
"companyId": 789,
"userId": 456,
"url": "https://your-endpoint.com/webhooks",
"method": "post",
"status": "active",
"secret": "01999f51-5c66-4449-b441-6b4a053fee6a",
"events": [
"workorder.status.published",
"workorder.status.assigned"
],
"notificationEmail": "alerts@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-15T10:30:00Z"
}
}Update an existing webhook configuration. Only include fields you want to change.
PUT /api/v1/webhooks/{webhookId}
Headers:
Authorization: Bearer {access_token} (required)Content-Type: application/json (required)Path Parameters:
webhookId (string, required): Unique webhook identifierBody Parameters (all optional):
Prop
Type
Description
url?string (URI)Updated HTTPS endpoint URL
method?string (enum)Updated HTTP method: `post`, `put`
status?string (enum)Updated status: `active`, `inactive`, `archived`
events?array<string>Updated array of event names (replaces existing list)
secret?string (UUID)Updated secret for signature verification
notificationEmail?string (email)Updated notification email
webhookAttribute?objectUpdated custom headers
curl -X PUT https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://new-endpoint.com/webhooks"
}'curl -X PUT https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "inactive"
}'curl -X PUT https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"events": [
"workorder.status.published",
"workorder.status.assigned",
"workorder.status.work_done",
"workorder.status.approved"
]
}'curl -X PUT https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"webhookAttribute": {
"header": {
"X-Environment": "production",
"X-Version": "v2"
}
}
}'Status: 200 OK
{
"metadata": {
"timestamp": "2026-01-15T11:30:00Z"
},
"result": {
"id": 123,
"webhookId": "wh_abc123",
"companyId": 789,
"userId": 456,
"url": "https://new-endpoint.com/webhooks",
"method": "post",
"status": "active",
"secret": "01999f51-5c66-4449-b441-6b4a053fee6a",
"events": [
"workorder.status.published",
"workorder.status.assigned"
],
"notificationEmail": "alerts@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-15T11:30:00Z"
}
}Permanently delete a webhook configuration. Delivery logs are preserved.
DELETE /api/v1/webhooks/{webhookId}
Headers:
Authorization: Bearer {access_token} (required)Path Parameters:
webhookId (string, required): Unique webhook identifiercurl -X DELETE https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"Status: 200 OK
{
"metadata": {
"timestamp": "2026-01-15T12:00:00Z"
},
"result": {
"id": 123,
"webhookId": "wh_abc123",
"companyId": 789,
"userId": 456,
"url": "https://your-endpoint.com/webhooks",
"method": "post",
"status": "active",
"secret": "01999f51-5c66-4449-b441-6b4a053fee6a",
"events": ["workorder.status.published"],
"notificationEmail": "alerts@example.com",
"modelProperties": [],
"isIntegrationOnly": false,
"createdAt": "2026-01-15T10:00:00Z",
"updatedAt": "2026-01-15T10:00:00Z"
}
}Irreversible: Deleted webhooks cannot be recovered. Consider archiving (status: "archived") instead if you want to preserve the configuration.
Remove a specific custom header or legacy field mapping.
DELETE /api/v1/webhooks/{webhookId}/{attributeType}/{attributeName}
Headers:
Authorization: Bearer {access_token} (required)Path Parameters:
webhookId (string, required): Unique webhook identifierattributeType (string, required): Type of attribute: header, legacy_fieldattributeName (string, required): Name of the attribute to delete# Delete custom header
curl -X DELETE https://api-sandbox.fndev.net/api/v1/webhooks/wh_abc123/header/X-Custom-ID \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"Status: 200 OK
{
"message": "Webhook attribute successfully removed"
}{
"metadata": {
"timestamp": "2026-01-15T12:00:00Z",
"path": "/api/v1/webhooks"
},
"errors": [
{
"code": 400,
"message": "Invalid request: 'url' must be a valid HTTPS URL"
}
],
"result": {}
}{
"metadata": {
"timestamp": "2026-01-15T12:00:00Z",
"path": "/api/v1/webhooks"
},
"errors": [
{
"code": 401,
"message": "Invalid or expired access token"
}
],
"result": {}
}{
"metadata": {
"timestamp": "2026-01-15T12:00:00Z",
"path": "/api/v1/webhooks/wh_invalid"
},
"errors": [
{
"code": 404,
"message": "Webhook not found"
}
],
"result": {}
}class WebhookManager {
constructor(accessToken) {
this.accessToken = accessToken;
this.baseUrl = 'https://api-sandbox.fndev.net';
}
async create(config) {
const response = await fetch(`${this.baseUrl}/api/v1/webhooks`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(config)
});
return await response.json();
}
async list(filters = {}) {
const params = new URLSearchParams(filters);
const response = await fetch(
`${this.baseUrl}/api/v1/webhooks?${params}`,
{
headers: { 'Authorization': `Bearer ${this.accessToken}` }
}
);
return await response.json();
}
async get(webhookId) {
const response = await fetch(
`${this.baseUrl}/api/v1/webhooks/${webhookId}`,
{
headers: { 'Authorization': `Bearer ${this.accessToken}` }
}
);
return await response.json();
}
async update(webhookId, updates) {
const response = await fetch(
`${this.baseUrl}/api/v1/webhooks/${webhookId}`,
{
method: 'PUT',
headers: {
'Authorization': `Bearer ${this.accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(updates)
}
);
return await response.json();
}
async delete(webhookId) {
const response = await fetch(
`${this.baseUrl}/api/v1/webhooks/${webhookId}`,
{
method: 'DELETE',
headers: { 'Authorization': `Bearer ${this.accessToken}` }
}
);
return await response.json();
}
}
// Usage
const manager = new WebhookManager(accessToken);
// Create
const webhook = await manager.create({
url: 'https://example.com/webhooks',
method: 'post',
status: 'active',
events: ['workorder.status.published']
});
// List
const webhooks = await manager.list({ status: 'active' });
// Get
const details = await manager.get('wh_abc123');
// Update
const updated = await manager.update('wh_abc123', {
status: 'inactive'
});
// Delete
const deleted = await manager.delete('wh_abc123');Last updated on