{"files":{"SKILL.md":"---\nname: crm-lists\ndescription: \"CRM Lists API skill. Use when working with CRM Lists for crm. Covers 30 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# CRM Lists\nAPI version: v3\n\n## Auth\nApiKey hapikey in query | OAuth2 | ApiKey private-app in header | ApiKey private-app-legacy in header\n\n## Base URL\nhttps://api.hubapi.com\n\n## Setup\n1. Set your API key in the appropriate header\n2. GET /crm/v3/lists -- verify access\n3. POST /crm/v3/lists -- create first list\n\n## Endpoints\n30 endpoints across 1 group. See references/api-spec.lap for full details.\n\n### Crm\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /crm/v3/lists |  |\n| POST | /crm/v3/lists |  |\n| GET | /crm/v3/lists/folders | Retrieves a folder. |\n| POST | /crm/v3/lists/folders | Creates a folder |\n| PUT | /crm/v3/lists/folders/move-list | Moves a list to a given folder |\n| DELETE | /crm/v3/lists/folders/{folderId} | Deletes a folder |\n| PUT | /crm/v3/lists/folders/{folderId}/move/{newParentFolderId} | Moves a folder |\n| PUT | /crm/v3/lists/folders/{folderId}/rename | Rename a folder |\n| GET | /crm/v3/lists/idmapping | Translate Legacy List Id to Modern List Id |\n| POST | /crm/v3/lists/idmapping | Translate Legacy List Id to Modern List Id in Batch |\n| GET | /crm/v3/lists/object-type-id/{objectTypeId}/name/{listName} | Retrieve List by Name |\n| POST | /crm/v3/lists/records/memberships/batch/read |  |\n| GET | /crm/v3/lists/records/{objectTypeId}/{recordId}/memberships | Get lists record is member of |\n| POST | /crm/v3/lists/search | Search Lists |\n| GET | /crm/v3/lists/{listId} | Fetch List by ID |\n| DELETE | /crm/v3/lists/{listId} | Delete a List |\n| GET | /crm/v3/lists/{listId}/memberships | Fetch List Memberships Ordered by ID |\n| DELETE | /crm/v3/lists/{listId}/memberships | Delete All Records from a List |\n| PUT | /crm/v3/lists/{listId}/memberships/add | Add Records to a List |\n| PUT | /crm/v3/lists/{listId}/memberships/add-and-remove | Add and/or Remove Records from a List |\n| PUT | /crm/v3/lists/{listId}/memberships/add-from/{sourceListId} | Add All Records from a Source List to a Destination List |\n| GET | /crm/v3/lists/{listId}/memberships/join-order | Fetch List Memberships Ordered by Added to List Date |\n| PUT | /crm/v3/lists/{listId}/memberships/remove | Remove Records from a List |\n| PUT | /crm/v3/lists/{listId}/restore | Restore a List |\n| GET | /crm/v3/lists/{listId}/schedule-conversion | Retrieve the conversion details for a list |\n| PUT | /crm/v3/lists/{listId}/schedule-conversion | Schedule or update the conversion of a list to static |\n| DELETE | /crm/v3/lists/{listId}/schedule-conversion | Cancel the conversion of a list |\n| GET | /crm/v3/lists/{listId}/size-and-edits-history/between |  |\n| PUT | /crm/v3/lists/{listId}/update-list-filters | Update List Filter Definition |\n| PUT | /crm/v3/lists/{listId}/update-list-name | Update List Name |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all lists?\" -> GET /crm/v3/lists\n- \"Create a list?\" -> POST /crm/v3/lists\n- \"List all folders?\" -> GET /crm/v3/lists/folders\n- \"Create a folder?\" -> POST /crm/v3/lists/folders\n- \"Delete a folder?\" -> DELETE /crm/v3/lists/folders/{folderId}\n- \"Update a move?\" -> PUT /crm/v3/lists/folders/{folderId}/move/{newParentFolderId}\n- \"List all idmapping?\" -> GET /crm/v3/lists/idmapping\n- \"Create a idmapping?\" -> POST /crm/v3/lists/idmapping\n- \"Get name details?\" -> GET /crm/v3/lists/object-type-id/{objectTypeId}/name/{listName}\n- \"Create a read?\" -> POST /crm/v3/lists/records/memberships/batch/read\n- \"List all memberships?\" -> GET /crm/v3/lists/records/{objectTypeId}/{recordId}/memberships\n- \"Create a search?\" -> POST /crm/v3/lists/search\n- \"Get list details?\" -> GET /crm/v3/lists/{listId}\n- \"Delete a list?\" -> DELETE /crm/v3/lists/{listId}\n- \"Update a add-from?\" -> PUT /crm/v3/lists/{listId}/memberships/add-from/{sourceListId}\n- \"List all join-order?\" -> GET /crm/v3/lists/{listId}/memberships/join-order\n- \"List all schedule-conversion?\" -> GET /crm/v3/lists/{listId}/schedule-conversion\n- \"List all between?\" -> GET /crm/v3/lists/{listId}/size-and-edits-history/between\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api CRM Lists\n@base https://api.hubapi.com\n@version v3\n@auth ApiKey hapikey in query | OAuth2 | ApiKey private-app in header | ApiKey private-app-legacy in header\n@endpoints 30\n@hint download_for_search\n@toc crm(30)\n\n@endpoint GET /crm/v3/lists\n@optional {includeFilters: bool=false, listIds: [str]}\n@returns(200) {lists: [map]} # successful operation\n\n@endpoint POST /crm/v3/lists\n@required {name: str # The name of the list, which must be globally unique across all public lists in the portal., objectTypeId: str # The object type ID of the type of objects that the list will store., processingType: str # The processing type of the list. One of: `SNAPSHOT`, `MANUAL`, or `DYNAMIC`.}\n@optional {customProperties: map # The list of custom properties to tie to the list. Custom property name is the key, the value is the value., filterBranch: any # Filter branch object containing filtering criteria for the list, listFolderId: int(int32) # The ID of the folder that the list should be created in. If left blank, then the list will be created in the root of the list folder structure., listPermissions: map{teamsWithEditAccess!: [int(int32)], usersWithEditAccess!: [int(int32)]}, membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}}\n@returns(200) {list: map{createdAt: str(date-time), createdById: str, deletedAt: str(date-time), filterBranch: any, filtersUpdatedAt: str(date-time), listId: str, listPermissions: map{teamsWithEditAccess: [int(int32)], usersWithEditAccess: [int(int32)]}, listVersion: int(int32), membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}, name: str, objectTypeId: str, processingStatus: str, processingType: str, size: int(int64), updatedAt: str(date-time), updatedById: str}} # successful operation\n\n@endpoint GET /crm/v3/lists/folders\n@desc Retrieves a folder.\n@optional {folderId: str=0 # The Id of the folder to retrieve.}\n@returns(200) {folder: map{childLists: [int(int32)], childNodes: [map], createdAt: str(date-time), id: str, name: str, parentFolderId: str, updatedAt: str(date-time), updatedContentsAt: str(date-time), userId: int(int32)}} # successful operation\n\n@endpoint POST /crm/v3/lists/folders\n@desc Creates a folder\n@required {name: str # The name of the folder to be created.}\n@optional {parentFolderId: str # The folder this should be created in, if not specified will be created in the root folder 0.}\n@returns(200) {folder: map{childLists: [int(int32)], childNodes: [map], createdAt: str(date-time), id: str, name: str, parentFolderId: str, updatedAt: str(date-time), updatedContentsAt: str(date-time), userId: int(int32)}} # successful operation\n\n@endpoint PUT /crm/v3/lists/folders/move-list\n@desc Moves a list to a given folder\n@required {listId: str # The Id of the list to move., newFolderId: str # The Id of folder to move the list to, the root folder is Id 0.}\n@returns(204) No content\n\n@endpoint DELETE /crm/v3/lists/folders/{folderId}\n@desc Deletes a folder\n@required {folderId: str # The ID of the folder to delete}\n@returns(204) No content\n\n@endpoint PUT /crm/v3/lists/folders/{folderId}/move/{newParentFolderId}\n@desc Moves a folder\n@required {folderId: str # The ID of the folder to move, newParentFolderId: str # The ID for the target parent folder.}\n@returns(200) {folder: map{childLists: [int(int32)], childNodes: [map], createdAt: str(date-time), id: str, name: str, parentFolderId: str, updatedAt: str(date-time), updatedContentsAt: str(date-time), userId: int(int32)}} # successful operation\n\n@endpoint PUT /crm/v3/lists/folders/{folderId}/rename\n@desc Rename a folder\n@required {folderId: str # The ID of the folder to rename}\n@optional {newFolderName: str # The new name of the folder.}\n@returns(200) {folder: map{childLists: [int(int32)], childNodes: [map], createdAt: str(date-time), id: str, name: str, parentFolderId: str, updatedAt: str(date-time), updatedContentsAt: str(date-time), userId: int(int32)}} # successful operation\n\n@endpoint GET /crm/v3/lists/idmapping\n@desc Translate Legacy List Id to Modern List Id\n@optional {legacyListId: str # The legacy list id from lists v1 API.}\n@returns(200) {legacyListId: str, listId: str} # successful operation\n\n@endpoint POST /crm/v3/lists/idmapping\n@desc Translate Legacy List Id to Modern List Id in Batch\n@returns(200) {legacyListIdsToIdsMapping: [map], missingLegacyListIds: [str]} # successful operation\n\n@endpoint GET /crm/v3/lists/object-type-id/{objectTypeId}/name/{listName}\n@desc Retrieve List by Name\n@required {listName: str # The name of the list to fetch. This is **not** case sensitive., objectTypeId: str # The object type ID of the object types stored by the list to fetch. For example, `0-1` for a `CONTACT` list.}\n@optional {includeFilters: bool=false # A flag indicating whether or not the response object list definition should include a filter branch definition. By default, object list definitions will not have their filter branch definitions included in the response.}\n@returns(200) {list: map{createdAt: str(date-time), createdById: str, deletedAt: str(date-time), filterBranch: any, filtersUpdatedAt: str(date-time), listId: str, listPermissions: map{teamsWithEditAccess: [int(int32)], usersWithEditAccess: [int(int32)]}, listVersion: int(int32), membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}, name: str, objectTypeId: str, processingStatus: str, processingType: str, size: int(int64), updatedAt: str(date-time), updatedById: str}} # successful operation\n\n@endpoint POST /crm/v3/lists/records/memberships/batch/read\n@required {inputs: [map{objectTypeId!: str, recordId!: str}]}\n@returns(200) {completedAt: str(date-time), links: map, requestedAt: str(date-time), results: [map], startedAt: str(date-time), status: str} # successful operation\n@returns(207) {completedAt: str(date-time), errors: [map], links: map, numErrors: int(int32), requestedAt: str(date-time), results: [map], startedAt: str(date-time), status: str} # multiple statuses\n\n@endpoint GET /crm/v3/lists/records/{objectTypeId}/{recordId}/memberships\n@desc Get lists record is member of\n@required {objectTypeId: str # Object type id of the record, recordId: str # Id of the record}\n@returns(200) {paging: map{next: map{after: str, link: str}, prev: map{before: str, link: str}}, results: [map], total: int(int64)} # successful operation\n\n@endpoint POST /crm/v3/lists/search\n@desc Search Lists\n@required {additionalProperties: [str] # The property names of any additional list properties to include in the response. Properties that do not exist or that are empty for a particular list are not included in the response.  By default, all requests will fetch the following properties for each list: `hs_list_size`, `hs_last_record_added_at`, `hs_last_record_removed_at`, `hs_folder_name`, and `hs_list_reference_count`., offset: int(int32) # Value used to paginate through lists. The `offset` provided in the response can be used in the next request to fetch the next page of results. Defaults to `0` if no offset is provided.}\n@optional {count: int(int32) # The number of lists to include in the response. Defaults to `20` if no value is provided. The max `count` is `500`., listIds: [str] # ILS list ids to be included in search results. If not specified, all lists matching other criteria will be included, objectTypeId: str, processingTypes: [str] # List processing types to be included in search results. If not specified, all lists with all processing types will be included., query: str # The `query` that will be used to search for lists by list name. If no `query` is provided, then the results will include all lists., sort: str # Sort field and order}\n@returns(200) {hasMore: bool, lists: [map], offset: int(int32), total: int(int32)} # successful operation\n\n@endpoint GET /crm/v3/lists/{listId}\n@desc Fetch List by ID\n@required {listId: str # The **ILS ID** of the list to fetch.}\n@optional {includeFilters: bool=false # A flag indicating whether or not the response object list definition should include a filter branch definition. By default, object list definitions will not have their filter branch definitions included in the response.}\n@returns(200) {list: map{createdAt: str(date-time), createdById: str, deletedAt: str(date-time), filterBranch: any, filtersUpdatedAt: str(date-time), listId: str, listPermissions: map{teamsWithEditAccess: [int(int32)], usersWithEditAccess: [int(int32)]}, listVersion: int(int32), membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}, name: str, objectTypeId: str, processingStatus: str, processingType: str, size: int(int64), updatedAt: str(date-time), updatedById: str}} # successful operation\n\n@endpoint DELETE /crm/v3/lists/{listId}\n@desc Delete a List\n@required {listId: str # The **ILS ID** of the list to delete.}\n@returns(204) No content\n\n@endpoint GET /crm/v3/lists/{listId}/memberships\n@desc Fetch List Memberships Ordered by ID\n@required {listId: str # The **ILS ID** of the list.}\n@optional {after: str # The paging offset token for the page that comes `after` the previously requested records.  If provided, then the records in the response will be the records following the offset, sorted in *ascending* order. Takes precedence over the `before` offset., before: str # The paging offset token for the page that comes `before` the previously requested records.  If provided, then the records in the response will be the records preceding the offset, sorted in *descending* order., limit: int(int32)=100 # The number of records to return in the response. The maximum `limit` is 250.}\n@returns(200) {paging: map{next: map{after: str, link: str}, prev: map{before: str, link: str}}, results: [map], total: int(int64)} # successful operation\n\n@endpoint DELETE /crm/v3/lists/{listId}/memberships\n@desc Delete All Records from a List\n@required {listId: str # The **ILS ID** of the `MANUAL` or `SNAPSHOT` list.}\n@returns(204) No content\n\n@endpoint PUT /crm/v3/lists/{listId}/memberships/add\n@desc Add Records to a List\n@required {listId: str # The **ILS ID** of the `MANUAL` or `SNAPSHOT` list.}\n@returns(200) {recordIdsMissing: [str], recordIdsRemoved: [str], recordsIdsAdded: [str]} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/memberships/add-and-remove\n@desc Add and/or Remove Records from a List\n@required {listId: str # The **ILS ID** of the `MANUAL` or `SNAPSHOT` list., recordIdsToAdd: [str], recordIdsToRemove: [str]}\n@returns(200) {recordIdsMissing: [str], recordIdsRemoved: [str], recordsIdsAdded: [str]} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/memberships/add-from/{sourceListId}\n@desc Add All Records from a Source List to a Destination List\n@required {listId: str # The **ILS ID** of the `MANUAL` or `SNAPSHOT` *destination list*, which the *source list* records are added to., sourceListId: str # The **ILS ID** of the *source list* to grab the records from, which are then added to the *destination list*.}\n@returns(204) No content\n\n@endpoint GET /crm/v3/lists/{listId}/memberships/join-order\n@desc Fetch List Memberships Ordered by Added to List Date\n@required {listId: str # The **ILS ID** of the list.}\n@optional {after: str # The paging offset token for the page that comes `after` the previously requested records.  If provided, then the records in the response will be the records following the offset, sorted in *ascending* order. Takes precedence over the `before` offset., before: str # The paging offset token for the page that comes `before` the previously requested records.  If provided, then the records in the response will be the records preceding the offset, sorted in *descending* order., limit: int(int32)=100 # The number of records to return in the response. The maximum `limit` is 250.}\n@returns(200) {paging: map{next: map{after: str, link: str}, prev: map{before: str, link: str}}, results: [map], total: int(int64)} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/memberships/remove\n@desc Remove Records from a List\n@required {listId: str # The **ILS ID** of the `MANUAL` or `SNAPSHOT` list.}\n@returns(200) {recordIdsMissing: [str], recordIdsRemoved: [str], recordsIdsAdded: [str]} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/restore\n@desc Restore a List\n@required {listId: str # The **ILS ID** of the list to restore.}\n@returns(204) No content\n\n@endpoint GET /crm/v3/lists/{listId}/schedule-conversion\n@desc Retrieve the conversion details for a list\n@required {listId: str # The ID of the list to schedule the conversion for.}\n@returns(200) {convertedAt: str(date-time), listId: str, requestedConversionTime: any} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/schedule-conversion\n@desc Schedule or update the conversion of a list to static\n@required {listId: str # The ID of the list to schedule the conversion for.}\n@returns(200) {convertedAt: str(date-time), listId: str, requestedConversionTime: any} # successful operation\n\n@endpoint DELETE /crm/v3/lists/{listId}/schedule-conversion\n@desc Cancel the conversion of a list\n@required {listId: str # The ID of the list that you want to cancel the conversion for.}\n@returns(204) No content\n\n@endpoint GET /crm/v3/lists/{listId}/size-and-edits-history/between\n@required {listId: str}\n@optional {endDate: str(date-time), startDate: str(date-time)}\n@returns(200) {editHistory: [str(date-time)], sizeHistory: [map]} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/update-list-filters\n@desc Update List Filter Definition\n@required {listId: str # The **ILS ID** of the list to update., filterBranch: any # Updated filtering criteria for the list}\n@optional {enrollObjectsInWorkflows: bool=false # A flag indicating whether or not the memberships added to the list as a result of the filter change should be enrolled in workflows that are relevant to this list.}\n@returns(200) {updatedList: map{createdAt: str(date-time), createdById: str, deletedAt: str(date-time), filterBranch: any, filtersUpdatedAt: str(date-time), listId: str, listPermissions: map{teamsWithEditAccess: [int(int32)], usersWithEditAccess: [int(int32)]}, listVersion: int(int32), membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}, name: str, objectTypeId: str, processingStatus: str, processingType: str, size: int(int64), updatedAt: str(date-time), updatedById: str}} # successful operation\n\n@endpoint PUT /crm/v3/lists/{listId}/update-list-name\n@desc Update List Name\n@required {listId: str # The **ILS ID** of the list to update.}\n@optional {includeFilters: bool=false # A flag indicating whether or not the response object list definition should include a filter branch definition. By default, object list definitions will not have their filter branch definitions included in the response., listName: str # The name to update the list to.}\n@returns(200) {updatedList: map{createdAt: str(date-time), createdById: str, deletedAt: str(date-time), filterBranch: any, filtersUpdatedAt: str(date-time), listId: str, listPermissions: map{teamsWithEditAccess: [int(int32)], usersWithEditAccess: [int(int32)]}, listVersion: int(int32), membershipSettings: map{includeUnassigned: bool, membershipTeamId: int(int32)}, name: str, objectTypeId: str, processingStatus: str, processingType: str, size: int(int64), updatedAt: str(date-time), updatedById: str}} # successful operation\n\n@end\n"}}