Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.1.0","info":{"title":"Keap 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"}],"security":[{"oauth2":[]}],"paths":{"/rest/v2/automations/{automation_id}/unpublish":{"put":{"tags":["Automation"],"summary":"Unpublish an Automation","description":"Unpublishes a single automation","operationId":"unpublishAutomation","parameters":[{"name":"automation_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnpublishAutomationRequest"}}},"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"}}}},"/rest/v2/tasks":{"get":{"tags":["Task"],"summary":"List Tasks","description":"Retrieves a list of tasks based on the provided filter. Tasks which are not assigned to a User may be queried with user_id==UNASSIGNED.","operationId":"listTasks","parameters":[{"name":"filter","in":"query","description":"Filter to apply, allowed fields are:\n- (String) `contact_id`\n- (String) `has_due_date`\n- (String) `is_completed`\n- (String) `user_id`\n- (String) `opportunity_id`\n- (String) `task_ids`\n- (String) `priority` — one of `CRITICAL`, `ESSENTIAL`, `NONESSENTIAL`\n- (String) `since_time`\n- (String) `until_time`\n- (String) `id` — supports `==`, `>`, `<`, `>=`, `<=`\n- (String) `title` — supports prefix wildcard (`title==Foo*`)\n\nOperators must be URL-encoded (`==` → `%3D%3D`, `>` → `%3E`, `<` → `%3C`).\nFor the filters listed above, here are some examples:\n- `filter=contact_id%3D%3D123`\n- `filter=has_due_date%3D%3Dtrue`\n- `filter=is_completed%3D%3Dtrue`\n- `filter=user_id%3D%3D321`\n- `filter=opportunity_id%3D%3D321`\n- `filter=task_ids%3D%3D1,2,3`\n- `filter=priority%3D%3DCRITICAL`\n- `filter=since_time%3D%3D2025-04-16T20:33:02.321Z;`\n- `filter=until_time%3D%3D2025-08-16T20:33:02.321Z;`\n- `filter=id%3E5` (id > 5)\n- `filter=id%3C%3D100` (id <= 100)\n- `filter=title%3D%3DFollow%2A` (title starts with \"Follow\")\n\n**Custom fields:** tasks may also be filtered by any custom field defined on the Task record, referenced by its field name (e.g. `filter=cf_priority%3D%3D10`). Both indexed and non-indexed custom fields are filterable. Operators must be URL-encoded, same as the standard fields above. The supported operator and value depend on the field's data type:\n- Text-like fields (Text, Text Area, Name, Email, Website, Phone, Social Security Number) and choice fields with text options (Dropdown, Radio, State) — equals (`==`) and prefix wildcard (e.g. `cf_company%3D%3DAcme%2A`)\n- Numeric fields (Whole Number, Decimal, Currency, Percent, Year, Month, Day of Week, User) — equals and comparison (`==`, `>`, `<`, `>=`, `<=`)\n- Date and Date/Time fields — equals and comparison; the value must be a full ISO-8601 date-time with milliseconds and a timezone offset (e.g. `cf_renewDate%3C%3D2026-01-01T00:00:00.000Z`). Date-only values such as `2026-01-01` are rejected\n- Yes/No fields — equals only, value `0` (No) or `1` (Yes)\n- Drilldown fields — equals only, integer value\n- Multi-select fields (List Box, User List Box) — equals only, matched as a contains search over the stored selections (e.g. `cf_tags%3D%3Dred`)\nA custom field that does not exist, an operator unsupported for the field's type, or a value that does not match the field's type returns `400 Bad Request`.\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.\nOne of the following fields:\n- `id`\n- `create_time`\n- `due_time`\n- `update_time`\n\nOne of the following directions:\n- `asc`\n- `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 Task 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/ListTasksResponse"}}}}}},"post":{"tags":["Task"],"summary":"Create a Task","description":"Creates a new task as the authenticated user.","operationId":"createTask","parameters":[{"name":"fields","in":"query","description":"Comma-delimited list of optional Task 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/CreateTaskRequest"}}},"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/Task"}}}}}}},"/rest/v2/tasks/model/customFields":{"post":{"tags":["Task"],"summary":"Create a Custom Field","description":"Creates a custom field of the specified type and options to the Task object<br/>Note: Custom Fields for Tasks, Classic Appointments and Notes are combined.","operationId":"createTaskCustomField","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/CreateCustomFieldResponse"}}}}}}},"/rest/v2/tasks/model/customFields/tabs":{"get":{"tags":["Task"],"summary":"List Task Custom Field Tabs","description":"Retrieves a list of custom field tabs for the Task record type.<br/>Note: Custom Field Tabs for Tasks, Classic Appointments and Notes are combined.","operationId":"listTaskCustomFieldTabs","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":["Task"],"summary":"Create a Task Custom Field Tab","description":"Creates a new custom field tab for the Task record type.<br/>Note: Custom Field Tabs for Tasks, Classic Appointments and Notes are combined.","operationId":"createTaskCustomFieldTab","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/tasks/model/customFields/groups":{"get":{"tags":["Task"],"summary":"List Task Custom Field Groups","description":"Retrieves a list of custom field groups for the Task record type. Optionally filter by tab_id to scope to a specific tab.<br/>Note: Custom Field Groups for Tasks, Classic Appointments and Notes are combined.","operationId":"listTaskCustomFieldGroups","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":["Task"],"summary":"Create a Task Custom Field Group","description":"Creates a new custom field group for the Task record type. If `tab_id` is omitted, the group is added to the default 'Custom Fields' tab.<br/>Note: Custom Field Groups for Tasks, Classic Appointments and Notes are combined.","operationId":"createTaskCustomFieldGroup","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/tags":{"get":{"tags":["Tags"],"summary":"List Tags","description":"Retrieves a list of Tags defined in the application\nTo search for `null` or empty fields use `filter==NONE`","operationId":"listTags","parameters":[{"name":"filter","in":"query","description":"Filter to apply, allowed fields are:\n\n- (String) `name`\n- (String) `description`\n- (String) `category_id`\n- (String) `tag_ids`\n- (String) `since_create_time`\n- (String) `until_create_time`\n- (String) `since_update_time`\n- (String) `until_update_time`\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`. If NONE is passed in for `category_id` or `description`, it will check\nfor the non-existence of that field. For the filters listed above, here are some examples:\n\n- `filter=name%3D%3Dmy-tag`\n- `filter=category_id%3D%3DNONE`\n- `filter=description%3D%3DNONE`\n- `filter=tag_ids%3D%3D1,2,3`\n- `filter=since_create_time%3D%3D2024-12-22T01:00:00.000Z;until_create_time%3D%3D2025-01-01T00:00:00.000Z;`","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.\nOne of the following fields:\n\n- `name`\n- `create_time`\n- `update_time`\n\nOne of the following directions:\n- `asc`\n- `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/ListTagsResponse"}}}}}},"post":{"tags":["Tags"],"summary":"Create Tag","description":"Creates a new Tag","operationId":"createTag","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateTagRequest"}}},"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/Tag"}}}}}}},"/rest/v2/tags/{tag_id}/contacts:removeTags":{"post":{"tags":["Tags"],"summary":"Remove Tags","description":"Removes a Tag from a list of Contacts.","operationId":"removeTags","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRemoveTagRequest"}}},"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/tags/{tag_id}/contacts:applyTags":{"post":{"tags":["Tags"],"summary":"Apply Tag","description":"Applies a Tag to a list of Contacts.","operationId":"applyTags","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRemoveTagRequest"}}},"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/ApplyTagsResponse"}}}}}}},"/rest/v2/tags/categories":{"get":{"tags":["Tags"],"summary":"List Tag Categories","description":"Retrieves a list of defined Tag Categories\nTo search for `null` or empty fields use `filter==NONE`","operationId":"listTagCategories","parameters":[{"name":"filter","in":"query","description":"Filter to apply, allowed fields are:\n- (String) `name`\n- (String) `description`\n- (String) `since_create_time`\n- (String) `until_create_time`\n- (String) `since_update_time`\n- (String) `until_update_time`\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`. If NONE is passed in for `name` or `description`, it will check for the\nnon-existence of that field. For the filters listed above, here are some examples:\n- `filter=name%3D%3Dmy-tag-category`\n- `filter=description%3D%3DNONE`\n- `filter=since_create_time%3D%3D2024-12-22T01:00:00.000Z;until_create_time%3D%3D2025-01-01T00:00:00.000Z;`","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.\nOne of the following fields:\n- `name`\n- `create_time`\n- `update_time`\n\nOne of the following directions:\n- `asc`\n- `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/ListTagCategoriesResponse"}}}}}},"post":{"tags":["Tags"],"summary":"Create Tag Category","description":"Creates a new Tag Category.","operationId":"createTagCategory","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateTagCategoryRequest"}}},"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/TagCategory"}}}}}}},"/rest/v2/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List Subscriptions","description":"Retrieves a list of subscriptions using the specified search criteria.","operationId":"listSubscriptions","parameters":[{"name":"filter","in":"query","description":"Filter to apply, allowed fields are:\n- (String) `contact_id`\n- (String) `subscription_plan_id`\n- (String) `status`\n- (String) `id` - Allowable operators: \"==\", \"<=\", \"<\", \">=\", \">\", \"!=\"\n- (String) `billing_amount` - Allowable operators: \"==\", \"<=\", \"<\", \">=\", \">\", \"!=\"\n- (List[String]) `ids`\n- (List[String]) `subscription_plan_ids`\n\nCustom fields can be filtered by their field_name (case-insensitive, as returned\nby GET /v2/subscriptions/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. `_SubscriptionNote0%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: `==`, `>`, `<`, `>=`, `<=` using full ISO 8601\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 (or other supported operators), 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:\n- `filter=contact_id%3D%3D123`\n- `filter=subscription_plan_id%3D%3D456`\n- `filter=status%3D%3DActive`\n- `filter=id%3E5`\n- `filter=billing_amount%3E%3D100`\n- `filter=ids%3D%3D1,10,4,24`\n- `filter=subscription_plan_ids%3D%3D10,20,30`\n- `filter=contact_id%3D%3D123%3Bstatus%3D%3DActive`\n\nCustom field examples (for custom fields with field_name `_SubscriptionNote0` and `_SubscriptionCount1`):\n- `filter=_SubscriptionNote0%3D%3DTest` (custom field exact match)\n- `filter=_SubscriptionNote0%3D%3DTest%2A` (custom field prefix wildcard)\n- `filter=_SubscriptionCount1%3E100` (custom field numeric comparison)\n- `filter=contact_id%3D%3D123%3B_SubscriptionNote0%3D%3DActive` (combined standard + custom field filter)\n\nFor fields which allow wildcard matching, you may use the * wildcard character (or its encoded form %2A) for case-insensitive partial matching on text fields. Example of a valid pattern of wildcard usage:\n- `field==foo*` finds anything in `field` that begins with `foo`\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.\nOne of the following fields:\n- `id`\n- `contact_id`\n- `subscription_plan_id`\n- `modification_time`\n\nOne of the following directions:\n- `asc`\n- `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/ListSubscriptionsResponse"}}}}}},"post":{"tags":["Subscriptions"],"summary":"Create Subscription","description":"Creates a subscription with the specified product and product subscription id.","operationId":"createSubscription","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"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/Subscription"}}}}}}},"/rest/v2/subscriptions/{subscription_id}:invoice":{"post":{"tags":["Subscriptions"],"summary":"Invoice a Subscription",
# --- truncated at 32 KB (941 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/infusionsoft/refs/heads/main/openapi/infusionsoft-rest-v2-openapi.json