Keap REST Hooks API

The REST Hooks API from Keap — 5 operation(s) for rest hooks.

Operations 8

GET /rest/v1/hooks/{key} Retrieve a Hook Subscription #
PUT /rest/v1/hooks/{key} Update a Hook Subscription #
DELETE /rest/v1/hooks/{key} Delete a Hook Subscription #
POST /rest/v1/hooks/{key}/verify Verify a Hook Subscription #
POST /rest/v1/hooks/{key}/delayedVerify Verify a Hook Subscription, Delayed #
GET /rest/v1/hooks List Stored Hook Subscriptions #
POST /rest/v1/hooks Create a Hook Subscription #
GET /rest/v1/hooks/event_keys List Hook Event Types #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/keap-rest-hooks-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

keap-rest-hooks-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Keap REST Hooks API
  version: v1
  contact:
    name: Keap
    url: https://developer.keap.com/get-support
    email: api.keap@thryv.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0
  termsOfService: https://www.thryv.com/terms-of-use
  description: 'Operations tagged REST Hooks across 2 of this provider''s published API definitions: keap-rest-hooks-v1-api-openapi.yml, keap-v1-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.infusionsoft.com/crm
security:
- oauth2: []
tags:
- name: REST Hooks
paths:
  /rest/v1/hooks/{key}:
    get:
      tags:
      - REST Hooks
      summary: Retrieve a Hook Subscription
      description: 'Retrieves an existing hook subscription and its status.


        If your hook subscription becomes inactive, you may request an activation attempt via [Verify a Hook Subscription](#!/REST_Hooks/verify_a_hook_subscription).'
      operationId: retrieve_a_hook_subscription
      parameters:
      - name: key
        in: path
        required: true
        schema:
          type: string
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestHook'
    put:
      tags:
      - REST Hooks
      summary: Update a Hook Subscription
      description: Modify an existing hook subscription using the provided values.
      operationId: update_a_hook_subscription
      parameters:
      - name: key
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RestHookRequest'
        required: true
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestHook'
    delete:
      tags:
      - REST Hooks
      summary: Delete a Hook Subscription
      description: Stop receiving hooks by deleting an existing hook subscription.
      operationId: delete_a_hook_subscription
      parameters:
      - name: key
        in: path
        required: true
        schema:
          type: string
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '204':
          description: No Content
    servers:
    - url: https://api.infusionsoft.com/crm
  /rest/v1/hooks/{key}/verify:
    post:
      tags:
      - REST Hooks
      summary: Verify a Hook Subscription
      description: 'This operation is used to verify or reactivate a hook subscription using RESTHooks.org''s [Immediate Confirmation](http://resthooks.org/docs/security/) pattern.


        To verify or reactivate a hook subscription, Infusionsoft will make a `POST` request with a temporary secret to the `hookUrl` you provided during creation. The secret is passed as the value of a header named `X-Hook-Secret`. Your response to that `POST` *must* have a status code of `200` and return the same `X-Hook-Secret` header and value pair. Once you''ve done that, you''ll begin receiving hooks. Don''t worry if verification fails; you can always [request another verification attempt](#!/REST_Hooks/verify_a_hook_subscription).


        NB: You will not receive events until the subscription is verified.


        If the verification process seems confusing, head over to [RESTHooks.org](http://resthooks.org/docs/security/) for more on the concept.'
      operationId: verify_a_hook_subscription
      parameters:
      - name: key
        in: path
        required: true
        schema:
          type: string
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestHook'
    servers:
    - url: https://api.infusionsoft.com/crm
  /rest/v1/hooks/{key}/delayedVerify:
    post:
      tags:
      - REST Hooks
      summary: Verify a Hook Subscription, Delayed
      description: 'This operation is used to verify or reactivate a hook subscription out-of-band using RESTHooks.org''s [Delayed Confirmation](http://resthooks.org/docs/security/) pattern.


        Use this verification method if you''re not able to use the Immediate Confirmation provided through [Create a Hook Subscription](#!/REST_Hooks/create_a_hook_subscription) or [Verify a Hook Subscription](#!/REST_Hooks/verify_a_hook_subscription). This operation allows you to confirm a subscription by manually sending us the `X-Hook-Secret` you received.


        NB: **The `X-Hook-Secret` _must_ be passed as a _header_.**


        Don''t worry if verification fails; you can always [request another verification attempt](#!/REST_Hooks/verify_a_hook_subscription).


        NB: You will not receive events until the subscription is verified.


        If the verification process seems confusing, head over to [RESTHooks.org](http://resthooks.org/docs/security/) for more on the concept.'
      operationId: verify_a_hook_subscription_delayed
      parameters:
      - name: key
        in: path
        required: true
        schema:
          type: string
      - name: X-Hook-Secret
        in: header
        required: true
        schema:
          type: string
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestHook'
    servers:
    - url: https://api.infusionsoft.com/crm
  /rest/v1/hooks:
    get:
      tags:
      - REST Hooks
      summary: List Stored Hook Subscriptions
      description: Lists your hook subscriptions.
      operationId: list_stored_hook_subscriptions
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RestHook'
    post:
      tags:
      - REST Hooks
      summary: Create a Hook Subscription
      description: 'To receive hooks, you''ll first need to subscribe to events one at a time *and* individually verify each subscription.


        This operation is used to create hook subscriptions. During this process, Infusionsoft will attempt to verify your subscription. Continue reading to learn how that works.


        To verify or reactivate a hook subscription, Infusionsoft will make a `POST` request with a temporary secret to the `hookUrl` you provided during creation. The secret is passed as the value of a header named `X-Hook-Secret`. Your response to that `POST` *must* have a status code of `200` and return the same `X-Hook-Secret` header and value pair. Once you''ve done that, you''ll begin receiving hooks. Don''t worry if verification fails; you can always [request another verification attempt](#!/REST_Hooks/verify_a_hook_subscription).


        NB: You will not receive events until the subscription is verified.


        If the verification process seems confusing, head over to [RESTHooks.org](http://resthooks.org/docs/security/) for more on the concept.'
      operationId: create_a_hook_subscription
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RestHookRequest'
        required: true
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestHook'
    servers:
    - url: https://api.infusionsoft.com/crm
  /rest/v1/hooks/event_keys:
    get:
      tags:
      - REST Hooks
      summary: List Hook Event Types
      description: List the available types of Events that can be listened to
      operationId: list_hook_event_types
      responses:
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '501':
          description: Not Implemented
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '405':
          description: Method Not Allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModelAndView'
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
    servers:
    - url: https://api.infusionsoft.com/crm
components:
  schemas:
    DefaultHttpStatusCode:
      allOf:
      - $ref: '#/components/schemas/HttpStatusCode'
    RestHookRequest:
      type: object
      properties:
        eventKey:
          type: string
        hookUrl:
          type: string
    View:
      type: object
      properties:
        contentType:
          type: string
    ModelAndView:
      type: object
      properties:
        view:
          $ref: '#/components/schemas/View'
        model:
          type: object
          additionalProperties: {}
        status:
          oneOf:
          - $ref: '#/components/schemas/DefaultHttpStatusCode'
          - $ref: '#/components/schemas/HttpStatus'
        modelMap:
          type: object
          additionalProperties: {}
          properties:
            empty:
              type: boolean
        reference:
          type: boolean
        empty:
          type: boolean
        viewName:
          type: string
    RestHook:
      type: object
      properties:
        key:
          type: string
        eventKey:
          type: string
        hookUrl:
          type: string
        status:
          type: string
          enum:
          - Unverified
          - Verified
          - Inactive
    HttpStatus:
      allOf:
      - $ref: '#/components/schemas/HttpStatusCode'
      enum:
      - 100 CONTINUE
      - 101 SWITCHING_PROTOCOLS
      - 102 PROCESSING
      - 103 EARLY_HINTS
      - 200 OK
      - 201 CREATED
      - 202 ACCEPTED
      - 203 NON_AUTHORITATIVE_INFORMATION
      - 204 NO_CONTENT
      - 205 RESET_CONTENT
      - 206 PARTIAL_CONTENT
      - 207 MULTI_STATUS
      - 208 ALREADY_REPORTED
      - 226 IM_USED
      - 300 MULTIPLE_CHOICES
      - 301 MOVED_PERMANENTLY
      - 302 FOUND
      - 303 SEE_OTHER
      - 304 NOT_MODIFIED
      - 307 TEMPORARY_REDIRECT
      - 308 PERMANENT_REDIRECT
      - 400 BAD_REQUEST
      - 401 UNAUTHORIZED
      - 402 PAYMENT_REQUIRED
      - 403 FORBIDDEN
      - 404 NOT_FOUND
      - 405 METHOD_NOT_ALLOWED
      - 406 NOT_ACCEPTABLE
      - 407 PROXY_AUTHENTICATION_REQUIRED
      - 408 REQUEST_TIMEOUT
      - 409 CONFLICT
      - 410 GONE
      - 411 LENGTH_REQUIRED
      - 412 PRECONDITION_FAILED
      - 413 CONTENT_TOO_LARGE
      - 413 PAYLOAD_TOO_LARGE
      - 414 URI_TOO_LONG
      - 415 UNSUPPORTED_MEDIA_TYPE
      - 416 REQUESTED_RANGE_NOT_SATISFIABLE
      - 417 EXPECTATION_FAILED
      - 418 I_AM_A_TEAPOT
      - 421 MISDIRECTED_REQUEST
      - 422 UNPROCESSABLE_CONTENT
      - 422 UNPROCESSABLE_ENTITY
      - 423 LOCKED
      - 424 FAILED_DEPENDENCY
      - 425 TOO_EARLY
      - 426 UPGRADE_REQUIRED
      - 428 PRECONDITION_REQUIRED
      - 429 TOO_MANY_REQUESTS
      - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
      - 451 UNAVAILABLE_FOR_LEGAL_REASONS
      - 500 INTERNAL_SERVER_ERROR
      - 501 NOT_IMPLEMENTED
      - 502 BAD_GATEWAY
      - 503 SERVICE_UNAVAILABLE
      - 504 GATEWAY_TIMEOUT
      - 505 HTTP_VERSION_NOT_SUPPORTED
      - 506 VARIANT_ALSO_NEGOTIATES
      - 507 INSUFFICIENT_STORAGE
      - 508 LOOP_DETECTED
      - 509 BANDWIDTH_LIMIT_EXCEEDED
      - 510 NOT_EXTENDED
      - 511 NETWORK_AUTHENTICATION_REQUIRED
    HttpStatusCode:
      type: object
      properties:
        error:
          type: boolean
        is1xxInformational:
          type: boolean
        is2xxSuccessful:
          type: boolean
        is3xxRedirection:
          type: boolean
        is4xxClientError:
          type: boolean
        is5xxServerError:
          type: boolean
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://accounts.infusionsoft.com/app/oauth/authorize
          tokenUrl: https://api.infusionsoft.com/token
          scopes: {}
x-refined-from:
- keap-rest-hooks-v1-api-openapi.yml
- keap-v1-openapi.json