Keap Users API
Keap Users API — 5 operations across 4 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
Keap Users API — 5 operations across 4 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-users-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 Users 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 Users 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: Users
description: Users-Endpoint
paths:
/rest/v1/users:
get:
tags:
- Users
summary: List Users
description: Retrieves a list of all users
operationId: listUsers
parameters:
- name: restUserQueryCommand
in: query
required: true
schema:
$ref: '#/components/schemas/RestUserQueryCommand'
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/Users'
post:
tags:
- Users
summary: Create a User
description: 'Creates a new user record. NB: Users will be invited to the application and remain in the "Invited" status until the user accepts the invite. "Inactive" users will not take up a user license.'
operationId: createUser
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUser'
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/RestUser'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v1/users/{userId}/signature:
get:
tags:
- Users
summary: Get User email signature
description: Retrieves a HTML snippet that contains the user's email signature.
operationId: getUserSignature
parameters:
- name: userId
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:
type: string
servers:
- url: https://api.infusionsoft.com/crm
/rest/v2/users/{user_id}:
get:
tags:
- Users
summary: Get User
description: Retrieves a specific User
operationId: getUserById
parameters:
- name: user_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/User'
patch:
tags:
- Users
summary: Update User
description: Updates information on a specific User
operationId: updateUser
parameters:
- name: user_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:
- address
- company_name
- email_address
- family_name
- fax_numbers
- given_name
- job_title
- phone_numbers
- time_zone
- website
uniqueItems: true
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateUserRequest'
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/User'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v2/users:
get:
tags:
- Users
summary: List Users
description: Retrieves a list of users
operationId: listPaginatedUsers
parameters:
- name: filter
in: query
description: 'Filter to apply, allowed fields are:
- (String) `email`
- (String) `given_name`
- (Boolean) `include_inactive`
- (Boolean) `include_partners`
- (Set[String]) `user_ids`
You will need to apply the `==` operator to check the equality of one of the filters with your searched
word, in the encoded form `%3D%3D`.
For the filters listed above, here are some examples:
- `filter=given_name%3D%3DMary`
- `filter=user_ids%3D%3D123%3Bgiven_name%3D%3DSmith`
'
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:
- `create_time`
- `email`
- `name` (sorts by family name / last name; uses User ID as tiebreaker for stable pagination)
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: 100
minimum: 1
example: 10
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/ListUsersPaginatedResponse'
servers:
- url: https://api.infusionsoft.com/crm
/rest/v2/users/{user_id}/signature:
get:
tags:
- Users
summary: Get User email signature
description: Retrieves a HTML snippet that contains the user's email signature.
operationId: getUserSignature
parameters:
- name: user_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:
type: string
servers:
- url: https://api.infusionsoft.com/crm
/rest/v2/oauth/connect/userinfo:
get:
tags:
- Users
summary: Retrieve User Info
description: Retrieves information for the current authenticated end-user, as outlined by the [OpenID Connect specification](http://openid.net/specs/openid-connect-core-1_0.html#UserInfo).
operationId: getUserInfo
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/GetUserInfoResponse'
servers:
- url: https://api.infusionsoft.com/crm
components:
schemas:
DefaultHttpStatusCode:
allOf:
- $ref: '#/components/schemas/HttpStatusCode'
RestUserQueryCommand:
type: object
properties:
limit:
type: integer
format: int32
offset:
type: integer
format: int32
include_inactive:
type: boolean
include_partners:
type: boolean
includeInactive:
type: boolean
includePartners:
type: boolean
RestUser:
type: object
properties:
address:
$ref: '#/components/schemas/Address'
website:
type: string
partner:
type: boolean
status:
type: string
enum:
- Active
- Invited
- Inactive
company_name:
type: string
email_address:
type: string
phone_numbers:
type: array
items:
$ref: '#/components/schemas/PhoneNumber'
fax_numbers:
type: array
items:
$ref: '#/components/schemas/FaxNumber'
given_name:
type: string
family_name:
type: string
middle_name:
type: string
preferred_name:
type: string
time_zone:
type: string
job_title:
type: string
infusionsoft_id:
type: string
date_created:
type: string
format: date-time
created_by:
type: integer
format: int64
last_updated:
type: string
format: date-time
last_updated_by:
type: integer
format: int64
global_user_id:
type: integer
format: int64
id:
type: integer
format: int64
required:
- id
CreateUser:
type: object
description: user
properties:
email:
type: string
partner:
type: boolean
admin:
type: boolean
given_name:
type: string
required:
- email
- given_name
PhoneNumber:
type: object
properties:
number:
type: string
extension:
type: string
field:
type: string
enum:
- PHONE1
- PHONE2
- PHONE3
- PHONE4
- PHONE5
type:
type: string
number_e164:
type: string
required:
- field
Address:
type: object
properties:
line1:
type: string
line2:
type: string
locality:
type: string
region:
type: string
zip_code:
type: string
zip_four:
type: string
country_code:
type: string
View:
type: object
properties:
contentType:
type: string
ModelAndView:
type: object
properties:
view:
$ref: '#/components/schemas/View'
model:
type: object
additionalProperties: {}
status:
oneOf:
- $ref: '#/components/schemas/DefaultHttpStatusCode'
- $ref: '#/components/schemas/HttpStatus'
modelMap:
type: object
additionalProperties: {}
properties:
empty:
type: boolean
reference:
type: boolean
empty:
type: boolean
viewName:
type: string
HttpStatus:
allOf:
- $ref: '#/components/schemas/HttpStatusCode'
enum:
- 100 CONTINUE
- 101 SWITCHING_PROTOCOLS
- 102 PROCESSING
- 103 EARLY_HINTS
- 200 OK
- 201 CREATED
- 202 ACCEPTED
- 203 NON_AUTHORITATIVE_INFORMATION
- 204 NO_CONTENT
- 205 RESET_CONTENT
- 206 PARTIAL_CONTENT
- 207 MULTI_STATUS
- 208 ALREADY_REPORTED
- 226 IM_USED
- 300 MULTIPLE_CHOICES
- 301 MOVED_PERMANENTLY
- 302 FOUND
- 303 SEE_OTHER
- 304 NOT_MODIFIED
- 307 TEMPORARY_REDIRECT
- 308 PERMANENT_REDIRECT
- 400 BAD_REQUEST
- 401 UNAUTHORIZED
- 402 PAYMENT_REQUIRED
- 403 FORBIDDEN
- 404 NOT_FOUND
- 405 METHOD_NOT_ALLOWED
- 406 NOT_ACCEPTABLE
- 407 PROXY_AUTHENTICATION_REQUIRED
- 408 REQUEST_TIMEOUT
- 409 CONFLICT
- 410 GONE
- 411 LENGTH_REQUIRED
- 412 PRECONDITION_FAILED
- 413 CONTENT_TOO_LARGE
- 413 PAYLOAD_TOO_LARGE
- 414 URI_TOO_LONG
- 415 UNSUPPORTED_MEDIA_TYPE
- 416 REQUESTED_RANGE_NOT_SATISFIABLE
- 417 EXPECTATION_FAILED
- 418 I_AM_A_TEAPOT
- 421 MISDIRECTED_REQUEST
- 422 UNPROCESSABLE_CONTENT
- 422 UNPROCESSABLE_ENTITY
- 423 LOCKED
- 424 FAILED_DEPENDENCY
- 425 TOO_EARLY
- 426 UPGRADE_REQUIRED
- 428 PRECONDITION_REQUIRED
- 429 TOO_MANY_REQUESTS
- 431 REQUEST_HEADER_FIELDS_TOO_LARGE
- 451 UNAVAILABLE_FOR_LEGAL_REASONS
- 500 INTERNAL_SERVER_ERROR
- 501 NOT_IMPLEMENTED
- 502 BAD_GATEWAY
- 503 SERVICE_UNAVAILABLE
- 504 GATEWAY_TIMEOUT
- 505 HTTP_VERSION_NOT_SUPPORTED
- 506 VARIANT_ALSO_NEGOTIATES
- 507 INSUFFICIENT_STORAGE
- 508 LOOP_DETECTED
- 509 BANDWIDTH_LIMIT_EXCEEDED
- 510 NOT_EXTENDED
- 511 NETWORK_AUTHENTICATION_REQUIRED
FaxNumber:
type: object
properties:
number:
type: string
field:
type: string
enum:
- FAX1
- FAX2
type:
type: string
required:
- field
HttpStatusCode:
type: object
properties:
error:
type: boolean
is1xxInformational:
type: boolean
is2xxSuccessful:
type: boolean
is3xxRedirection:
type: boolean
is4xxClientError:
type: boolean
is5xxServerError:
type: boolean
Users:
type: object
properties:
users:
type: array
items:
$ref: '#/components/schemas/RestUser'
count:
type: integer
format: int32
next:
type: string
previous:
type: string
PhoneNumber_2:
type: object
properties:
extension:
type: string
description: Phone extension
example: 101
number:
type: string
description: Phone number. Maximum length is 40 characters for PHONE1-PHONE3 and 20 characters for PHONE4-PHONE5.
example: 5551234567
type:
type: string
description: Phone type
example: Work
field:
type: string
description: Phone number slot
enum:
- PHONE_NUMBER_FIELD_UNSPECIFIED
- PHONE1
- PHONE2
- PHONE3
- PHONE4
- PHONE5
example: PHONE1
number_e164:
type: string
description: Phone number in E.164 format
example: '+15551234567'
ErrorDetails:
type: object
properties:
domain:
type: string
resource:
type: string
Address_2:
type: object
properties:
country:
type: string
deprecated: true
description: Deprecated. The long-name descriptive version of the Country Code. Please use 'country_code' for POST/PATCH operations. Maximum length is 100 characters.
example: United States of America
line1:
type: string
description: Street address line 1. Maximum length is 75 characters for the BILLING address and 100 characters for the SHIPPING and OTHER addresses.
example: 123
line2:
type: string
description: Street address line 2. Maximum length is 75 characters for the BILLING address and 100 characters for the SHIPPING and OTHER addresses.
example: Suite 100
locality:
type: string
description: The municipality to which the address belongs. Maximum length is 50 characters for the BILLING address and 100 characters for the SHIPPING and OTHER addresses.
example: Phoenix
region:
type: string
deprecated: true
description: The long-name descriptive version of the Region Code. Please use 'region_code' for POST/PATCH operations. Maximum length is 50 characters.
example: Arizona
field:
type: string
description: Address type field
enum:
- ADDRESS_FIELD_UNSPECIFIED
- BILLING
- SHIPPING
- OTHER
example: BILLING
country_code:
type: string
description: An ISO 3166-2 Country Code (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)
example: USA
postal_code:
type: string
description: Postal or ZIP code. Maximum length is 15 characters for the BILLING and OTHER addresses and 20 characters for the SHIPPING address.
example: 85001
region_code:
type: string
description: An ISO 3166-2 Province Code, such as one of the US States (https://en.wikipedia.org/wiki/ISO_3166-2:US)
example: US-AZ
zip_code:
type: string
description: ZIP code (US). Maximum length is 15 characters for the BILLING and OTHER addresses and 20 characters for the SHIPPING address.
example: 85001
zip_four:
type: string
description: ZIP+4 extension. Maximum length is 10 characters.
example: 1234
User:
type: object
description: A user in the system
properties:
address:
$ref: '#/components/schemas/Address_2'
description: The user's address
title:
type: string
description: The user's job title
example: Sales Manager
website:
type: string
description: The user's website URL
example: https://example.com
partner:
type: boolean
description: Whether the user is a partner
example: false
admin:
type: boolean
description: Whether the user is an admin
example: true
status:
type: string
description: The user's status
enum:
- ACTIVE
- INVITED
- INACTIVE
- NOT_A_USER
example: ACTIVE
id:
type: string
description: The unique identifier of the user
example: 123
global_user_id:
type: string
description: The global user identifier across tenants
example: usr_abc123
keap_id:
type: string
description: The Keap ID of the user
example: 456
given_name:
type: string
description: The user's first name
example: John
family_name:
type: string
description: The user's last name
example: Smith
middle_name:
type: string
description: The user's middle name
example: Edward
nickname:
type: string
description: The user's nickname or preferred name
example: Tony
spouse_name:
type: string
description: The name of the user's spouse
example: Mia
suffix:
type: string
description: The user's name suffix
example: Jr.
phone_numbers:
type: array
description: List of user's phone numbers
items:
$ref: '#/components/schemas/PhoneNumber_2'
fax_numbers:
type: array
description: List of user's fax numbers
items:
$ref: '#/components/schemas/FaxNumber_2'
email_addresses:
type: array
description: List of user's email addresses
items:
$ref: '#/components/schemas/EmailAddress'
social_accounts:
type: array
description: List of user's social media accounts
items:
$ref: '#/components/schemas/SocialAccount'
company_name:
type: string
description: The user's company name
example: Acme Corp
created_by:
type: integer
format: int64
description: ID of the user who created this user
example: 1
create_time:
type: string
format: date-time
description: When the user was created, in ISO-8601 format
example: '2024-05-21T14:30:00Z'
updated_by:
type: integer
format: int64
description: ID of the user who
# --- truncated at 32 KB (38 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-users-api-openapi.yml