Infusionsoft (Keap) · AsyncAPI Specification

Infusionsoft Rest Hooks Webhooks

Version

View Spec View on GitHub CRMMarketing AutomationSales AutomationEmail MarketingE-CommerceSmall BusinessContactsSubscriptionWebhookAuthenticationAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-13'
method: searched
source: https://developer.keap.com/rest-hook-documentation/ + openapi/infusionsoft-rest-v1-openapi.json
  (REST Hooks tag)
docs: https://developer.keap.com/rest-hook-documentation/
style: REST Hooks (subscription webhooks managed as a REST resource)
asyncapi_published: false
note: Keap publishes no AsyncAPI. Its event surface is REST Hooks, and it lives ONLY on REST v1 - there
  are eight hook operations under /rest/v1/hooks and zero hook operations anywhere in the 399-operation
  v2 spec. An integration on v2 must still reach back into v1 to subscribe to events. The event key catalogue
  is not published as a static list; it is retrieved at runtime from GET /rest/v1/hooks/event_keys, which
  requires authentication, so only the two event keys named in the docs are recorded here as verified
  examples rather than a complete enumeration.
subscription_api:
  base: https://api.infusionsoft.com/crm/rest/v1
  spec: openapi/infusionsoft-rest-v1-openapi.json
  operations:
  - operationId: list_hook_event_types
    method: GET
    path: /rest/v1/hooks/event_keys
    purpose: Retrieve the live catalogue of subscribable event keys for this application instance.
  - operationId: create_a_hook_subscription
    method: POST
    path: /rest/v1/hooks
    purpose: Subscribe a hookUrl to an eventKey. Body is {eventKey, hookUrl}.
  - operationId: list_stored_hook_subscriptions
    method: GET
    path: /rest/v1/hooks
    purpose: List current subscriptions.
  - operationId: retrieve_a_hook_subscription
    method: GET
    path: /rest/v1/hooks/{key}
    purpose: Read one subscription.
  - operationId: update_a_hook_subscription
    method: PUT
    path: /rest/v1/hooks/{key}
    purpose: Change the eventKey or hookUrl of a subscription.
  - operationId: delete_a_hook_subscription
    method: DELETE
    path: /rest/v1/hooks/{key}
    purpose: Unsubscribe.
  - operationId: verify_a_hook_subscription
    method: POST
    path: /rest/v1/hooks/{key}/verify
    purpose: Activate a subscription, or reactivate one Keap marked Inactive after four failed deliveries.
  - operationId: verify_a_hook_subscription_delayed
    method: POST
    path: /rest/v1/hooks/{key}/delayedVerify
    purpose: Delayed variant of the verification handshake.
subscription_model:
  schema:
    key: string
    eventKey: string
    hookUrl: string
    status: Unverified | Verified | Inactive
  source: '#/components/schemas/RestHook in openapi/infusionsoft-rest-v1-openapi.json'
  note: Events are delivered ONLY while status is Verified.
delivery:
  batched: true
  max_objects_per_event: 1000
  payload:
    event_key: <event key>
    object_type: <resource name>
    object_keys:
    - id: <resource object id>
      apiUrl: <REST API URL for the resource, may be present>
      timestamp: <event timestamp>
  note: The payload carries ids and a fetch URL, not the changed object - the receiver must call back
    into the REST API to read state.
retries:
  attempts: 4
  schedule:
  - attempt: 1
    delay: 30-60 seconds after the originating change (5-10 minutes for contactGroup.applied and contactGroup.delete)
  - attempt: 2
    delay: 30-60 seconds after the prior failure
  - attempt: 3
    delay: 5 minutes after the prior failure
  - attempt: 4
    delay: 30 minutes after the prior failure
  failure_conditions:
  - receiver does not respond within 30 seconds
  - receiver responds with a status code <200 or >=400, except 410
  terminal: After a fourth failure the subscription is marked Inactive and must be reactivated via /verify.
    A 410 from the receiver marks the subscription Inactive immediately.
security:
  signing: false
  shared_secret: false
  note: Keap documents no HMAC signature header, no X-Hook-Secret handshake and no shared secret on delivery.
    Receiver authenticity rests on the /verify handshake and the secrecy of the hookUrl alone - a receiver
    cannot cryptographically verify that a delivery came from Keap.
events:
- event_key: contactGroup.applied
  object_type: contactGroup
  verified: true
  source: https://developer.keap.com/rest-hook-documentation/
  note: Named in the retry policy as having a 5-10 minute first-attempt window.
- event_key: contactGroup.delete
  object_type: contactGroup
  verified: true
  source: https://developer.keap.com/rest-hook-documentation/
  note: Named in the retry policy as having a 5-10 minute first-attempt window.
event_key_naming: resource.action
event_catalog_complete: false
event_catalog_source: GET /rest/v1/hooks/event_keys (authenticated)