List Webhook Subscriptions
Retrieves all webhook subscriptions configured for a Calendly organization or specific user, including their URLs, events, and status information.
Common Properties
- Name - The custom name of the node.
- Color - The custom color of the node.
- Delay Before (sec) - Waits in seconds before executing the node.
- Delay After (sec) - Waits in seconds after executing node.
- Continue On Error - Automation will continue regardless of any error. The default value is false.
If the ContinueOnError property is true, no error is caught when the project is executed, even if a Catch node is used.
Inputs
-
Client Id - (Optional) The unique client identifier returned by the Connect node. If not provided, you must supply Credentials directly.
-
Organization Url - (Required) The Calendly organization URL (URI) to list subscriptions for. Format:
https://api.calendly.com/organizations/XXXXXXXXXX
Options
-
Credentials - (Optional) Calendly API Token credential for direct authentication. Use this if you're not using the Connect/Disconnect pattern.
-
User Url - (Optional) A specific user URL to filter subscriptions. If provided, only returns webhooks scoped to this user. Format:
https://api.calendly.com/users/XXXXXXXXXX
Output
- Result - An object containing the list of webhook subscriptions with pagination information:
collection- Array of webhook subscription objectspagination- Pagination metadata (count, next_page, etc.)
Each subscription object includes:
- Webhook subscription URI and unique ID
- Callback URL where events are sent
- List of subscribed events
- Organization and user scope
- State (active/disabled)
- Creation and update timestamps
- Retry information
How It Works
The List Webhook Subscriptions node retrieves all active webhook configurations for an organization or user. This is useful for auditing, managing, and troubleshooting webhook integrations.
When executed, the node:
- Uses either the Client ID from Connect or direct credentials
- Validates the Organization URL is provided
- Optionally filters by User URL if specified
- Makes a GET request to
/webhook_subscriptionsendpoint - Returns a paginated list of all matching subscriptions
Requirements
- A valid Calendly organization URL (get from Get Me node)
- For user-scoped filtering: A valid user URL
- Appropriate permissions to view webhook subscriptions
Getting Organization URL
Obtain your organization URL from the Get Me node:
{{result.resource.current_organization}}
Response Structure
The Result output contains:
{
"collection": [
{
"uri": "https://api.calendly.com/webhook_subscriptions/XXXXXXXXXX",
"callback_url": "https://myapp.com/webhooks/calendly",
"created_at": "2024-11-15T10:30:00.000000Z",
"updated_at": "2024-11-15T10:30:00.000000Z",
"retry_started_at": null,
"state": "active",
"events": ["invitee.created", "invitee.canceled"],
"scope": "organization",
"organization": "https://api.calendly.com/organizations/BBBBBBBBBBBBBBBB",
"user": null,
"creator": "https://api.calendly.com/users/AAAAAAAAAAAAAAAA"
},
{
"uri": "https://api.calendly.com/webhook_subscriptions/YYYYYYYYYY",
"callback_url": "https://crm.company.com/calendly",
"created_at": "2024-11-20T14:00:00.000000Z",
"updated_at": "2024-11-20T14:00:00.000000Z",
"retry_started_at": null,
"state": "active",
"events": ["invitee.created"],
"scope": "user",
"organization": "https://api.calendly.com/organizations/BBBBBBBBBBBBBBBB",
"user": "https://api.calendly.com/users/CCCCCCCCCCCCCCCC",
"creator": "https://api.calendly.com/users/CCCCCCCCCCCCCCCC"
}
],
"pagination": {
"count": 2,
"next_page": null,
"previous_page": null,
"next_page_token": null,
"previous_page_token": null
}
}
Error Handling
The node will return specific errors in the following cases:
ErrInvalidArg
- Organization URL is empty or missing
- Solution: Provide a valid organization URL
ErrInternal
- Network error connecting to Calendly API
- Organization URL is invalid or inaccessible
- API authentication failed
- User URL is invalid (if provided)
- Solution: Verify URLs and credentials
Usage Examples
Example 1: List All Organization Webhooks
[Start]
-> [Calendly Connect] (outputs: client_id)
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [Log] (message: "Found {{subscriptions.pagination.count}} webhooks")
-> [For Each] (iterate: {{subscriptions.collection}})
-> [Log] (message: "Webhook URL: {{item.callback_url}}")
-> [Disconnect]
-> [End]
Example 2: List User-Scoped Webhooks
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
- User Url: {{result.resource.uri}}
(outputs: subscriptions)
-> [Log] (message: "User has {{subscriptions.pagination.count}} webhooks")
-> [Disconnect]
-> [End]
Example 3: Audit Active Webhooks
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [For Each] (iterate: {{subscriptions.collection}})
-> [Create Report Row]
- Webhook ID: {{item.uri.split('/').pop()}}
- URL: {{item.callback_url}}
- Events: {{item.events.join(', ')}}
- State: {{item.state}}
- Created: {{item.created_at}}
-> [Export to CSV] (filename: "webhook_audit.csv")
-> [Disconnect]
-> [End]
Example 4: Find and Delete Inactive Webhooks
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [For Each] (iterate: {{subscriptions.collection}})
-> [If] (condition: {{item.state}} == "disabled")
-> [Extract ID]
- webhook_id = item.uri.split('/').pop()
-> [Delete Webhook Subscription]
- Webhook Id: {{webhook_id}}
-> [Log] (message: "Deleted inactive webhook: {{item.callback_url}}")
-> [Disconnect]
-> [End]
Example 5: Monitor Webhook Health
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [For Each] (iterate: {{subscriptions.collection}})
-> [If] (condition: {{item.retry_started_at}} != null)
-> [Send Alert]
- Message: "Webhook failing: {{item.callback_url}}"
- Details: "Retries started at {{item.retry_started_at}}"
-> [Disconnect]
-> [End]
Example 6: Check for Duplicate Webhooks
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [Initialize] (seen_urls = [])
-> [For Each] (iterate: {{subscriptions.collection}})
-> [If] (condition: seen_urls.includes(item.callback_url))
-> [Log] (message: "Duplicate webhook found: {{item.callback_url}}")
-> [Extract ID and Delete]
-> [Else]
-> [Array Add] (seen_urls.push(item.callback_url))
-> [Disconnect]
-> [End]
Example 7: Webhook Configuration Backup
[Start]
-> [Calendly Connect]
-> [Get Me] (outputs: result)
-> [List Webhook Subscriptions]
- Organization Url: {{result.resource.current_organization}}
(outputs: subscriptions)
-> [Save to File]
- Filename: "webhook_backup_{{date}}.json"
- Content: {{JSON.stringify(subscriptions)}}
-> [Upload to Cloud Storage]
-> [Disconnect]
-> [End]
Usage Notes
- Returns all webhooks for the organization or filtered by user
- The
collectionarray may be empty if no webhooks exist - Pagination is supported for large numbers of webhooks (over 100)
- User-scoped filtering requires providing the User URL
- Both active and disabled webhooks are returned
- The
retry_started_atfield indicates if a webhook is failing
Best Practices
-
Regular Audits
- Periodically list webhooks to ensure only necessary ones are active
- Monitor for duplicate or misconfigured webhooks
- Clean up test/development webhooks
-
Health Monitoring
- Check
statefield for disabled webhooks - Monitor
retry_started_atfor failing webhooks - Alert on webhooks that have been retrying for extended periods
- Check
-
Documentation
- Export webhook configurations for documentation
- Track which webhooks are used by which systems
- Document the purpose of each webhook URL
-
Security
- Verify all webhook URLs are legitimate
- Check for unexpected webhooks that might indicate compromise
- Ensure HTTPS is used for all callbacks
-
Automation
- Automate webhook auditing and reporting
- Create dashboards showing webhook status
- Implement alerting for webhook failures
Common Use Cases
-
Webhook Auditing
- Generate reports of all active webhooks
- Verify webhooks are properly configured
- Ensure no duplicate subscriptions exist
-
Cleanup Operations
- Find and remove unused webhooks
- Delete webhooks for deprecated systems
- Clean up test webhooks after development
-
Health Monitoring
- Identify failing webhooks needing attention
- Alert on webhooks in retry state
- Monitor webhook delivery success rates
-
Disaster Recovery
- Backup webhook configurations
- Document active integrations
- Enable quick restoration after incidents
-
Security Audits
- Verify all webhook URLs are authorized
- Detect unauthorized webhook subscriptions
- Ensure compliance with security policies
-
Migration Planning
- List webhooks before system changes
- Plan webhook updates during migrations
- Verify webhooks after infrastructure changes
Accessing Subscription Data
Access specific fields in subsequent nodes:
// Total number of webhooks
{{subscriptions.pagination.count}}
// Iterate through all webhooks
{{subscriptions.collection}}
// First webhook's callback URL
{{subscriptions.collection[0].callback_url}}
// Extract webhook IDs
{{subscriptions.collection.map(item => item.uri.split('/').pop())}}
// Filter by state
{{subscriptions.collection.filter(item => item.state === 'active')}}
// Check if any webhooks are failing
{{subscriptions.collection.some(item => item.retry_started_at !== null)}}
Webhook States
active
- Webhook is functioning normally
- Events are being delivered successfully
disabled
- Webhook has been disabled (manual or automatic)
- No events are being sent
- Often occurs after repeated delivery failures
Pagination
For organizations with many webhooks:
{
"pagination": {
"count": 15,
"next_page": "https://api.calendly.com/webhook_subscriptions?page_token=ABC123",
"next_page_token": "ABC123"
}
}
Handle pagination in flows to retrieve all webhooks:
- Check if
next_pageexists - Make subsequent requests with the page token
- Continue until
next_pageis null
Rate Limits
Listing webhook subscriptions counts toward API rate limits:
- Each list request = 1 API request
- Standard accounts: 100 requests/minute
- Consider caching results if listing frequently
Troubleshooting
Empty Collection
- No webhooks have been created for the organization
- User filter is too restrictive
- Organization URL is incorrect
403 Forbidden
- API token doesn't have permission to list webhooks
- Organization URL belongs to different organization
Invalid Organization URL
- Ensure format is correct:
https://api.calendly.com/organizations/... - Get URL from Get Me node result