Keap Automation API
Keap Automation API — 10 operations across 9 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
Keap Automation API — 10 operations across 9 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/keap-automation-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: 3.2.0
info:
title: Keap Automation API
description: Keap Public API Documentation
termsOfService: https://www.thryv.com/terms-of-use
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
version: v2
servers:
- url: https://api.infusionsoft.com/crm
security:
- oauth2: []
tags:
- name: Automation
paths:
/rest/v2/automations/{automation_id}/unpublish:
put:
tags:
- Automation
summary: Unpublish an Automation
description: Unpublishes a single automation
operationId: unpublishAutomation
parameters:
- name: automation_id
in: path
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UnpublishAutomationRequest'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
/rest/v2/automations/{automation_id}/sequences/{sequence_id}:addContacts:
post:
tags:
- Automation
summary: Add Contacts to an Automation Sequence
description: 'Adds a list of contacts to an automation sequence
Response contains a map of the provided list of Contact Ids and their individual result.'
operationId: addContactsToAutomationSequence
parameters:
- name: automation_id
in: path
required: true
schema:
type: string
- name: sequence_id
in: path
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AddToAutomationSequenceRequest'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/AddToAutomationSequenceResponse'
/rest/v2/automations/goals/achieve:
post:
tags:
- Automation
summary: Achieve an Automation Goal
description: Achieves a goal in an automation for a contact
operationId: achieveGoal
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AchieveGoalRequest'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/AchieveGoalResponse'
/rest/v2/automations/categories/batchAssign:
post:
tags:
- Automation
summary: Bulk update for Automations Categories
description: Bulk updates the categories of one or more automations
operationId: bulkAssignmentAutomationsCategories
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AssignAutomationCategoryRequest'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
/rest/v2/automations/batch-unpublish:
post:
tags:
- Automation
summary: Bulk unpublish Automations
description: Bulk unpublish one or more automations
operationId: bulkUnpublishAutomations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BatchUnpublishAutomationRequest'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
/rest/v2/easy-automations/{automation_id}:
patch:
tags:
- Automation
summary: Renames an Easy Automation.
description: Updates the name of a single easy automation.
operationId: renameAutomationV2
parameters:
- name: automation_id
in: path
description: automation_id
required: true
schema:
type: string
example: HWv0fbDNDbWg6cFKY027
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/RenameEasyAutomationCommand'
required: true
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'204':
description: No Content
/rest/v2/automations:
get:
tags:
- Automation
summary: List Automations
description: Retrieves a list of automations
operationId: listAutomations
parameters:
- name: filter
in: query
description: "Filter to apply, allowed fields are:\n\n- `name` (String): Filter by automation name. Supports the `==` operator with optional prefix wildcard (`foo*`).\n Without a wildcard, the search matches automations whose name contains the given text.\n With a prefix wildcard, it matches automations whose name starts with the given text.\n - `filter=name%3D%3DSpring Automation` — names containing \"Spring Automation\"\n - `filter=name%3D%3DSpring*` — names starting with \"Spring\"\n\n- `id` (Long): Filter by automation ID. Supports comparison operators:\n `==` `!=` `>` `<` `>=` `<=`\n - `filter=id%3E5` — id > 5\n - `filter=id%3E%3D10` — id >= 10\n\n- `status` (String): Filter by automation status. Accepted values: `published`, `draft`.\n - `filter=status%3D%3Dpublished` — published automations only\n - `filter=status%3D%3Ddraft` — draft automations only\n\n- `categories` (String): Filter by category ID (comma-separated list of IDs).\n - `filter=categories%3D%3D1` — automations in category 1\n - `filter=categories%3D%3D1,2,3` — automations in categories 1, 2, or 3\n\nMultiple filters can be combined with `;` (AND logic):\n- `filter=name%3D%3DSpring*%3Bautomation_id%3E5`\n"
required: false
schema:
type: string
- name: page_token
in: query
description: Page token
required: false
schema:
type: string
- name: order_by
in: query
description: 'Attribute and direction to order items.
One of the following fields:
- `name`
- `category`
- `activeContacts`
- `publishedDate`
One of the following directions:
- `asc`
- `desc`'
required: false
schema:
type: string
- name: page_size
in: query
description: Total number of items to return per page
required: false
schema:
type: integer
format: int32
maximum: 25
minimum: 0
example: 0
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ListAutomationResponse'
delete:
tags:
- Automation
summary: Delete an Automation
description: Deletes a single automation
operationId: deleteAutomation
parameters:
- name: automation_ids
in: query
required: true
schema:
type: array
items:
type: integer
format: int64
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'204':
description: No Content
/rest/v2/automations/{automation_id}:
get:
tags:
- Automation
summary: Retrieve an Automation
description: Retrieves a single automation
operationId: getAutomation
parameters:
- name: automation_id
in: path
required: true
schema:
type: string
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/Automation'
/rest/v2/automations/ids:
get:
tags:
- Automation
summary: List Automations Ids
description: Retrieves a list of automations IDs
operationId: listAllAutomationIds
parameters:
- name: filter
in: query
description: "Filter to apply, allowed fields are:\n\n- `name` (String): Filter by automation name. Supports the `==` operator with optional prefix wildcard (`foo*`).\n Without a wildcard, the search matches automations whose name contains the given text.\n With a prefix wildcard, it matches automations whose name starts with the given text.\n - `filter=name%3D%3DSpring Automation` — names containing \"Spring Automation\"\n - `filter=name%3D%3DSpring*` — names starting with \"Spring\"\n\n- `id` (Long): Filter by automation ID. Supports comparison operators:\n `==` `!=` `>` `<` `>=` `<=`\n - `filter=id%3E5` — id > 5\n - `filter=id%3E%3D10` — id >= 10\n\n- `status` (String): Filter by automation status. Accepted values: `published`, `draft`.\n - `filter=status%3D%3Dpublished` — published automations only\n - `filter=status%3D%3Ddraft` — draft automations only\n\n- `categories` (String): Filter by category ID (comma-separated list of IDs).\n - `filter=categories%3D%3D1` — automations in category 1\n - `filter=categories%3D%3D1,2,3` — automations in categories 1, 2, or 3\n\nMultiple filters can be combined with `;` (AND logic):\n- `filter=name%3D%3DSpring*%3Bautomation_id%3E5`\n"
required: false
schema:
type: string
- name: page_token
in: query
description: Page token
required: false
schema:
type: string
- name: order_by
in: query
description: 'Attribute and direction to order items.
One of the following fields:
- `name`
- `category`
- `activeContacts`
- `publishedDate`
One of the following directions:
- `asc`
- `desc`'
required: false
schema:
type: string
- name: page_size
in: query
description: Total number of items to return per page
required: false
schema:
type: integer
format: int32
maximum: 25
minimum: 0
example: 0
responses:
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'501':
description: Method Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'405':
description: Method Not Allowed
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/ListAutomationIdsResponse'
components:
schemas:
AddToAutomationSequenceRequest:
type: object
properties:
contact_ids:
type: array
description: List of contact IDs to add to the automation sequence
example:
- '123'
- '456'
- '789'
items:
type: string
required:
- contact_ids
Automation:
type: object
properties:
id:
type: string
description: The unique identifier of the automation
example: 123
title:
type: string
description: The title of the automation
example: Welcome Email Sequence
categories:
type: array
description: List of category IDs associated with this automation
example:
- '1'
- '2'
items:
type: string
status:
type: string
description: The publication status of the automation
enum:
- PUBLISHED
- DRAFT
example: PUBLISHED
locked:
type: boolean
description: Whether the automation is locked for editing
example: false
active_contacts:
type: integer
format: int32
description: Number of contacts currently active in this automation
example: 150
error_message:
type: string
description: Error message if the automation has issues
example: Invalid email template
published_date:
type: string
format: date-time
description: The date and time when the automation was published. In ISO-8601 format
example: '2024-05-21T14:30:00Z'
published_by:
type: string
description: The user ID who published the automation
example: 456
published_timezone:
type: string
description: The timezone used when publishing
example: America/New_York
current_edit_lock_status:
$ref: '#/components/schemas/AutomationLockStatus'
description: Current edit lock status information
BatchUnpublishAutomationRequest:
type: object
description: Request to unpublish multiple automations at once
properties:
automation_ids:
type: array
description: List of automation IDs to unpublish
example:
- '123'
- '456'
- '789'
items:
type: string
unpublished_form_message:
type: string
description: Custom message to display on forms when the automation is unpublished
example: This form is currently unavailable
required:
- automation_ids
GoalEventResultDTO:
type: object
description: Result of achieving a specific goal
properties:
success:
type: boolean
description: Whether the goal was successfully achieved
example: true
message:
type: string
description: A message with details about the result
example: Goal achieved successfully
automation_id:
type: integer
format: int64
description: The automation ID where the goal was achieved
example: 123
goal_id:
type: integer
format: int64
description: The goal ID that was achieved
example: 456
flow_start_results:
type: array
description: List of flows that were started as a result of achieving this goal
items:
$ref: '#/components/schemas/FlowEventResultDTO'
flow_stop_results:
type: array
description: List of flows that were stopped as a result of achieving this goal
items:
$ref: '#/components/schemas/FlowEventResultDTO'
ErrorDetails:
type: object
properties:
domain:
type: string
resource:
type: string
AssignAutomationCategoryRequest:
type: object
description: Request to assign categories to automations
properties:
category_ids:
type: array
description: List of category IDs to assign to the automations
example:
- '1'
- '2'
- '3'
items:
type: string
automation_ids:
type: array
description: List of automation IDs to update. Use '0' as a wildcard to select all automations.
example:
- '100'
- '200'
- '300'
items:
type: string
apply_category:
type: boolean
description: If true, the categories will be applied to the automations. If false, the categories will be removed from the automations.
example: true
AutomationLockStatus:
type: object
properties:
locked:
type: boolean
description: Whether the automation is currently locked
example: true
user_id:
type: string
description: The ID of the user who has the lock
example: 123
user_name:
type: string
description: The username of the user who has the lock
example: john.doe@example.com
user_firstname:
type: string
description: The first name of the user who has the lock
example: John
ListAutomationResponse:
type: object
properties:
automations:
type: array
items:
$ref: '#/components/schemas/Automation'
next_page_token:
type: string
automation_count:
type: integer
format: int32
FlowEventResultDTO:
type: object
description: Result of a flow being started or stopped
properties:
success:
type: boolean
description: Whether the flow operation was successful
example: true
message:
type: string
description: A message with details about the flow operation
example: Flow started successfully
flow_id:
type: integer
format: int64
description: The flow ID that was affected
example: 789
AchieveGoalResponse:
type: object
description: Response containing the results of achieving a goal
properties:
results:
type: array
description: List of results for each goal that was achieved. Contains information about flows started and stopped as a result.
items:
$ref: '#/components/schemas/GoalEventResultDTO'
RenameEasyAutomationCommand:
type: object
description: An object used to rename an automation.
properties:
name:
type: string
description: Name of the easy automation
example: Welcome new customer (Fall 26)
minLength: 1
required:
- name
AchieveGoalRequest:
type: object
description: Request to achieve a goal in an automation. You must provide EITHER (integration + call_name) OR (automation_id + goal_id), along with contact_id.
properties:
integration:
type: string
description: The integration name of the goal. Required when using integration/call_name approach. Use together with 'call_name'. Mutually exclusive with automation_id/goal_id.
example: my_integration
call_name:
type: string
description: The call name of the goal. Required when using integration/call_name approach. Use together with 'integration'. Mutually exclusive with automation_id/goal_id.
example: goal_achieved
automation_id:
type: integer
format: int64
description: The automation ID. Required when using automation_id/goal_id approach. Use together with 'goal_id'. Mutually exclusive with integration/call_name.
example: 123
goal_id:
type: integer
format: int64
description: The goal ID within the automation. Required when using automation_id/goal_id approach. Use together with 'automation_id'. Mutually exclusive with integration/call_name.
example: 456
contact_id:
type: integer
format: int64
description: The contact ID for whom to achieve the goal
example: 789
required:
- contac
# --- truncated at 32 KB (33 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-automation-api-openapi.yml