Skip to main content

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.
info

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 objects
    • pagination - 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:

  1. Uses either the Client ID from Connect or direct credentials
  2. Validates the Organization URL is provided
  3. Optionally filters by User URL if specified
  4. Makes a GET request to /webhook_subscriptions endpoint
  5. 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 collection array 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_at field 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 state field for disabled webhooks
    • Monitor retry_started_at for failing webhooks
    • Alert on webhooks that have been retrying for extended periods
  • 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

  1. Webhook Auditing

    • Generate reports of all active webhooks
    • Verify webhooks are properly configured
    • Ensure no duplicate subscriptions exist
  2. Cleanup Operations

    • Find and remove unused webhooks
    • Delete webhooks for deprecated systems
    • Clean up test webhooks after development
  3. Health Monitoring

    • Identify failing webhooks needing attention
    • Alert on webhooks in retry state
    • Monitor webhook delivery success rates
  4. Disaster Recovery

    • Backup webhook configurations
    • Document active integrations
    • Enable quick restoration after incidents
  5. Security Audits

    • Verify all webhook URLs are authorized
    • Detect unauthorized webhook subscriptions
    • Ensure compliance with security policies
  6. 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_page exists
  • Make subsequent requests with the page token
  • Continue until next_page is 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