Keap Opportunities API
Keap Opportunity API — 26 operations across 13 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
Keap Opportunity API — 26 operations across 13 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-opportunities-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.1.0
info:
title: Keap Opportunity 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
tags:
- name: Opportunity
paths:
/rest/v2/opportunities:
get:
tags:
- Opportunity
summary: List Opportunities
description: Retrieves a list of all Opportunities.
operationId: listOpportunities
parameters:
- name: filter
in: query
description: 'Filter to apply, allowed fields are:
- (String) `stage_id`
- (String) `user_id`
- (String) `contact_id`
- (String) `opportunity_title` — supports wildcard prefix search (e.g. `opportunity_title==Deal*`)
- (String) `lead_source_name` — supports wildcard prefix search (e.g. `lead_source_name==Web*`)
- (String) `affiliate_id` — exact match only (e.g. `affiliate_id==123`)
- (String) `opportunity_id` — supports comparison operators: `==`, `>`, `<`, `>=`, `<=`
- (String) `ids` — comma-separated list of opportunity IDs (e.g. `ids==1,2,3`), maximum 100
IDs
- (String) `contact_phone` — matches the contact''s phone. By default it is an exact match against
the stored value, including any formatting characters (e.g. `contact_phone==(480) 123-4567`);
it does not normalize or search across an unformatted number. Supports wildcard prefix search
for partial matches (e.g. `contact_phone==480*`)
- (String) `contact_city` — matches the contact''s city; supports wildcard prefix search (e.g.
`contact_city==Chand*`)
- (String) `contact_state` — matches the contact''s state; supports wildcard prefix search (e.g.
`contact_state==AZ*`)
- (String) `projected_revenue_high` — projected revenue high; supports comparison operators:
`==`, `>`, `<`, `>=`, `<=` (e.g. `projected_revenue_high>=1000`)
- (String) `projected_revenue_low` — projected revenue low; supports comparison operators: `==`,
`>`, `<`, `>=`, `<=` (e.g. `projected_revenue_low<=500`)
Note: `opportunity_id` and `ids` cannot be used together in the same request.
**Custom fields:** opportunities may also be filtered by any custom field defined on the Opportunity
record, referenced by its field name (e.g. `cf_priority==10`). Both indexed and non-indexed
custom fields are filterable. The supported operator and value depend on the field''s data type:
- Text-like fields (Text, Text Area, Name, Email, Website, Phone, Social Security Number) and
choice fields with text options (Dropdown, Radio, State) — equals (`==`) and prefix wildcard
(e.g. `cf_company==Acme*`)
- Numeric fields (Whole Number, Decimal, Currency, Percent, Year, Month, Day of Week, User)
— equals and comparison (`==`, `>`, `<`, `>=`, `<=`)
- Date and Date/Time fields — equals and comparison; the value must be a full ISO-8601 date-time
with milliseconds and a timezone offset (e.g. `cf_renewDate<=2026-01-01T00:00:00.000Z`). Date-only
values such as `2026-01-01` are rejected
- Yes/No fields — equals only, value `0` (No) or `1` (Yes)
- Drilldown fields — equals only, integer value
- Multi-select fields (List Box, User List Box) — equals only, matched as a contains search
over the stored selections (e.g. `cf_tags==red`)
A custom field that does not exist, an operator unsupported for the field''s type, or a value
that does not match the field''s type returns `400 Bad Request`.
'
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 opportunities items.
One of the following fields:
- `next_action_time`
- `contact_name`
- `opportunity_title`
- `created_time`
- `update_time`
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: 1000
minimum: 0
example: 0
- name: fields
in: query
description: 'Comma-delimited list of optional Opportunities properties to include in the response.
Legacy field names are supported for optional fields only if legacy opportunities feature is
enabled. Allowed optional values: custom_fields,created_by,last_updated_by,status_id. Allowed
legacy optional values: monthly_revenue,order_revenue,objection,status,stage_entrance_time'
required: false
schema:
type: array
items:
type: string
enum:
- custom_fields
- created_by
- last_updated_by
- status_id
- monthly_revenue
- order_revenue
- objection
- status
- stage_entrance_time
uniqueItems: 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/ListOpportunitiesResponse'
post:
tags:
- Opportunity
summary: Create an Opportunity
description: Creates a new opportunity as the authenticated user.
operationId: createOpportunity
parameters:
- name: fields
in: query
description: 'Comma-delimited list of optional Opportunities properties to include in the response.
Legacy field names are supported for optional fields only if legacy opportunities feature is
enabled. Allowed optional values: custom_fields,created_by,last_updated_by,status_id. Allowed
legacy optional values: monthly_revenue,order_revenue,objection,status,stage_entrance_time'
required: false
schema:
type: array
items:
type: string
enum:
- custom_fields
- created_by
- last_updated_by
- status_id
- monthly_revenue
- order_revenue
- objection
- status
- stage_entrance_time
uniqueItems: true
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOpportunityRequest'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/RestV2Opportunity'
/rest/v2/opportunities/stages:
get:
tags:
- Opportunity
summary: List of Opportunity Stages
description: Retrieves a list of Opportunity Stages.
operationId: listOpportunityStages
parameters:
- name: filter
in: query
description: 'Filter to apply, allowed fields are:
- (String) `opportunity_stage_name` — supports wildcard prefix search (e.g. `opportunity_stage_name==Qualified*`)
- (String) `opportunity_stage_id` — supports comparison operators: `==`, `>`, `<`, `>=`, `<=`
(e.g. `opportunity_stage_id>5`)
'
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 stage items.
One of the following fields:
- `stage_order`
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: 1000
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/ListOpportunityStagesResponse'
post:
tags:
- Opportunity
summary: Create an Opportunity Stage
description: Creates a new Opportunity Stage
operationId: createOpportunityStage
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOpportunityStageRequest'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/RestOpportunityStage'
/rest/v2/opportunities/model/customFields:
post:
tags:
- Opportunity
summary: Create an Opportunity Custom Field
description: Creates a custom field of the specified type and options to the Opportunity object
operationId: createOpportunityCustomFields
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCustomFieldRequest'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/CustomFieldMetaData'
/rest/v2/opportunities/model/customFields/tabs:
get:
tags:
- Opportunity
summary: List Opportunity Custom Field Tabs
description: Retrieves a list of custom field tabs for the Opportunity record type.
operationId: listOpportunityCustomFieldTabs
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/ListCustomFieldTabsResponse'
post:
tags:
- Opportunity
summary: Create an Opportunity Custom Field Tab
description: Creates a new custom field tab for the Opportunity record type.
operationId: createOpportunityCustomFieldTab
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCustomFieldTabRequest'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/CustomFieldTab'
/rest/v2/opportunities/model/customFields/groups:
get:
tags:
- Opportunity
summary: List Opportunity Custom Field Groups
description: Retrieves a list of custom field groups for the Opportunity record type. Optionally
filter by tab_id to scope to a specific tab.
operationId: listOpportunityCustomFieldGroups
parameters:
- name: tab_id
in: query
description: Optional tab id to scope groups to a single tab
required: false
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/ListCustomFieldGroupsResponse'
post:
tags:
- Opportunity
summary: Create an Opportunity Custom Field Group
description: Creates a new custom field group for the Opportunity record type. If `tab_id` is omitted,
the group is added to the default 'Custom Fields' tab.
operationId: createOpportunityCustomFieldGroup
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCustomFieldGroupRequest'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/CustomFieldGroup'
/rest/v2/opportunities/{opportunity_id}:
get:
tags:
- Opportunity
summary: Retrieve a Opportunity
description: Retrieves the specified Opportunity
operationId: getOpportunity
parameters:
- name: opportunity_id
in: path
required: true
schema:
type: string
- name: fields
in: query
description: 'Comma-delimited list of optional Opportunities properties to include in the response.
Legacy field names are supported for optional fields only if legacy opportunities feature is
enabled. Allowed optional values: custom_fields,created_by,last_updated_by,status_id. Allowed
legacy optional values: monthly_revenue,order_revenue,objection,status,stage_entrance_time'
required: false
schema:
type: array
items:
type: string
enum:
- custom_fields
- created_by
- last_updated_by
- status_id
- monthly_revenue
- order_revenue
- objection
- status
- stage_entrance_time
uniqueItems: 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/RestV2Opportunity'
delete:
tags:
- Opportunity
summary: Delete an Opportunity
description: Deletes the specified Opportunity
operationId: deleteOpportunity
parameters:
- name: opportunity_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'
'204':
description: No Content
patch:
tags:
- Opportunity
summary: Update an opportunity
description: Updates specified values of a given opportunity
operationId: updateOpportunity
parameters:
- name: opportunity_id
in: path
required: true
schema:
type: string
- name: update_mask
in: query
description: An optional list of properties to be updated. If set, only the provided properties
will be updated and others will be skipped.
required: false
schema:
type: array
items:
type: string
enum:
- opportunity_title
- next_action_time
- next_action_notes
- opportunity_notes
- estimated_close_time
- include_in_forecast
- projected_revenue_low
- projected_revenue_high
- contact_id
- stage_id
- user_id
- custom_fields
- affiliate_id
uniqueItems: true
- name: fields
in: query
description: 'Comma-delimited list of optional Opportunities properties to include in the response.
Legacy field names are supported for optional fields only if legacy opportunities feature is
enabled. Allowed optional values: custom_fields,created_by,last_updated_by,status_id. Allowed
legacy optional values: monthly_revenue,order_revenue,objection,status,stage_entrance_time'
required: false
schema:
type: array
items:
type: string
enum:
- custom_fields
- created_by
- last_updated_by
- status_id
- monthly_revenue
- order_revenue
- objection
- status
- stage_entrance_time
uniqueItems: true
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateOpportunityRequestV2'
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:
$r
# --- truncated at 32 KB (85 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-opportunity-api-openapi.yml