openapi: 3.1.0 info: title: Keap Contact 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: Contact paths: /rest/v2/contacts: get: tags: - Contact summary: List Contacts description: Retrieves a list of Contacts operationId: listContacts parameters: - name: filter in: query description: "Filter to apply, allowed fields are:\n- (String) `email` — supports wildcard (e.g.\ \ `email==john*`)\n- (String) `given_name` — supports wildcard (e.g. `given_name==Mar*`)\n-\ \ (String) `family_name` — supports wildcard (e.g. `family_name==Smi*`)\n- (String) `middle_name`\ \ — supports wildcard (e.g. `middle_name==J*`)\n- (String) `company_id`\n- (Set[String]) `contact_ids`\n\ - (Set[String]) `ids` — accepts a list of contact IDs (e.g. `ids==1,2,3`)\n- (String) `start_update_time`\n\ - (String) `end_update_time`\n- (String) `phone_number` — the phone number to search for. Requires\ \ `phone_fields` to be specified; only the specified phone fields are searched.\n- (Set[String])\ \ `phone_fields` — restricts which phone fields to search (e.g. PHONE1, PHONE2, or comma-separated\ \ list PHONE1,PHONE2,PHONE3,PHONE4,PHONE5). Required when `phone_number` is supplied.\n- (String)\ \ `billing_address_line1`\n- (String) `billing_address_locality`\n- (String) `billing_address_region`\ \ (long-form region/state name, e.g. \"Arizona\")\n- (String) `billing_address_postal_code`\n\ - (String) `billing_address_country_code` (ISO 3166-1 alpha-3, e.g. \"USA\")\n- (String) `shipping_address_line1`\n\ - (String) `shipping_address_locality`\n- (String) `shipping_address_region`\n- (String) `shipping_address_postal_code`\n\ - (String) `shipping_address_country_code`\n- (String) `other_address_line1`\n- (String) `other_address_locality`\n\ - (String) `other_address_region`\n- (String) `other_address_postal_code`\n- (String) `other_address_country_code`\n\ - (String) `city` — primary-address city (Contact.City); supports prefix wildcard (e.g. `city==Chan*`,\ \ \"starts with\")\n- (String) `state` — primary-address state/region (Contact.State); supports\ \ prefix wildcard (e.g. `state==Ar*`, \"starts with\")\n- (String) `website` — supports wildcard\ \ (e.g. `website==https://example*`)\n- (String) `lead_source_name` — supports wildcard (e.g.\ \ `lead_source_name==Google*`)\n- (String) `contact_id` — supports comparison operators: `==`,\ \ `>`, `<`, `>=`, `<=`\n(e.g. `contact_id>5` encoded as `contact_id%3E5`)\nCustom fields can\ \ be filtered by their field_name (case-insensitive, as returned\nby GET /v2/contacts/model).\ \ A standard field above takes precedence over a custom\nfield with the same name. The supported\ \ operators depend on the custom field's type:\n- Text-like fields (text, text area, name, email,\ \ phone, website, social security\n number) and single-value choice fields with text options\ \ (dropdown, radio,\n state): `==` only, with optional trailing wildcard (e.g. `firstName1%3D%3DValue%2A`)\n\ - Yes/No and drilldown fields: `==` only\n- Numeric fields (whole number, decimal, currency,\ \ percent, year, month, day of\n week, user): `==`, `>`, `<`, `>=`, `<=`\n- Date fields: `==`,\ \ `>`, `<`, `>=`, `<=`; the value must be a full ISO-8601 date-time with milliseconds and a\ \ timezone offset (e.g. `2026-01-01T00:00:00.000Z`), the same format as `start_update_time`/`end_update_time`.\ \ Date-only values such as `2026-01-01` are rejected\n- Multi-select fields: `==` matches records\ \ that contain the given option\nCustom field filtering on non-indexed fields is supported but\ \ may be slower.\n\nYou will need to apply the `==` operator to check the equality of one of\ \ the filters with your searched\nword, in the encoded form `%3D%3D`.\nFor wildcard filtering,\ \ use `*` at the end of the value (prefix matching), encoded as `%2A`.\nFor the filters listed\ \ above, here are some examples:\n- `filter=given_name%3D%3DMary`\n- `filter=given_name%3D%3DMar%2A`\ \ (wildcard: starts with \"Mar\")\n- `filter=company_id%3D%3D123`\n- `filter=company_id%3D%3D123%3Bfamily_name%3D%3DSmith`\n\ - `filter=billing_address_locality%3D%3DChandler`\n- `filter=city%3D%3DChandler` (city exact\ \ match)\n- `filter=city%3D%3DChan%2A` (city prefix wildcard: starts with \"Chan\")\n- `filter=city%3D%3DChandler%3Bstate%3D%3DArizona`\ \ (combined city + state filter)\n- `filter=shipping_address_country_code%3D%3DUSA%3Bshipping_address_region%3D%3DArizona`\n\ - `filter=contact_id%3E5` (contact_id > 5)\n- `filter=ids%3D%3D1,2,3` (contacts with IDs 1,\ \ 2, or 3)\n\nCustom field examples (for custom fields with field_name `firstName1` and `Score0`):\n\ - `filter=firstName1%3D%3DJohn` (custom field exact match)\n- `filter=firstName1%3D%3DJo%2A`\ \ (custom field prefix wildcard)\n- `filter=Score0%3E100` (custom field numeric comparison)\n\ - `filter=given_name%3D%3DJohn%3BStatus0%3D%3DActive` (combined standard + custom field filter)\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` - `email` - `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 Contact properties to include in the response. (Available fields are: addresses,anniversary_date,birth_date,company,contact_type,create_time, custom_fields,email_addresses,family_name,fax_numbers,given_name,id,job_title,leadsource_id, links,middle_name,notes,origin,owner_id,phone_numbers,preferred_locale,preferred_name,prefix, referral_code,score_value,social_accounts,source_type,spouse_name,suffix,tag_ids,time_zone, update_time,utm_parameters,website,account_id,assistant_name,assistant_phone, billing_information,created_by,groups,last_updated_by)' 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/ListContactsResponse' post: tags: - Contact summary: Create a Contact description: 'Creates a new Contact. *Note:* Contact must contain at least one item in `email_addresses`, `phone_numbers`, or `addresses` and `country_code` is required if `region` is specified. Optionally accepts a `duplicate_option` query parameter which performs duplicate checking by one of the following options: `Email`, `EmailAndName`, `EmailAndNameAndCompany`. If a match is found using the option provided, the existing contact will be updated. If an existing contact was not found using the `duplicate_option` provided, a new contact record will be created. When `duplicate_option` is not specified, a new contact is always created.' operationId: createContact parameters: - name: duplicate_option in: query description: Duplicate check strategy. If provided, performs duplicate checking and updates the existing contact if a match is found. required: false schema: type: string enum: - Email - EmailAndName - EmailAndNameAndCompany - name: fields in: query description: 'Comma-delimited list of Contact properties to include in the response. (Available fields are: addresses,anniversary_date,birth_date,company,contact_type,create_time, custom_fields,email_addresses,family_name,fax_numbers,given_name,id,job_title,leadsource_id, links,middle_name,notes,origin,owner_id,phone_numbers,preferred_locale,preferred_name,prefix, referral_code,score_value,social_accounts,source_type,spouse_name,suffix,tag_ids,time_zone, update_time,utm_parameters,website,account_id,assistant_name,assistant_phone, billing_information,created_by,groups,last_updated_by)' schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateUpdateContactRequest' 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 - existing contact updated content: application/json: schema: $ref: '#/components/schemas/Contact' '201': description: Created - new contact created content: application/json: schema: $ref: '#/components/schemas/Contact' /rest/v2/contacts:unlink: post: tags: - Contact summary: Delete Link between two Contacts description: Deletes Link between two Contacts operationId: unlinkContacts requestBody: content: application/json: schema: $ref: '#/components/schemas/LinkContactsRequest' 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' '204': description: No Content /rest/v2/contacts:merge: post: tags: - Contact summary: Merge two Contacts description: Merges two Contacts together. The duplicate contact will be merged into the primary contact. operationId: mergeContacts parameters: - name: fields in: query description: 'Comma-delimited list of Contact properties to include in the response. (Available fields are: addresses,anniversary_date,birth_date,company,contact_type,create_time, custom_fields,email_addresses,family_name,fax_numbers,given_name,id,job_title,leadsource_id, links,middle_name,notes,origin,owner_id,phone_numbers,preferred_locale,preferred_name,prefix, referral_code,score_value,social_accounts,source_type,spouse_name,suffix,tag_ids,time_zone, update_time,utm_parameters,website,account_id,assistant_name,assistant_phone, billing_information,created_by,groups,last_updated_by)' schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MergeContactRequest' 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/Contact' /rest/v2/contacts:link: post: tags: - Contact summary: Link Contacts description: Links two Contacts together using the provided Link type operationId: linkContacts requestBody: content: application/json: schema: $ref: '#/components/schemas/LinkContactsRequest' 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/ContactLink' /rest/v2/contacts/model/customFields: post: tags: - Contact summary: Create a Contact Custom Field description: Creates a custom field of the specified type and options to the Contact object operationId: createContactCustomField 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/contacts/model/customFields/tabs: get: tags: - Contact summary: List Contact Custom Field Tabs description: Retrieves a list of custom field tabs for the Contact record type. operationId: listContactCustomFieldTabs 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: - Contact summary: Create a Contact Custom Field Tab description: Creates a new custom field tab for the Contact record type. operationId: createContactCustomFieldTab 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/contacts/model/customFields/groups: get: tags: - Contact summary: List Contact Custom Field Groups description: Retrieves a list of custom field groups for the Contact record type. Optionally filter by tab_id to scope to a specific tab. operationId: listContactCustomFieldGroups 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: - Contact summary: Create a Contact Custom Field Group description: Creates a new custom field group for the Contact record type. If `tab_id` is omitted, the group is added to the default 'Custom Fields' tab. operationId: createContactCustomFieldGroup 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/links/types: get: tags: - Contact summary: List Contact Link types description: Retrieves a list of Contact Link types. operationId: listContactLinkTypes parameters: - name: filter in: query description: 'Filter to apply, allowed fields are: - (String) `name` 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=name%3D%3DexpectedValue` ' 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: - `name` - `max_links` - `create_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 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/ListContactLinkTypesResponse' post: tags: - Contact summary: Create a Contact Link type description: Creates a new type of Contact Link operationId: createContactLinkType requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateContactLinkTypeRequest' 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/ContactLinkType' /rest/v2/contacts/{contact_id}: get: tags: - Contact summary: Retrieve a Contact description: Retrieves a single Contact operationId: getContact parameters: - name: contact_id in: path required: true schema: type: string - name: fields in: query description: 'Comma-delimited list of Contact properties to include in the response. (Available fields are: addresses,anniversary_date,birth_date,company,contact_type,create_time, custom_fields,email_addresses,family_name,fax_numbers,given_name,id,job_title,leadsource_id, links,middle_name,notes,origin,owner_id,phone_numbers,preferred_locale,preferred_name,prefix, referral_code,score_value,social_accounts,source_type,spouse_name,suffix,tag_ids,time_zone, update_time,utm_parameters,website,account_id,assistant_name,assistant_phone, billing_information,created_by,groups,last_updated_by)' 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/Contact' delete: tags: - Contact summary: Delete a Contact description: Deletes the specified Contact operationId: deleteContact parameters: - name: contact_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: - Contact summary: Update a Contact description: Updates a Contact operationId: updateContact parameters: - name: contact_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: - addresses - anniversary_date - birth_date - company - contact_type - create_time - custom_fields - email_addresses - family_name - fax_numbers - given_name - id - job_title - leadsource_id - links - middle_name - notes - origin - owner_id - phone_numbers - preferred_locale - preferred_name - prefix - referral_code - score_value - social_accounts - source_type - spouse_name - suffix - tag_ids - time_zone - update_time - utm_parameters - website - account_id - assistant_name - assistant_phone - billing_information - created_by - groups - last_updated_by uniqueItems: true - name: fields in: query description: 'Comma-delimited list of Contact properties to include in the response. (Available fields are: addresses,anniversary_date,birth_date,company,contact_type,create_time, custom_fields,email_addresses,family_name,fax_numbers,given_name,id,job_title,leadsource_id, links,middle_name,notes,origin,owner_id,phone_numbers,preferred_locale,preferred_name,prefix, referral_code,score_value,social_accounts,source_type,spouse_name,suffix,tag_ids,time_zone, update_time,utm_parameters,website,account_id,assistant_name,assistant_phone, billing_information,created_by,groups,last_updated_by)' schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateUpdateContactRequest' 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/Contact' /rest/v2/contacts/model/customFields/tabs/{tab_id}: get: tags: - Contact summary: Retrieve a Contact Custom Field Tab description: Retrieves a single custom field tab by id for the Contact record type. operationId: getContactCustomFieldTab 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: - Contact summary: Delete a Contact Custom Field Tab description: Deletes a custom field tab. Returns 409 Conflict if the tab still contains groups. operationId: deleteContactCustomFieldTab 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: - Contact summary: Update a Contact Custom Field Tab description: Updates an existing custom field tab. Only fields listed in `update_mask` are applied. operationId: updateContactCustomFieldTab 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/contacts/model/customFields/groups/{group_id}: get: tags: - Contact summary: Retrieve a Contact Custom Field Group description: Retrieves a single custom field group by id for the Contact record type. operationId: getContactCustomFieldGroup 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: - Contact summary: Delete a Contact Custom Field Group description: Deletes a custom field group. Returns 409 Conflict if the group still contains custom fields. operationId: deleteContactCustomFieldGroup 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: - Contact summary: Update a Contact Custom Field Group description: Updates an existing custom field group. Only fields listed in `update_mask` are applied. operationId: updateContactCustomFieldGroup 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/links/types/{link_type_id}: delete: tags: - Contact summary: Delete a Contact Link type description: Deletes the specified Contact Link type. The Link type cannot be deleted if it is currently applied to any Linked Contacts. operationId: deleteContactLinkType parameters: - name: link_type_id in: path description: Contact Link type identifier 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: - Contact summary: Update a Contact Link type description: Updates the specified Contact Link type. Only fields listed in `update_mask` are applied. Reducing `max_links` below the current number of Linked Contacts of this type returns 409 Conflict. operationId: updateContactLinkType parameters: - name: link_type_id in: path description: Contact Link type identifier 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 - max_links uniqueItems: true requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateContactLinkTypeRequest' 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/ContactLinkType' /rest/v2/contacts/{contact_id}/tags: get: tags: - Contact summary: List Applied Tags description: Retrieves a list of tags applied to the specified Contact operationId: listTagsForContact parameters: - name: contact_id in: path description: Contact identifier required: true schema: type: string - name: filter in: query description: 'Filter to apply, allowed fields are: - (String) `name` - (String) `description` - (String) `category_id` (use `category_id==NONE` to filter tags not assigned to any category) - (String) `since_applied_time` - (String) `until_applied_time` - (String) `since_create_time` - (String) `until_create_time` - (String) `since_update_time` - (String) `until_update_time` 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=name%3D%3DCustomer` - `filter=category_id%3D%3D123` - `filter=category_id%3D%3DNONE` - `filter=since_applied_time%3D%3D2025-04-16T20:33:02.321Z;until_applied_time%3D%3D2025-08-16T20:33:02.321Z;` ' 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: - `name` - `create_time` - `update_time` - `applied_time` - `category_id` One of the following directions: - `asc` - `desc`' required: false schema: type: string - name: page_size in: query description: Total number of items to return per page required: false schema: type: integer format: int32 maximum: 1000 minimum: 0 example: 0 responses: '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: Not Found content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' '409': description: Conflict content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/Error' '501': description: Method Not Implemented content: application/json: schema: $ref: '#/components/schemas/Error' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/Error' '405': description: Method Not Allowed content: application/json: schema: $ref: '#/components/schemas/Error' '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListContactTagsResponse' /rest/v2/contacts/{contact_id}/links: get: tags: - Contact summary: List Linked Contacts description: Retrieves a list of Linked Contacts for a given Contact operationId: listContactLinks parameters: - name: contact_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/ListContactLinksResponse' /rest/v2/contacts/model: get: tags: - Contact summary: Retrieve Contact Model description: Get the custom fields and optional properties for the Contact object operationId: retrieveContactModel 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' /rest/v2/contacts/model/customFields/{custom_field_id}: delete: tags: - Contact summary: Delete a Contact Custom Field description: Deletes a custom field from the Contacts model operationId: deleteContactCustomField 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 components: schemas: Address: 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 AppliedTag: type: object description: Tag with application timestamp properties: tag: $ref: '#/components/schemas/Tag' description: The tag applied applied_time: type: string description: The time the tag was applied to the contact, in ISO 8601 format BasicCompany: type: object properties: id: type: string description: Company ID example: 100 company_name: type: string description: Company name example: Thryv CategoryReference: type: object properties: id: type: string description: The unique identifier for the tag category example: 123 required: - id Contact: type: object properties: id: type: string description: Unique identifier example: 1001 links: type: array items: $ref: '#/components/schemas/Link' addresses: type: array items: $ref: '#/components/schemas/Address' company: $ref: '#/components/schemas/BasicCompany' description: Associated company origin: $ref: '#/components/schemas/Origin' prefix: type: string description: Name prefix example: Dr. suffix: type: string description: Name suffix example: Jr website: type: string description: Personal website URL example: https://thryv.com groups: type: string update_time: type: string description: Last update timestamp (ISO-8601) example: '2024-03-15T10:30:00Z' create_time: type: string description: Creation timestamp (ISO-8601) example: '2024-01-10T08:00:00Z' score_value: type: string description: Contact score value example: 85 tag_ids: type: array items: type: string anniversary_date: type: string description: The anniversary date example: '2015-06-20' birth_date: type: string description: The birth date example: '1985-03-15' contact_type: type: string description: Type of contact example: Prospect custom_fields: type: array items: $ref: '#/components/schemas/CustomFieldValue' email_addresses: type: array items: $ref: '#/components/schemas/EmailAddress' family_name: type: string description: Last name / surname example: Smith fax_numbers: type: array items: $ref: '#/components/schemas/FaxNumber' given_name: type: string description: First name example: John job_title: type: string description: Job title example: Senior Software Engineer leadsource_id: type: string description: Lead source identifier example: 12 middle_name: type: string description: Middle name example: Robert owner_id: type: string description: ID of the user who owns this contact example: 45 phone_numbers: type: array items: $ref: '#/components/schemas/PhoneNumber' preferred_locale: type: string description: Preferred locale example: en_US preferred_name: type: string description: Preferred name or nickname example: Johnny referral_code: type: string description: Referral code example: REF2024ABC social_accounts: type: array items: $ref: '#/components/schemas/SocialAccount' source_type: type: string enum: - SOURCE_TYPE_UNSPECIFIED - API - APPOINTMENT - FORM_API_HOSTED - FORM_API_INTERNAL - IMPORT - INTERNAL_FORM - LANDING_PAGE - MANUAL - OTHER - UNKNOWN - WEBFORM spouse_name: type: string description: Spouse's name example: Jane Smith time_zone: type: string description: Contact's timezone example: America/New_York utm_parameters: type: array items: $ref: '#/components/schemas/ContactUtmResponse' account_id: type: string assistant_name: type: string assistant_phone: type: string billing_information: type: string created_by: type: string last_updated_by: type: string ContactLink: type: object properties: contact1_id: type: string description: First contact ID in the link example: 1001 contact2_id: type: string description: Second contact ID in the link example: 1002 link_type_id: type: string description: Link type ID example: 1 link_type_name: type: string description: Link type name example: Spouse ContactLinkType: type: object properties: id: type: string description: Link type ID example: 1 name: type: string description: Link type name example: Spouse max_links: type: integer format: int64 description: Maximum number of links allowed example: 1 create_time: type: string description: Creation timestamp (ISO-8601) example: '2024-01-15T10:30:00Z' ContactUtmResponse: type: object properties: id: type: integer format: int64 keapSourceId: type: string utmSource: type: string utmMedium: type: string utmTerm: type: string utmCampaign: type: string utmContent: type: string firstTouch: type: boolean lastTouch: type: boolean dateCreated: type: string format: date-time CreateContactLinkTypeRequest: type: object properties: name: type: string description: Link type name example: Spouse max_links: type: integer format: int64 description: Maximum number of links allowed (must be > 0) example: 1 CreateContactUtmPropertiesRequest: type: object properties: keap_source_id: type: string description: The formId example: 6088383224687662 utm_source: type: string description: UTM source information example: google utm_medium: type: string description: UTM medium information example: cpc utm_term: type: string description: UTM term information example: financial_consulting utm_campaign: type: string description: UTM campaign information example: spring_sale utm_content: type: string description: UTM content information example: textlink required: - keap_source_id 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 CreateUpdateContactRequest: type: object description: contact properties: addresses: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/Address' company: $ref: '#/components/schemas/BasicCompany' origin: $ref: '#/components/schemas/OriginRequest' prefix: type: string description: Name prefix example: Dr. suffix: type: string description: Name suffix example: Jr website: type: string description: Personal website URL example: https://thryv.com maxLength: 100 anniversary_date: type: string description: The anniversary date example: '2015-06-20' birth_date: type: string description: The birth date example: '1985-03-15' contact_type: type: string description: Type of contact example: Prospect custom_fields: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/CustomFieldValue' email_addresses: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/EmailAddressRequest' family_name: type: string description: Last name / surname example: Smith maxLength: 40 fax_numbers: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/FaxNumber' given_name: type: string description: First name example: John maxLength: 40 job_title: type: string description: Job title example: Senior Software Engineer maxLength: 255 leadsource_id: type: string description: Lead source identifier example: 12 middle_name: type: string description: Middle name example: Robert maxLength: 100 owner_id: type: string description: ID of the user who owns this contact example: 45 phone_numbers: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/PhoneNumber' preferred_locale: type: string description: Preferred locale example: en_US preferred_name: type: string description: Preferred name or nickname example: Johnny maxLength: 100 referral_code: type: string description: Referral code example: REF2024ABC social_accounts: type: array description: Any item not listed here will be removed if it already exists. If an empty array is specified, all existing values will be removed. items: $ref: '#/components/schemas/SocialAccount' source_type: type: string enum: - SOURCE_TYPE_UNSPECIFIED - API - APPOINTMENT - FORM_API_HOSTED - FORM_API_INTERNAL - IMPORT - INTERNAL_FORM - LANDING_PAGE - MANUAL - OTHER - UNKNOWN - WEBFORM spouse_name: type: string description: Spouse's name example: Jane Smith maxLength: 100 time_zone: type: string description: Contact's timezone example: America/New_York utm_parameters: $ref: '#/components/schemas/CreateContactUtmPropertiesRequest' assistant_name: type: string description: Assistant's name example: Pat Doe maxLength: 20 assistant_phone: type: string description: Assistant's phone number example: 5551234567 maxLength: 15 billing_information: type: string description: Billing information maxLength: 100 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 CustomFieldValue: 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. EmailAddress: type: object properties: email: type: string description: Email address. Maximum length is 75 characters for EMAIL1 and 100 characters for EMAIL2 and EMAIL3. example: john.smith@example.com field: type: string description: Email address slot enum: - EMAIL_FIELD_UNSPECIFIED - EMAIL1 - EMAIL2 - EMAIL3 example: EMAIL1 opt_in_reason: type: string description: Reason for opting in example: Subscribed via website form is_opt_in: type: boolean email_opt_status: type: string enum: - UNENGAGED_MARKETABLE - SINGLE_OPT_IN - DOUBLE_OPT_IN - CONFIRMED - UNENGAGED_NON_MARKETABLE - NON_MARKETABLE - LOCKDOWN - BOUNCE - HARD_BOUNCE - MANUAL - ADMIN - SYSTEM - LIST_UNSUBSCRIBE - FEEDBACK - SPAM - INVALID - DEACTIVATED EmailAddressRequest: type: object properties: email: type: string description: Email address. Maximum length is 75 characters for EMAIL1 and 100 characters for EMAIL2 and EMAIL3. example: john.smith@example.com field: type: string description: Email address slot enum: - EMAIL_FIELD_UNSPECIFIED - EMAIL1 - EMAIL2 - EMAIL3 example: EMAIL1 opt_in_reason: type: string description: Reason for opting in example: Subscribed via website form 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 FaxNumber: type: object properties: number: type: string description: Fax number example: 5551234568 type: type: string description: Fax type example: Work field: type: string description: Fax number slot enum: - FAX_NUMBER_FIELD_UNSPECIFIED - FAX1 - FAX2 example: FAX1 Link: type: object properties: id: type: string description: Link ID example: 1 linked_contact_id: type: string description: ID of the linked contact example: 2001 link_type_id: type: string description: Link type ID example: 1 link_type_name: type: string description: Link type name example: Spouse LinkContactsRequest: type: object properties: contact1_id: type: string description: First contact ID to link example: 1001 link_type_id: type: string description: Link type ID example: 1 contact2_id: type: string description: Second contact ID to link example: 1002 ListContactLinkTypesResponse: type: object properties: contact_link_types: type: array items: $ref: '#/components/schemas/ContactLinkType' next_page_token: type: string ListContactLinksResponse: type: object properties: links: type: array items: $ref: '#/components/schemas/ContactLink' next_page_token: type: string ListContactTagsResponse: type: object description: List of tags applied to a contact properties: tags: type: array items: $ref: '#/components/schemas/AppliedTag' next_page_token: type: string ListContactsResponse: type: object properties: contacts: type: array items: $ref: '#/components/schemas/Contact' next_page_token: type: string ListCustomFieldGroupsResponse: type: object properties: groups: type: array items: $ref: '#/components/schemas/CustomFieldGroup' ListCustomFieldTabsResponse: type: object properties: tabs: type: array items: $ref: '#/components/schemas/CustomFieldTab' MergeContactRequest: type: object properties: contact_id: type: string description: Primary contact ID to merge into example: 1001 duplicate_contact_id: type: string description: Duplicate contact ID to merge from example: 1002 required: - contact_id - duplicate_contact_id 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 Origin: type: object properties: date: type: string ip_address: type: string OriginRequest: type: object properties: ip_address: type: string PhoneNumber: 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' SocialAccount: type: object properties: name: type: string description: Social account username or handle. Maximum length is 255 characters. example: '@thryv' type: type: string description: Social account type enum: - SOCIAL_ACCOUNT_TYPE_UNSPECIFIED - FACEBOOK - LINKED_IN - TWITTER - INSTAGRAM - SNAPCHAT - YOUTUBE - PINTEREST example: FACEBOOK required: - type Tag: type: object properties: id: type: string description: The unique identifier for this tag example: 123 name: type: string description: The unique name of this tag example: VIP Customer description: type: string description: A description of this tag example: High-value customers category: $ref: '#/components/schemas/CategoryReference' description: The category this tag belongs to create_time: type: string format: date-time description: The time this tag was created, in ISO 8601 format example: '2024-01-10T08:00:00Z' update_time: type: string format: date-time description: The time this tag was last updated, in ISO 8601 format example: '2024-03-15T10:30:00Z' UpdateContactLinkTypeRequest: type: object properties: name: type: string description: Link type name example: Spouse max_links: type: integer format: int64 description: Maximum number of links allowed (must be > 0) example: 1 UpdateCustomFieldGroupRequest: type: object properties: name: type: string order: type: integer format: int32 tab_id: type: string UpdateCustomFieldTabRequest: type: object properties: name: type: string order: type: integer format: int32 securitySchemes: oauth2: type: oauth2 flows: authorizationCode: authorizationUrl: https://accounts.infusionsoft.com/app/oauth/authorize tokenUrl: https://api.infusionsoft.com/token scopes: {} security: - oauth2: []