Keap Product API (v1)
Keap Product API — 11 operations across 6 paths on the Keap REST v1 contract, read from Keap's own published OpenAPI 3.1 document.
Keap Product API — 11 operations across 6 paths on the Keap REST v1 contract, read from Keap's own published OpenAPI 3.1 document.
openapi: 3.1.0
info:
title: Keap Product 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: v1
servers:
- url: https://api.infusionsoft.com/crm
tags:
- name: Product
paths:
/rest/v1/products/{productId}/subscriptions:
post:
tags:
- Product
summary: Create a Product Subscription
description: Creates a new product subscription
operationId: createProductSubscription
parameters:
- name: productId
in: path
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProductSubscription'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/ProductSubscription'
/rest/v1/products/{productId}/image:
post:
tags:
- Product
summary: Upload a product image
description: Max payload 3 megabytes, the `file_data` is base64 encoded.
operationId: createProductImage
parameters:
- name: httpHeaders
in: header
required: true
schema:
$ref: '#/components/schemas/HttpHeaders'
- name: productId
in: path
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProductImage'
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'
'201':
description: Created
delete:
tags:
- Product
summary: Delete a product image
operationId: deleteProductImage
parameters:
- name: productId
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'
'204':
description: No Content
/rest/v1/products:
get:
tags:
- Product
summary: List Products
description: Retrieves a list of all products
operationId: listProducts
parameters:
- name: productSearchCommand
in: query
required: true
schema:
$ref: '#/components/schemas/ProductSearchCommand'
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/ProductList'
deprecated: true
post:
tags:
- Product
summary: Create a Product
description: Creates a new product
operationId: createProduct
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProduct'
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'
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/RestProductV1'
/rest/v1/products/{productId}:
get:
tags:
- Product
summary: Retrieve a Product
operationId: retrieveProduct
parameters:
- name: productId
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/RestProductV1'
delete:
tags:
- Product
summary: Delete a Product
description: Deletes a product and its subscriptions
operationId: deleteProduct
parameters:
- name: productId
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'
'204':
description: No Content
patch:
tags:
- Product
summary: Update a Product
description: Updates a Product with only the values provided in the request.
operationId: updateProduct
parameters:
- name: productId
in: path
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateProduct'
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/RestProductV1'
/rest/v1/products/{productId}/subscriptions/{subscriptionId}:
get:
tags:
- Product
summary: Retrieve a Product Subscription
operationId: retrieveProductSubscription
parameters:
- name: productId
in: path
required: true
schema:
type: integer
format: int64
- name: subscriptionId
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/ProductSubscription'
delete:
tags:
- Product
summary: Delete a Product Subscription
description: Deletes a product subscription
operationId: deleteProductSubscription
parameters:
- name: productId
in: path
required: true
schema:
type: integer
format: int64
- name: subscriptionId
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'
'204':
description: No Content
/rest/v1/products/sync:
get:
tags:
- Product
summary: Retrieve Synced Products
description: The Sync endpoint returns a set of products that have been updated or created since
the last result set was retrieved, minus any products that have been deleted.
operationId: listProductsFromSyncToken
parameters:
- name: sync_token
in: query
required: false
schema:
type: string
- name: syncCommand
in: query
required: true
schema:
$ref: '#/components/schemas/SyncCommand'
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/ProductStatusList'
deprecated: true
components:
schemas:
ContentDisposition:
type: object
properties:
type:
type: string
name:
type: string
filename:
type: string
charset:
type: string
inline:
type: boolean
formData:
type: boolean
attachment:
type: boolean
CreateProduct:
type: object
properties:
sku:
type: string
active:
type: boolean
product_name:
type: string
product_desc:
type: string
product_price:
type: number
format: double
product_short_desc:
type: string
subscription_only:
type: boolean
required:
- product_name
CreateProductImage:
type: object
properties:
file_name:
type: string
description: 'The name of the file with extension, must match file data. Acceptable file types: [.png,
.gif, .jpg, .jpeg].'
file_data:
type: string
description: The image data, base64 encoded.
checksum:
type: string
description: SHA256 checksum of image in Hex.
required:
- file_data
- file_name
CreateProductSubscription:
type: object
properties:
frequency:
type: integer
format: int32
active:
type: boolean
cycle_type:
type: string
enum:
- YEAR
- MONTH
- WEEK
- DAY
plan_price:
type: number
format: double
number_of_cycles:
type: integer
format: int32
subscription_plan_index:
type: integer
format: int32
required:
- cycle_type
- plan_price
DefaultHttpStatusCode:
allOf:
- $ref: '#/components/schemas/HttpStatusCode'
HttpHeaders:
type: object
properties:
accept:
type: array
items:
$ref: '#/components/schemas/MediaType'
bearerAuth:
type: string
writeOnly: true
basicAuth:
type: string
writeOnly: true
allow:
type: array
items:
$ref: '#/components/schemas/HttpMethod'
uniqueItems: true
cacheControl:
type: string
acceptLanguage:
type: array
items:
type: object
properties:
range:
type: string
weight:
type: number
format: double
acceptLanguageAsLocales:
type: array
items:
type: string
acceptPatch:
type: array
items:
$ref: '#/components/schemas/MediaType'
accessControlAllowCredentials:
type: boolean
accessControlAllowHeaders:
type: array
items:
type: string
accessControlAllowMethods:
type: array
items:
$ref: '#/components/schemas/HttpMethod'
accessControlAllowOrigin:
type: string
accessControlExposeHeaders:
type: array
items:
type: string
accessControlMaxAge:
type: integer
format: int64
accessControlRequestHeaders:
type: array
items:
type: string
accessControlRequestMethod:
$ref: '#/components/schemas/HttpMethod'
acceptCharset:
type: array
items:
type: string
contentDisposition:
$ref: '#/components/schemas/ContentDisposition'
contentLanguage:
type: string
etag:
type: string
expires:
type: integer
format: int64
ifMatch:
type: array
items:
type: string
ifNoneMatch:
type: array
items:
type: string
ifUnmodifiedSince:
type: integer
format: int64
pragma:
type: string
upgrade:
type: string
vary:
type: array
items:
type: string
host:
type: object
properties:
hostString:
type: string
address:
type: object
properties:
hostAddress:
type: string
address:
type: string
format: byte
hostName:
type: string
linkLocalAddress:
type: boolean
multicastAddress:
type: boolean
anyLocalAddress:
type: boolean
loopbackAddress:
type: boolean
siteLocalAddress:
type: boolean
mcglobal:
type: boolean
mcnodeLocal:
type: boolean
mclinkLocal:
type: boolean
mcsiteLocal:
type: boolean
mcorgLocal:
type: boolean
canonicalHostName:
type: string
port:
type: integer
format: int32
unresolved:
type: boolean
hostName:
type: string
empty:
type: boolean
location:
type: string
format: uri
all:
type: object
additionalProperties:
type: string
writeOnly: true
lastModified:
type: integer
format: int64
date:
type: integer
format: int64
contentLength
# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-product-v1-api-openapi.yml