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