Keap REST API v2

The default Keap REST API: 237 paths and 399 operations covering contacts, companies, tags, opportunities and stages, orders and order items, products, subscriptions and plans, notes, tasks, emails, automations, affiliates, lead sources, users and settings. Pages with opaque page_token cursors, filters with a filter expression parameter, and uses colon-suffixed custom verbs such as :merge, :applyTags and :achieve. Every major entity carries a per-tenant custom-field model. Authentication is a bearer token - OAuth 2.0 authorization code, a Personal Access Token, or a Service Account Key.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/rest-v2"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

infusionsoft-rest-v2-openapi.json Raw ↑
{"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