from __future__ import annotations import base64 import json import re from pathlib import Path from typing import Any import httpx from a2a_pack.deepagents import create_a2a_deep_agent from langchain_core.messages import BaseMessage from langchain_core.tools import StructuredTool from pydantic import BaseModel, Field from a2a_pack import ( A2AAgent, ConsumerSetup, ConsumerSetupField, ConsumerSetupMissing, EgressPolicy, LLMProvisioning, Pricing, Resources, RunContext, skill, ) DEFAULT_BASE_URL = "https://api.hubapi.com" OPERATIONS = json.loads("{\n \"delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"deletes all associations between two records.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"oauth2\": [\n \"oauth\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Delete associations between two records\",\n \"tags\": [\n \"Basic\"\n ]\n },\n \"get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve all associations between a specific record and an object type. Limit 500 per call.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The paging cursor token of the last successfully read resource will be returned as the `paging.next.after` JSON property of a paged response containing more results.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The maximum number of results to display per page.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 500,\n \"example\": null,\n \"format\": \"int32\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}\",\n \"request_body\": null,\n \"security\": [\n {\n \"oauth2\": [\n \"oauth\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Retrieve all associations by object type\",\n \"tags\": [\n \"Basic\"\n ]\n },\n \"post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Batch delete associations for objects\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/{fromObjectType}/{toObjectType}/batch/archive\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/BatchInputPublicAssociationMultiArchive\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Remove associations\",\n \"tags\": [\n \"Batch\"\n ]\n },\n \"post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create the default (most generic) association type between two object types\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/{fromObjectType}/{toObjectType}/batch/associate/default\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/BatchInputPublicDefaultAssociationMultiPost\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \" Create Default Associations\",\n \"tags\": [\n \"Batch\"\n ]\n },\n \"post_crm_v4_associations_from_object_type_to_object_type_batch_create_create\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Batch create associations for objects\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_create_create\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/{fromObjectType}/{toObjectType}/batch/create\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/BatchInputPublicAssociationMultiPost\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_create_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Associate records (labelled)\",\n \"tags\": [\n \"Batch\"\n ]\n },\n \"post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Batch delete specific association labels for objects. Deleting an unlabeled association will also delete all labeled associations between those two objects\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/{fromObjectType}/{toObjectType}/batch/labels/archive\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/BatchInputPublicAssociationMultiPost\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Delete Specific Labels\",\n \"tags\": [\n \"Batch\"\n ]\n },\n \"post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Batch read associations for objects to specific object type. The 'after' field in a returned paging object can be added alongside the 'id' to retrieve the next page of associations from that objectId. The 'link' field is deprecated and should be ignored. Note: The 'paging' field will only be present if there are more pages and absent otherwise.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/{fromObjectType}/{toObjectType}/batch/read\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/BatchInputPublicFetchAssociationsBatchRequest\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Retrieve associations\",\n \"tags\": [\n \"Batch\"\n ]\n },\n \"post_crm_v4_associations_usage_high_usage_report_user_id_request\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Requests a report of all objects in the portal which have a high usage of associations\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_crm_v4_associations_usage_high_usage_report_user_id_request\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"userId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"format\": \"int32\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/crm/v4/associations/usage/high-usage-report/{userId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"post_crm_v4_associations_usage_high_usage_report_user_id_request\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Report high usage\",\n \"tags\": [\n \"Report\"\n ]\n },\n \"put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create the default (most generic) association type between two object types\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"fromObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/objects/{fromObjectType}/{fromObjectId}/associations/default/{toObjectType}/{toObjectId}\",\n \"request_body\": null,\n \"security\": [\n {\n \"oauth2\": [\n \"oauth\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Associate records (default)\",\n \"tags\": [\n \"Basic\"\n ]\n },\n \"put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i\": {\n \"base_url\": \"https://api.hubapi.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Set association labels between two records.\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i\",\n \"parameters\": [\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"objectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectId\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"\",\n \"in\": \"path\",\n \"name\": \"toObjectType\",\n \"required\": true,\n \"schema\": {\n \"example\": null,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId}\",\n \"request_body\": {\n \"example\": null,\n \"items\": {\n \"$ref\": \"#/components/schemas/AssociationSpec\"\n },\n \"type\": \"array\"\n },\n \"security\": [\n {\n \"oauth2\": [\n \"oauth\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.tasks.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"media_bridge.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.calls.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.meetings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.users.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.orders.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.commercepayments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.services.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.subscriptions.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.invoices.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.highly_sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"e-commerce\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.appointments.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.companies.highly_sensitive.write.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.custom.highly_sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.goals.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.line_items.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.deals.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.projects.sensitive.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.write\"\n ]\n },\n {\n \"oauth2\": [\n \"tickets.highly_sensitive.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.leads.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.carts.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.emails.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.quotes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.write\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.partner-clients.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.notes.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.courses.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.listings.read\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.contacts.sensitive.read.v2\"\n ]\n },\n {\n \"oauth2\": [\n \"crm.objects.products.read\"\n ]\n }\n ],\n \"skill_name\": \"put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json\",\n \"source_title\": \"Associations\",\n \"summary\": \"Associate records (labelled)\",\n \"tags\": [\n \"Basic\"\n ]\n }\n}") OPERATION_GROUPS = json.loads("[]") ROOT_SECURITY = json.loads("[]") SECURITY_SCHEMES = json.loads("{\n \"developer_hapikey\": {\n \"in\": \"query\",\n \"name\": \"hapikey\",\n \"type\": \"apiKey\"\n },\n \"oauth2\": {\n \"flows\": {\n \"authorizationCode\": {\n \"authorizationUrl\": \"https://app.hubspot.com/oauth/authorize\",\n \"scopes\": {\n \"crm.objects.appointments.read\": \"\",\n \"crm.objects.appointments.sensitive.read.v2\": \"\",\n \"crm.objects.appointments.sensitive.write.v2\": \"\",\n \"crm.objects.appointments.write\": \"\",\n \"crm.objects.calls.read\": \"\",\n \"crm.objects.carts.read\": \"\",\n \"crm.objects.carts.write\": \"\",\n \"crm.objects.commercepayments.read\": \"\",\n \"crm.objects.commercepayments.write\": \"\",\n \"crm.objects.companies.highly_sensitive.read.v2\": \"\",\n \"crm.objects.companies.highly_sensitive.write.v2\": \"\",\n \"crm.objects.companies.read\": \"\",\n \"crm.objects.companies.sensitive.read.v2\": \"\",\n \"crm.objects.companies.sensitive.write.v2\": \"\",\n \"crm.objects.companies.write\": \"\",\n \"crm.objects.contacts.highly_sensitive.read.v2\": \"\",\n \"crm.objects.contacts.highly_sensitive.write.v2\": \"\",\n \"crm.objects.contacts.read\": \"\",\n \"crm.objects.contacts.sensitive.read.v2\": \"\",\n \"crm.objects.contacts.sensitive.write.v2\": \"\",\n \"crm.objects.contacts.write\": \"\",\n \"crm.objects.courses.read\": \"\",\n \"crm.objects.courses.write\": \"\",\n \"crm.objects.custom.highly_sensitive.read.v2\": \"\",\n \"crm.objects.custom.highly_sensitive.write.v2\": \"\",\n \"crm.objects.custom.read\": \"\",\n \"crm.objects.custom.sensitive.read.v2\": \"\",\n \"crm.objects.custom.sensitive.write.v2\": \"\",\n \"crm.objects.custom.write\": \"\",\n \"crm.objects.deals.highly_sensitive.read.v2\": \"\",\n \"crm.objects.deals.highly_sensitive.write.v2\": \"\",\n \"crm.objects.deals.read\": \"\",\n \"crm.objects.deals.sensitive.read.v2\": \"\",\n \"crm.objects.deals.sensitive.write.v2\": \"\",\n \"crm.objects.deals.write\": \"\",\n \"crm.objects.emails.read\": \"\",\n \"crm.objects.goals.read\": \"\",\n \"crm.objects.goals.write\": \"\",\n \"crm.objects.invoices.read\": \"\",\n \"crm.objects.invoices.write\": \"\",\n \"crm.objects.leads.read\": \"\",\n \"crm.objects.leads.write\": \"\",\n \"crm.objects.line_items.read\": \"\",\n \"crm.objects.line_items.write\": \"\",\n \"crm.objects.listings.read\": \"\",\n \"crm.objects.listings.write\": \"\",\n \"crm.objects.meetings.read\": \"\",\n \"crm.objects.notes.read\": \"\",\n \"crm.objects.orders.read\": \"\",\n \"crm.objects.orders.write\": \"\",\n \"crm.objects.partner-clients.read\": \"\",\n \"crm.objects.partner-clients.write\": \"\",\n \"crm.objects.partner-services.read\": \"\",\n \"crm.objects.partner-services.write\": \"\",\n \"crm.objects.products.read\": \"\",\n \"crm.objects.products.write\": \"\",\n \"crm.objects.projects.highly_sensitive.read\": \"\",\n \"crm.objects.projects.highly_sensitive.write\": \"\",\n \"crm.objects.projects.read\": \"\",\n \"crm.objects.projects.sensitive.read\": \"\",\n \"crm.objects.projects.sensitive.write\": \"\",\n \"crm.objects.projects.write\": \"\",\n \"crm.objects.quotes.read\": \"\",\n \"crm.objects.quotes.write\": \"\",\n \"crm.objects.services.read\": \"\",\n \"crm.objects.services.write\": \"\",\n \"crm.objects.subscriptions.read\": \"\",\n \"crm.objects.subscriptions.write\": \"\",\n \"crm.objects.tasks.read\": \"\",\n \"crm.objects.users.read\": \"\",\n \"crm.objects.users.write\": \"\",\n \"e-commerce\": \"\",\n \"media_bridge.read\": \"\",\n \"oauth\": \"\",\n \"tickets\": \"\",\n \"tickets.highly_sensitive.v2\": \"\",\n \"tickets.sensitive.v2\": \"\"\n },\n \"tokenUrl\": \"https://api.hubapi.com/oauth/v1/token\"\n }\n },\n \"type\": \"oauth2\"\n },\n \"private_apps\": {\n \"in\": \"header\",\n \"name\": \"private-app\",\n \"type\": \"apiKey\"\n },\n \"private_apps_legacy\": {\n \"in\": \"header\",\n \"name\": \"private-app-legacy\",\n \"type\": \"apiKey\"\n }\n}") SECURITY_FIELDS = json.loads("{\n \"developer_hapikey\": {\n \"field\": \"HAPIKEY\",\n \"kind\": \"apiKey\",\n \"location\": \"query\",\n \"name\": \"hapikey\"\n },\n \"oauth2\": {\n \"field\": \"OAUTH2\",\n \"kind\": \"oauth2\",\n \"scheme\": \"Bearer\"\n },\n \"private_apps\": {\n \"field\": \"PRIVATE_APP\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"private-app\"\n },\n \"private_apps_legacy\": {\n \"field\": \"PRIVATE_APP_LEGACY\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"private-app-legacy\"\n }\n}") PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}") SOURCE_ROOT = Path(globals().get("__file__", "agent.py")).resolve().parent SOURCE_SKILLS_DIR = SOURCE_ROOT / "skills" RUNTIME_SKILLS_DIR = ".deepagents/openapi-skills/" class OperationInput(BaseModel): parameters: dict[str, Any] = Field( default_factory=dict, description="Path, query, header, and cookie parameters keyed by OpenAPI parameter name.", ) body: Any | None = Field(default=None, description="JSON request body, when the operation accepts one.") class HubspotAssociationsOpenapiAgent(A2AAgent): name = "hubspot-associations-openapi-agent" description = "CRM relationship API for linking records and activities across object types." version = "v4" consumer_setup = ConsumerSetup.from_fields( ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://api.hubapi.com).", required=False, input_type="url"), ConsumerSetupField.secret("HAPIKEY", label="developer_hapikey API key", description="Sent as query parameter 'hapikey'.", required=False), ConsumerSetupField.secret("OAUTH2", label="oauth2 access token", description="OAuth/OIDC access token.", required=True), ConsumerSetupField.secret("PRIVATE_APP", label="private_apps API key", description="Sent as header parameter 'private-app'.", required=False), ConsumerSetupField.secret("PRIVATE_APP_LEGACY", label="private_apps_legacy API key", description="Sent as header parameter 'private-app-legacy'.", required=False), ) llm_provisioning = LLMProvisioning.PLATFORM pricing = Pricing( price_per_call_usd=0.0, caller_pays_llm=True, notes="Uses the caller's saved LLM credential through ctx.llm.", ) resources = Resources(cpu="200m", memory="512Mi") egress = EgressPolicy( allow_hosts=('api.hubapi.com',), deny_internet_by_default=True, ) tools_used = ("openapi", "deepagents") capabilities = { "openapi_auto_agent": { "operation_count": len(OPERATIONS), "default_base_url": DEFAULT_BASE_URL, "source_openapi_url": 'https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json', "source_openapi_urls": ['https://raw.githubusercontent.com/HubSpot/HubSpot-public-api-spec-collection/main/PublicApiSpecs/CRM/Associations/Rollouts/130902/v4/associations.json'], "server_urls": ['https://api.hubapi.com'], "regenerable": True, "security_schemes": list(SECURITY_SCHEMES), } } @skill( name="auto", description="Use the OpenAPI service to complete a natural-language goal.", tags=("openapi", "auto"), timeout_seconds=900, ) async def auto(self, ctx: RunContext, goal: str) -> dict[str, Any]: creds = ctx.llm if not creds.api_key: return { "error": "llm_credentials_missing", "final": ( "LLM key required. Add an LLM credential in Settings > " "LLM credentials before running this agent." ), "messages": [], } graph = create_a2a_deep_agent( ctx, creds=creds, tools=self._operation_tools(ctx), system_prompt=self._system_prompt(), ) result = await graph.ainvoke({"messages": [{"role": "user", "content": goal}]}) messages = result.get("messages", []) if isinstance(result, dict) else [] final = _message_text(messages[-1]) if messages else result return { "final": final, "messages": [_message_to_dict(message) for message in messages[-8:]], } @skill( name="post_crm_v4_associations_usage_high_usage_report_user_id_request", description="POST /crm/v4/associations/usage/high-usage-report/{userId} - Report high usage", tags=('Report',), timeout_seconds=120, ) async def post_crm_v4_associations_usage_high_usage_report_user_id_request( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_usage_high_usage_report_user_id_request", parameters=parameters or {}, body=body, ) @skill( name="post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive", description="POST /crm/v4/associations/{fromObjectType}/{toObjectType}/batch/archive - Remove associations", tags=('Batch',), timeout_seconds=120, ) async def post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_from_object_type_to_object_type_batch_archive_archive", parameters=parameters or {}, body=body, ) @skill( name="post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default", description="POST /crm/v4/associations/{fromObjectType}/{toObjectType}/batch/associate/default - Create Default Associations", tags=('Batch',), timeout_seconds=120, ) async def post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_from_object_type_to_object_type_batch_associate_default", parameters=parameters or {}, body=body, ) @skill( name="post_crm_v4_associations_from_object_type_to_object_type_batch_create_create", description="POST /crm/v4/associations/{fromObjectType}/{toObjectType}/batch/create - Associate records (labelled)", tags=('Batch',), timeout_seconds=120, ) async def post_crm_v4_associations_from_object_type_to_object_type_batch_create_create( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_from_object_type_to_object_type_batch_create_create", parameters=parameters or {}, body=body, ) @skill( name="post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar", description="POST /crm/v4/associations/{fromObjectType}/{toObjectType}/batch/labels/archive - Delete Specific Labels", tags=('Batch',), timeout_seconds=120, ) async def post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_from_object_type_to_object_type_batch_labels_archive_ar", parameters=parameters or {}, body=body, ) @skill( name="post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page", description="POST /crm/v4/associations/{fromObjectType}/{toObjectType}/batch/read - Retrieve associations", tags=('Batch',), timeout_seconds=120, ) async def post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "post_crm_v4_associations_from_object_type_to_object_type_batch_read_get_page", parameters=parameters or {}, body=body, ) @skill( name="put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec", description="PUT /crm/v4/objects/{fromObjectType}/{fromObjectId}/associations/default/{toObjectType}/{toObjectId} - Associate records (default)", tags=('Basic',), timeout_seconds=120, ) async def put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "put_crm_v4_objects_from_object_type_from_object_id_associations_default_to_objec", parameters=parameters or {}, body=body, ) @skill( name="get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page", description="GET /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType} - Retrieve all associations by object type", tags=('Basic',), timeout_seconds=60, ) async def get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "get_crm_v4_objects_object_type_object_id_associations_to_object_type_get_page", parameters=parameters or {}, body=body, ) @skill( name="put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i", description="PUT /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} - Associate records (labelled)", tags=('Basic',), timeout_seconds=120, ) async def put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "put_crm_v4_objects_object_type_object_id_associations_to_object_type_to_object_i", parameters=parameters or {}, body=body, ) @skill( name="delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec", description="DELETE /crm/v4/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId} - Delete associations between two records", tags=('Basic',), timeout_seconds=120, ) async def delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec( self, ctx: RunContext, parameters: dict[str, Any] | None = None, body: Any | None = None, ) -> dict[str, Any]: return await self._request( ctx, "delete_crm_v4_objects_object_type_object_id_associations_to_object_type_to_objec", parameters=parameters or {}, body=body, ) def _operation_subagents(self, ctx: RunContext, skills_root: str) -> list[dict[str, Any]]: subagents: list[dict[str, Any]] = [] for group in OPERATION_GROUPS: skill_path = ( f"{skills_root}{group['skill_dir']}/" if skills_root else "" ) subagent = { "name": group["subagent_name"], "description": group["description"], "system_prompt": self._subagent_prompt(group), "tools": self._operation_tools(ctx, set(group["operation_ids"])), } if skill_path: subagent["skills"] = [skill_path] subagents.append(subagent) return subagents def _operation_tools( self, ctx: RunContext, operation_ids: set[str] | None = None, ) -> list[StructuredTool]: tools: list[StructuredTool] = [] for operation_id, operation in OPERATIONS.items(): if operation_ids is not None and operation_id not in operation_ids: continue async def call( parameters: dict[str, Any] | None = None, body: Any | None = None, *, _operation_id: str = operation_id, ) -> dict[str, Any]: return await self._request( ctx, _operation_id, parameters=parameters or {}, body=body, ) tools.append( StructuredTool.from_function( coroutine=call, name=operation["skill_name"], description=self._tool_description(operation), args_schema=OperationInput, ) ) return tools def _system_prompt(self) -> str: if OPERATION_GROUPS: lines = [ "You coordinate route-specific OpenAPI subagents.", "Delegate API work to the matching subagent with the task tool.", "Do not invent API responses; ask subagents to call their tools for real results.", "If a subagent reports missing consumer setup, tell the user which setup field is required.", "If a subagent reports that the generated OpenAPI agent may be stale, ask whether the user wants to refresh it from the latest OpenAPI spec.", "", "Available route groups:", ] for group in OPERATION_GROUPS: lines.append( f"- {group['subagent_name']}: {group['description']}" ) return "\n".join(lines) lines = [ "You operate an API through generated OpenAPI tools.", "Call tools to get real results. Do not invent API responses.", "For write, update, or delete operations, explain the intended action before calling the tool.", "If an operation reports missing consumer setup, tell the user which setup field is required.", "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, tell the user this generated agent may need to be refreshed from the latest OpenAPI spec and ask whether they want to refresh it.", "", "Available operations:", ] for operation in OPERATIONS.values(): marker = "WRITE" if operation.get("destructive") else "READ" lines.append( f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} — {operation['summary']}" ) return "\n".join(lines) def _subagent_prompt(self, group: dict[str, Any]) -> str: lines = [ "You operate one route group from a generated OpenAPI API.", "Use the available operation tools to make real API calls. Do not invent API responses.", "Read the route group's SKILL.md when it applies; it lists every route you cover.", "For write, update, or delete operations, explain the intended action before calling the tool.", "If an operation reports missing consumer setup, return the exact setup field name.", "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, say the generated agent may need to be refreshed from the latest OpenAPI spec.", "", f"Route group: {group['label']}", f"Common prefix: {group.get('common_prefix') or '/'}", "Available operation tools:", ] for operation_id in group["operation_ids"]: operation = OPERATIONS[operation_id] marker = "WRITE" if operation.get("destructive") else "READ" lines.append( f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} - {operation['summary']}" ) return "\n".join(lines) def _tool_description(self, operation: dict[str, Any]) -> str: parts = [ f"{operation['method']} {operation['path']}", str(operation.get("description") or operation.get("summary") or ""), ] if operation.get("parameters"): parts.append( "Parameters: " + ", ".join( f"{p['name']} in {p['in']}{' required' if p.get('required') else ''}" for p in operation["parameters"] ) ) if operation.get("request_body") is not None: parts.append("Accepts a JSON request body.") return "\n".join(part for part in parts if part) async def _request( self, ctx: RunContext, operation_id: str, *, parameters: dict[str, Any], body: Any | None, ) -> dict[str, Any]: operation = OPERATIONS[operation_id] default_base_url = str(operation.get("base_url") or DEFAULT_BASE_URL).rstrip("/") base_url_field = str(operation.get("base_url_field") or "OPENAPI_BASE_URL") base_url = str(ctx.consumer_config(base_url_field, default_base_url) or default_base_url).rstrip("/") url, query, headers = self._request_parts(ctx, operation, parameters) request_kwargs: dict[str, Any] = { "params": query, "headers": headers, } if body is not None: if isinstance(body, (bytes, bytearray)): body = body.decode("utf-8", errors="replace") if isinstance(body, str): stripped = body.strip() if stripped and stripped[0] in "{[": try: body = json.loads(stripped) except ValueError: pass request_kwargs["json"] = body async with httpx.AsyncClient(timeout=60.0, follow_redirects=True) as client: response = await client.request( operation["method"], f"{base_url}{url}", **request_kwargs, ) content_type = response.headers.get("content-type", "") try: payload: Any = response.json() if "json" in content_type else response.text except ValueError: payload = response.text if response.status_code >= 400: out = { "ok": False, "status_code": response.status_code, "operation_id": operation_id, "error": payload, } if response.status_code in {404, 405, 410, 422}: out["stale_openapi_hint"] = ( "This generated OpenAPI agent may be stale. Ask the user " "whether they want to refresh it from the latest OpenAPI spec." ) return out return { "ok": True, "status_code": response.status_code, "operation_id": operation_id, "result": payload, } def _request_parts( self, ctx: RunContext, operation: dict[str, Any], parameters: dict[str, Any], ) -> tuple[str, dict[str, Any], dict[str, str]]: path = operation["path"] query: dict[str, Any] = {} headers: dict[str, str] = {} cookies: dict[str, Any] = {} for param in operation.get("parameters") or []: name = param["name"] if name not in parameters: if param.get("required"): raise ValueError(f"missing required parameter {name!r}") continue value = parameters[name] location = param["in"] if location == "path": path = path.replace("{" + name + "}", str(value)) elif location == "query": query[name] = value elif location == "header": headers[name] = str(value) elif location == "cookie": cookies[name] = value unresolved = PATH_PARAMETER_RE.findall(path) if unresolved: missing = ", ".join(sorted(set(unresolved))) raise ValueError("missing required path parameter(s): " + missing) if cookies: headers["cookie"] = "; ".join(f"{key}={value}" for key, value in cookies.items()) auth_headers, auth_query = self._auth_for_operation(ctx, operation) headers.update(auth_headers) query.update(auth_query) return path, query, headers def _auth_for_operation(self, ctx: RunContext, operation: dict[str, Any]) -> tuple[dict[str, str], dict[str, Any]]: requirements = operation.get("security") if requirements is None: requirements = ROOT_SECURITY if requirements == []: return {}, {} missing: list[str] = [] for requirement in requirements or []: if not isinstance(requirement, dict) or not requirement: return {}, {} headers: dict[str, str] = {} query: dict[str, Any] = {} ok = True for scheme_name in requirement: mapping = SECURITY_FIELDS.get(scheme_name) or {} secret_name = mapping.get("field") value = _consumer_secret_optional(ctx, secret_name) if secret_name else "" if not value: ok = False if secret_name: missing.append(secret_name) continue kind = mapping.get("kind") if kind == "apiKey": prefix = mapping.get("prefix") or "" sent_value = f"{prefix}{value}" if mapping.get("location") == "query": query[mapping.get("name") or scheme_name] = sent_value else: headers[mapping.get("name") or scheme_name] = sent_value elif kind in {"http", "oauth2"}: scheme = mapping.get("scheme") or "Bearer" if scheme.lower() == "basic": token = base64.b64encode(value.encode("utf-8")).decode("ascii") headers["authorization"] = f"Basic {token}" else: headers["authorization"] = f"{scheme} {value}" else: ok = False if ok: return headers, query if missing: raise ConsumerSetupMissing( "operation requires consumer setup secret(s): " + ", ".join(sorted(set(missing))) ) return {}, {} def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str: if not name: return "" try: return ctx.consumer_secret(name) except ConsumerSetupMissing: return "" def _runtime_skills_root(ctx: RunContext) -> str: workspace = getattr(ctx, "_workspace", None) prefixes = tuple(getattr(workspace, "write_prefixes", ()) or ()) if not prefixes: outputs_prefix = getattr(workspace, "outputs_prefix", None) prefixes = (outputs_prefix or "outputs/",) prefix = str(prefixes[0]).strip("/") return f"/{prefix}/{RUNTIME_SKILLS_DIR}" if prefix else f"/{RUNTIME_SKILLS_DIR}" def _seed_runtime_skills(backend: Any, ctx: RunContext) -> str: if not SOURCE_SKILLS_DIR.exists(): return "" runtime_root = _runtime_skills_root(ctx) uploads: list[tuple[str, bytes]] = [] for path in SOURCE_SKILLS_DIR.rglob("*"): if not path.is_file(): continue rel = path.relative_to(SOURCE_SKILLS_DIR).as_posix() uploads.append((runtime_root + rel, path.read_bytes())) if not uploads: return "" backend.upload_files(uploads) return runtime_root def _message_text(message: Any) -> Any: content = getattr(message, "content", message) return content def _message_to_dict(message: Any) -> dict[str, Any]: if isinstance(message, BaseMessage): return message.model_dump(mode="json") if hasattr(message, "model_dump"): return message.model_dump(mode="json") if isinstance(message, dict): return message return {"content": str(message)} agent = HubspotAssociationsOpenapiAgent()