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.
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 Opportunity API
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
version: '1.0'
description: 'Operations tagged Opportunity across 2 of this provider''s published API definitions: keap-v1-openapi.json, keap-v2-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: Opportunity
description: Opportunities-Endpoint
paths:
/rest/v1/opportunities:
get:
tags:
- Opportunity
summary: List Opportunities
description: 'Retrieves a list of all opportunities.
Please note: the sample response erroneously shows properties, such as _stage reasons_, that are unavailable through the list endpoint. Such properties are only available through the retrieve operation. Future versions of the Opportunity resource will correct the oversight.'
operationId: listOpportunities
parameters:
- name: searchCommand
in: query
required: true
schema:
$ref: '#/components/schemas/OpportunitySearchCommand'
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/OpportunityList'
put:
tags:
- Opportunity
summary: Replace an Opportunity
description: Replaces all values of a given opportunity
operationId: updateOpportunity
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateOpportunityRequest'
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/Opportunity'
post:
tags:
- Opportunity
summary: Create an Opportunity
description: Creates a new opportunity as the authenticated user.
operationId: createOpportunity
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateOpportunityRequest'
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/Opportunity'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v1/opportunities/{opportunityId}:
get:
tags:
- Opportunity
summary: Retrieve an Opportunity
description: Retrives a single opportunity
operationId: getOpportunity
parameters:
- name: opportunityId
in: path
required: true
schema:
type: integer
format: int64
- name: optional_properties
in: query
description: Comma-delimited list of Opportunity properties to include in the response. (Some fields such as `custom_fields` aren't included, by default.)
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/Opportunity'
patch:
tags:
- Opportunity
summary: Update an Opportunity
description: "Updates an opportunity with only the values provided in the request. \n \n*Note:* The POST payload for this request is identical to ['Replace an Opportunity'](https://developer.infusionsoft.com/docs/rest/#operation/updateOpportunityUsingPUT) operation."
operationId: updatePropertiesOnOpportunity
parameters:
- name: opportunityId
in: path
required: true
schema:
type: integer
format: int64
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/Opportunity'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v1/opportunity/stage_pipeline:
get:
tags:
- Opportunity
summary: List Opportunity Stage Pipeline
description: Retrieves a list of all opportunity stages with pipeline details
operationId: listOpportunityStagePipelines
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/SalesPipeline'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v1/opportunities/model:
get:
tags:
- Opportunity
summary: Retrieve Opportunity Model
description: Get the custom fields for the Opportunity object
operationId: retrieveOpportunityModel
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/ObjectModel'
servers:
- url: https://api.infusionsoft.com/crm
/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'
servers:
- url: https://api.infusionsoft.com/crm
/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'
servers:
- url: https://api.infusionsoft.com/crm
/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 Oppo
# --- truncated at 32 KB (112 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-opportunity-api-openapi.yml