Files
hubspot-associations-openap…/agent.py
a2a-platform 9dba39124e deploy
2026-06-27 01:03:26 +00:00

622 lines
122 KiB
Python

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()