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
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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: 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 Group description: 'Updates an existing custom field group. Only fields listed in `update_mask` are applied.
Note: Custom Field Groups for Tasks, Classic Appointments and Notes are combined.' operationId: updateNoteCustomFieldGroup parameters: - name: group_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 - tab_id - order uniqueItems: true requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateCustomFieldGroupRequest' 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/CustomFieldGroup' /rest/v2/contacts/{contact_id}/notes/{note_id}: get: tags: - Note summary: Retrieve a Note description: Retrieves the specified Note operationId: getNote parameters: - name: contact_id in: path required: true schema: type: string - name: note_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 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/GetNoteResponse' delete: tags: - Note summary: Delete a Note description: Deletes the specified Note operationId: deleteNote parameters: - name: contact_id in: path required: true schema: type: string - name: note_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 description: Updates a Note for a Contact operationId: updateNote parameters: - name: contact_id in: path required: true schema: type: string - name: note_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: - contact_id - title - text - type - user_id - is_pinned - custom_fields uniqueItems: true - 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/UpdateNoteRequest' 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/UpdateNoteResponse' /rest/v2/notes: get: tags: - Note summary: List All Notes description: Retrieves a list of all notes operationId: listAllNotes parameters: - 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' /rest/v2/notes/templates: get: tags: - Note summary: Retrieve Note Templates description: Retrieves a list of Note Templates operationId: listNoteTemplates parameters: - name: filter in: query description: Search filter to apply to results 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 by. E.g. `given_name 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/ListNoteTemplateResponse' /rest/v2/notes/model: get: tags: - Note summary: Retrieve Note Model description: 'Gets the custom fields for the Note object
Note: Custom Fields for Tasks, Classic Appointments and Notes are combined.' operationId: retrieveNoteModel 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/ObjectModel' components: schemas: BasicUser: type: object properties: id: type: string description: User ID example: 456 given_name: type: string description: First name example: Jane family_name: type: string description: Last name example: Doe email_address: type: string description: Email address example: jane.doe@example.com CreateCustomFieldGroupRequest: type: object properties: name: type: string tab_id: type: string CreateCustomFieldOptionRequest: type: object properties: label: type: string CreateCustomFieldRequest: type: object properties: label: type: string options: type: array items: $ref: '#/components/schemas/CreateCustomFieldOptionRequest' field_type: type: string enum: - CURRENCY - DATE - DATE_TIME - DAY_OF_WEEK - DECIMAL_NUMBER - DRILLDOWN - DROPDOWN - EMAIL - LIST_BOX - MONTH - NAME - PERCENT - PHONE_NUMBER - RADIO - SOCIAL_SECURITY_NUMBER - STATE - TEXT - TEXT_AREA - USER - USER_LIST_BOX - WEBSITE - WHOLE_NUMBER - YEAR - YES_NO group_id: type: string description: An optional tab group to place the field under in the interface. If not specified, will default to the 'Custom Fields' tab. user_group_id: type: string description: An optional user group to choose from when selecting values for User or UserListBox fields. required: - field_type - label CreateCustomFieldTabRequest: type: object properties: name: type: string CreateNoteRequest: type: object properties: title: type: string description: A value for either `title` or `type` is required. example: Follow-up Meeting text: type: string description: Note content example: Discussed pricing for contract renewal type: type: string description: A value for either `title` or `type` is required. The value may be one of `Appointment`, `Call`, `Email`, `Fax`, `Letter` or `Other` in Keap Max/Pro, or an admin-configured value in Classic. example: Call user_id: type: string description: ID of user creating the note example: 123 is_pinned: type: boolean description: Whether to pin this note example: false custom_fields: type: array description: Custom field values for the note. An empty array resets all custom fields to their defaults. example: - id: '1' content: Red items: $ref: '#/components/schemas/CustomFieldValueObject' required: - user_id CustomFieldGroup: type: object properties: id: type: string name: type: string order: type: integer format: int32 tab_id: type: string record_type: type: string enum: - CONTACT - REFERRAL_PARTNER - OPPORTUNITY - TASK_NOTE_APPOINTMENT - COMPANY - ORDER - SUBSCRIPTION CustomFieldMetaData: type: object description: Metadata describing a custom field, including its type and options properties: id: type: string description: The unique identifier of the custom field example: 123 label: type: string description: The display label of the custom field example: Favorite Color options: type: array description: The list of available options for select/radio/multiselect/drilldown field types items: $ref: '#/components/schemas/CustomFieldOption' record_type: type: string description: The entity type this custom field belongs to (e.g. CONTACT, COMPANY) enum: - CONTACT - REFERRAL_PARTNER - OPPORTUNITY - TASK_NOTE_APPOINTMENT - COMPANY - ORDER - SUBSCRIPTION field_type: type: string description: The data type of the custom field (e.g. Text, Number, Date, Select) enum: - CURRENCY - DATE - DATE_TIME - DAY_OF_WEEK - DECIMAL_NUMBER - DRILLDOWN - DROPDOWN - EMAIL - LIST_BOX - MONTH - NAME - PERCENT - PHONE_NUMBER - RADIO - SOCIAL_SECURITY_NUMBER - STATE - TEXT - TEXT_AREA - USER - USER_LIST_BOX - WEBSITE - WHOLE_NUMBER - YEAR - YES_NO default_value: type: string description: The default value for this custom field, if any group_id: type: string description: The ID of the group this custom field belongs to example: 45 group_name: type: string description: The name of the group this custom field belongs to example: Personal Info field_name: type: string description: The database column name for this custom field. Use this value when filtering contacts (e.g. for field_name 'firstName1', filter with 'firstName1==John'). example: firstName1 CustomFieldOption: type: object properties: id: type: string label: type: string CustomFieldTab: type: object properties: id: type: string description: The unique identifier of the custom field tab example: 123 name: type: string description: The name of the custom field tab example: Personal Info order: type: integer format: int32 description: The display order of the tab example: 1 record_type: type: string description: The record type this tab belongs to (e.g., CONTACT, COMPANY, OPPORTUNITY, REFERRAL_PARTNER, ORDER, SUBSCRIPTION, TASK_NOTE_APPOINTMENT) enum: - CONTACT - REFERRAL_PARTNER - OPPORTUNITY - TASK_NOTE_APPOINTMENT - COMPANY - ORDER - SUBSCRIPTION example: CONTACT CustomFieldValueObject: type: object properties: id: type: string content: description: The value of the custom field. Text custom field values have a maximum length of 65535 characters. Error: type: object properties: code: type: integer format: int32 message: type: string status: type: string details: type: array items: $ref: '#/components/schemas/ErrorDetails' ErrorDetails: type: object properties: domain: type: string resource: type: string GetNoteResponse: type: object properties: id: type: string description: Note ID example: 12345 text: type: string description: Note content example: Called about the Q3 proposal title: type: string description: Note title example: Sales Call type: type: string description: Note type example: Call contact_id: type: string description: Associated contact ID example: 1001 assigned_to_user: $ref: '#/components/schemas/BasicUser' description: User assigned to this note create_time: type: string description: Creation timestamp (ISO-8601) example: '2024-01-10T08:00:00Z' update_time: type: string description: Last update timestamp (ISO-8601) example: '2024-03-15T10:30:00Z' last_updated_by_user_id: type: string description: ID of user who last updated example: 456 pinned_at: type: string description: Pin timestamp (ISO-8601), null if not pinned example: '2024-02-18T16:45:00Z' created_by_user_id: type: string description: ID of user who created example: 789 custom_fields: type: array description: Custom field values for the note example: - id: '1' content: Red - id: '2' content: Preferred items: $ref: '#/components/schemas/CustomFieldValueObject' ListCustomFieldGroupsResponse: type: object properties: groups: type: array items: $ref: '#/components/schemas/CustomFieldGroup' ListCustomFieldTabsResponse: type: object properties: tabs: type: array items: $ref: '#/components/schemas/CustomFieldTab' ListNoteTemplateResponse: type: object properties: note_templates: type: array items: $ref: '#/components/schemas/NoteTemplate' next_page_token: type: string ListNotesResponse: type: object properties: notes: type: array items: $ref: '#/components/schemas/Note' next_page_token: type: string Note: type: object properties: id: type: string description: Note ID example: 12345 text: type: string description: Note content example: Called about the Q3 proposal title: type: string description: Note title example: Sales Call type: type: string description: Note type example: Call contact_id: type: string description: Associated contact ID example: 1001 assigned_to_user: $ref: '#/components/schemas/BasicUser' description: User assigned to this note create_time: type: string description: Creation timestamp (ISO-8601) example: '2024-01-10T08:00:00Z' update_time: type: string description: Last update timestamp (ISO-8601) example: '2024-03-15T10:30:00Z' last_updated_by_user_id: type: string description: ID of user who last updated example: 456 pinned_at: type: string description: Pin timestamp (ISO-8601), null if not pinned example: '2024-02-18T16:45:00Z' created_by_user_id: type: string description: ID of user who created example: 789 custom_fields: type: array description: Custom field values for the note example: - id: '1' content: Red - id: '2' content: Preferred items: $ref: '#/components/schemas/CustomFieldValueObject' NoteTemplate: type: object properties: id: type: string description: Template ID example: 5001 title: type: string description: Template title example: Post-Sale Follow-up description: type: string description: Template description example: Follow up within 24 hours of purchase action_type: type: string description: Note action type example: Call assignment_user_id: type: integer format: int64 description: Default assigned user ID example: 100 notify_users: type: array description: List of user IDs to notify items: type: string ObjectModel: type: object properties: custom_fields: type: array items: $ref: '#/components/schemas/CustomFieldMetaData' optional_properties: type: array description: These fields are not transmitted by default on this model, but can be requested by specifying them in a comma-separated list in the optional_properties query parameter. items: type: string uniqueItems: true UpdateCustomFieldGroupRequest: type: object properties: name: type: string order: type: integer format: int32 tab_id: type: string UpdateCustomFieldMetaDataRequest: type: object properties: label: type: string options: type: array items: $ref: '#/components/schemas/CustomFieldOption' group_id: type: string required: - group_id UpdateCustomFieldTabRequest: type: object properties: name: type: string order: type: integer format: int32 UpdateNoteRequest: type: object properties: title: type: string description: A value for either `title` or `type` is required. example: Follow-up Meeting text: type: string description: Note content example: Discussed pricing for contract renewal type: type: string description: A value for either `title` or `type` is required. The value may be one of `Appointment`, `Call`, `Email`, `Fax`, `Letter` or `Other` in Keap Max/Pro, or an admin-configured value in Classic. example: Call user_id: type: string description: ID of user creating the note example: 123 is_pinned: type: boolean description: Whether to pin this note example: false custom_fields: type: array description: Custom field values for the note. An empty array resets all custom fields to their defaults. example: - id: '1' content: Red items: $ref: '#/components/schemas/CustomFieldValueObject' contact_id: type: string description: Associated contact ID example: 1001 required: - user_id UpdateNoteResponse: type: object properties: id: type: string description: Note ID example: 12345 text: type: string description: Note content example: Called about the Q3 proposal title: type: string description: Note title example: Sales Call type: type: string description: Note type example: Call contact_id: type: string description: Associated contact ID example: 1001 assigned_to_user: $ref: '#/components/schemas/BasicUser' description: User assigned to this note create_time: type: string description: Creation timestamp (ISO-8601) example: '2024-01-10T08:00:00Z' update_time: type: string description: Last update timestamp (ISO-8601) example: '2024-03-15T10:30:00Z' last_updated_by_user_id: type: string description: ID of user who last updated example: 456 pinned_at: type: string description: Pin timestamp (ISO-8601), null if not pinned example: '2024-02-18T16:45:00Z' created_by_user_id: type: string description: ID of user who created example: 789 custom_fields: type: array description: Custom field values for the note example: - id: '1' content: Red - id: '2' content: Preferred items: $ref: '#/components/schemas/CustomFieldValueObject' securitySchemes: oauth2: type: oauth2 flows: authorizationCode: authorizationUrl: https://accounts.infusionsoft.com/app/oauth/authorize tokenUrl: https://api.infusionsoft.com/token scopes: {} security: - oauth2: []