Keap Note API
Keap Note API — 21 operations across 11 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
Keap Note API — 21 operations across 11 paths on the Keap REST v2 contract, read from Keap's own published OpenAPI 3.1 document.
openapi: 3.1.0
info:
title: Keap Note 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: Note
paths:
/rest/v2/notes/model/customFields:
post:
tags:
- Note
summary: Create a Custom Field
description: 'Creates a custom field of the specified type and options to the Note object<br/>Note:
Custom Fields for Tasks, Classic Appointments and Notes are combined.'
operationId: createNoteCustomField
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/notes/model/customFields/tabs:
get:
tags:
- Note
summary: List Note Custom Field Tabs
description: 'Retrieves a list of custom field tabs for the Note record type.<br/>Note: Custom Field
Tabs for Tasks, Classic Appointments and Notes are combined.'
operationId: listNoteCustomFieldTabs
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:
- Note
summary: Create a Note Custom Field Tab
description: 'Creates a new custom field tab for the Note record type.<br/>Note: Custom Field Tabs
for Tasks, Classic Appointments and Notes are combined.'
operationId: createNoteCustomFieldTab
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/notes/model/customFields/groups:
get:
tags:
- Note
summary: List Note Custom Field Groups
description: 'Retrieves a list of custom field groups for the Note record type. Optionally filter
by tab_id to scope to a specific tab.<br/>Note: Custom Field Groups for Tasks, Classic Appointments
and Notes are combined.'
operationId: listNoteCustomFieldGroups
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:
- Note
summary: Create a Note Custom Field Group
description: 'Creates a new custom field group for the Note record type. If `tab_id` is omitted,
the group is added to the default ''Custom Fields'' tab.<br/>Note: Custom Field Groups for Tasks,
Classic Appointments and Notes are combined.'
operationId: createNoteCustomFieldGroup
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/contacts/{contact_id}/notes:
get:
tags:
- Note
summary: List Notes
description: Retrieves a list of Notes for a given contact
operationId: listNotes
parameters:
- name: contact_id
in: path
required: true
schema:
type: string
- name: filter
in: query
description: "Filter to apply. Allowed fields and operators:\n- (String) `id` — supports `==`,\
\ `!=`, `>`, `<`, `>=`, `<=`\n- (String list) `ids` — comma-separated note ids, supports `==`\
\ only (e.g. `ids==1,2,3`)\n- (String) `title` — supports `==`. Bare value matches anywhere\
\ in the title (contains).\n Wildcard prefix match also supported (e.g. `title==Follow*`)\n\
- (String) `contact_id`\n- (String) `assigned_to_user_id`\n- (String) `since_time` — ISO-8601\
\ date/time\n- (String) `until_time` — ISO-8601 date/time\n\nOperators must be URL-encoded.\
\ Common encodings:\n`==` → `%3D%3D`, `!=` → `!%3D`, `>` → `%3E`, `<` → `%3C`,\n`>=` → `%3E%3D`,\
\ `<=` → `%3C%3D`, `*` → `%2A`.\n\nMultiple filters are combined with AND using `;`.\n\nExamples:\n\
- `filter=contact_id%3D%3D1001`\n- `filter=id%3E5`\n- `filter=ids%3D%3D1,2,3`\n- `filter=title%3D%3DFollow%2A`\n\
- `filter=since_time%3D%3D2025-04-16T20:33:02.321Z`\n- `filter=until_time%3D%3D2025-08-16T20:33:02.321Z`\n\
\nCustom fields (when enabled) can be filtered by their field name (case-insensitive).\nA standard\
\ field above takes precedence over a custom field with the same name.\nSupported operators\
\ depend on the custom field's type:\n- Text-like fields and single-value choice fields with\
\ text options (dropdown, radio, state): `==` only, with optional trailing wildcard (e.g. `Priority%3D%3DHigh%2A`)\n\
- Yes/No and drilldown fields: `==` only\n- Numeric fields (including user, month, day of week):\
\ `==`, `>`, `<`, `>=`, `<=`\n- Date fields: `==`, `>`, `<`, `>=`, `<=` using full ISO 8601\n\
- Multi-select fields: `==` matches records that contain the given option\nExample (for a custom\
\ field named `Priority`): `filter=Priority%3D%3DHigh`\n\nNotes:\n- `id` and `ids` cannot be\
\ combined in the same request.\n- Wildcard `*` may only appear at the end of the value (prefix\
\ match).\n Leading wildcards (`*foo`, `*foo*`) are rejected for performance reasons.\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:
- `id`
- `create_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 Note properties to include in the response. Allowed
values: custom_fields'
required: false
schema:
type: string
enum:
- custom_fields
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/ListNotesResponse'
post:
tags:
- Note
summary: Create a Note
description: Creates a new Note.
operationId: createNote
parameters:
- name: contact_id
in: path
required: true
schema:
type: string
- name: fields
in: query
description: 'Comma-delimited list of optional Note properties to include in the response. Allowed
values: custom_fields'
required: false
schema:
type: string
enum:
- custom_fields
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateNoteRequest'
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/Note'
/rest/v2/notes/model/customFields/{custom_field_id}:
delete:
tags:
- Note
summary: Delete a Note Custom Field
description: 'Deletes a Custom Field from the Note object<br/>Note: Custom Fields for Tasks, Classic
Appointments and Notes are combined.'
operationId: deleteNotesCustomField
parameters:
- name: custom_field_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:
- Note
summary: Update a Custom Field
description: 'Updates a custom field of the specified type and options to the Note object<br/>Note:
Custom Fields for Tasks, Classic Appointments and Notes are combined.'
operationId: updateNotesCustomField
parameters:
- name: custom_field_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:
- group_id
- label
- options
uniqueItems: true
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateCustomFieldMetaDataRequest'
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/CustomFieldMetaData'
/rest/v2/notes/model/customFields/tabs/{tab_id}:
get:
tags:
- Note
summary: Retrieve a Note Custom Field Tab
description: 'Retrieves a single custom field tab by id for the Note record type.<br/>Note: Custom
Field Tabs for Tasks, Classic Appointments and Notes are combined.'
operationId: getNoteCustomFieldTab
parameters:
- name: tab_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/CustomFieldTab'
delete:
tags:
- Note
summary: Delete a Note Custom Field Tab
description: 'Deletes a custom field tab. Returns 409 Conflict if the tab still contains groups.<br/>Note:
Custom Field Tabs for Tasks, Classic Appointments and Notes are combined.'
operationId: deleteNoteCustomFieldTab
parameters:
- name: tab_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:
- Note
summary: Update a Note Custom Field Tab
description: 'Updates an existing custom field tab. Only fields listed in `update_mask` are applied.<br/>Note:
Custom Field Tabs for Tasks, Classic Appointments and Notes are combined.'
operationId: updateNoteCustomFieldTab
parameters:
- name: tab_id
in: path
required: true
schema:
type: string
- name: update_mask
in: query
description: Comma-separated list of fields to update
required: true
schema:
type: array
items:
type: string
enum:
- name
- order
uniqueItems: true
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateCustomFieldTabRequest'
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/CustomFieldTab'
/rest/v2/notes/model/customFields/groups/{group_id}:
get:
tags:
- Note
summary: Retrieve a Note Custom Field Group
description: 'Retrieves a single custom field group by id for the Note record type.<br/>Note: Custom
Field Groups for Tasks, Classic Appointments and Notes are combined.'
operationId: getNoteCustomFieldGroup
parameters:
- name: group_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/CustomFieldGroup'
delete:
tags:
- Note
summary: Delete a Note Custom Field Group
description: 'Deletes a custom field group. Returns 409 Conflict if the group still contains custom
fields.<br/>Note: Custom Field Groups for Tasks, Classic Appointments and Notes are combined.'
operationId: deleteNoteCustomFieldGroup
parameters:
- name: group_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:
applicat
# --- truncated at 32 KB (68 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/keap/refs/heads/main/openapi/keap-note-api-openapi.yml