1560 lines
172 KiB
Python
1560 lines
172 KiB
Python
from __future__ import annotations
|
|
|
|
import base64
|
|
import json
|
|
import re
|
|
from typing import Any
|
|
|
|
import httpx
|
|
from deepagents import create_deep_agent
|
|
from langchain_core.messages import BaseMessage
|
|
from langchain_core.tools import StructuredTool
|
|
from langchain_openai import ChatOpenAI
|
|
from pydantic import BaseModel, Field
|
|
|
|
from a2a_pack import (
|
|
A2AAgent,
|
|
ConsumerSetup,
|
|
ConsumerSetupField,
|
|
ConsumerSetupMissing,
|
|
EgressPolicy,
|
|
LLMProvisioning,
|
|
Pricing,
|
|
Resources,
|
|
RunContext,
|
|
skill,
|
|
)
|
|
|
|
|
|
DEFAULT_BASE_URL = "https://api.ote-godaddy.com"
|
|
OPERATIONS = json.loads("{\n \"available\": {\n \"description\": \"Determine whether or not the specified domain is available for purchase\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"available\",\n \"parameters\": [\n {\n \"description\": \"Domain name whose availability is to be checked\",\n \"in\": \"query\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Optimize for time ('FAST') or accuracy ('FULL')\",\n \"in\": \"query\",\n \"name\": \"checkType\",\n \"required\": false,\n \"schema\": {\n \"default\": \"FAST\",\n \"enum\": [\n \"FAST\",\n \"FULL\",\n \"fast\",\n \"full\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Whether or not to include domains available for transfer. If set to True, checkType is ignored\",\n \"in\": \"query\",\n \"name\": \"forTransfer\",\n \"required\": false,\n \"schema\": {\n \"default\": false,\n \"type\": \"boolean\"\n }\n }\n ],\n \"path\": \"/v1/domains/available\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"available\",\n \"summary\": \"Determine whether or not the specified domain is available for purchase\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"available_bulk\": {\n \"description\": \"Determine whether or not the specified domains are available for purchase\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"available_bulk\",\n \"parameters\": [\n {\n \"description\": \"Optimize for time ('FAST') or accuracy ('FULL')\",\n \"in\": \"query\",\n \"name\": \"checkType\",\n \"required\": false,\n \"schema\": {\n \"default\": \"FAST\",\n \"enum\": [\n \"FAST\",\n \"FULL\",\n \"fast\",\n \"full\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/available\",\n \"request_body\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"maximum\": 500,\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"available_bulk\",\n \"summary\": \"Determine whether or not the specified domains are available for purchase\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"cancel\": {\n \"description\": \"Cancel a purchased domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"cancel\",\n \"parameters\": [\n {\n \"description\": \"Domain to cancel\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"cancel\",\n \"summary\": \"Cancel a purchased domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"cancel_privacy\": {\n \"description\": \"Submit a privacy cancellation request for the given domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"cancel_privacy\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID of the owner of the domain\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose privacy is to be cancelled\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/privacy\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"cancel_privacy\",\n \"summary\": \"Submit a privacy cancellation request for the given domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"contacts_validate\": {\n \"description\": \"All contacts specified in request will be validated against all domains specifed in \\\"domains\\\". As an alternative, you can also pass in tlds, with the exception of `uk`, which requires full domain names\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"contacts_validate\",\n \"parameters\": [\n {\n \"description\": \"PrivateLabelId to operate as, if different from JWT\",\n \"in\": \"header\",\n \"name\": \"X-Private-Label-Id\",\n \"required\": false,\n \"schema\": {\n \"default\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"MarketId in which the request is being made, and for which responses should be localized\",\n \"in\": \"query\",\n \"name\": \"marketId\",\n \"required\": false,\n \"schema\": {\n \"default\": \"en-US\",\n \"format\": \"bcp-47\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/contacts/validate\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainsContactsBulk\"\n },\n \"security\": null,\n \"skill_name\": \"contacts_validate\",\n \"summary\": \"Validate the request body using the Domain Contact Validation Schema for specified domains.\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"delete_v2_customers_customer_id_domains_domain_actions_type\": {\n \"description\": \"Cancel the most recent user action for the specified domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_v2_customers_customer_id_domains_domain_actions_type\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose action is to be cancelled\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The type of action to cancel\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"AUTH_CODE_PURCHASE\",\n \"AUTH_CODE_REGENERATE\",\n \"BACKORDER_PURCHASE\",\n \"BACKORDER_DELETE\",\n \"BACKORDER_UPDATE\",\n \"CHANGE_OF_REGISTRANT_DELETE\",\n \"DNSSEC_CREATE\",\n \"DNSSEC_DELETE\",\n \"DOMAIN_DELETE\",\n \"DOMAIN_UPDATE\",\n \"DOMAIN_UPDATE_CONTACTS\",\n \"DOMAIN_UPDATE_NAME_SERVERS\",\n \"MIGRATE\",\n \"PRIVACY_FORWARDING_UPDATE\",\n \"PRIVACY_PURCHASE\",\n \"PRIVACY_DELETE\",\n \"REDEEM\",\n \"REGISTER\",\n \"RENEW\",\n \"RENEW_UNDO\",\n \"TRADE\",\n \"TRADE_CANCEL\",\n \"TRADE_PURCHASE\",\n \"TRADE_PURCHASE_AUTH_TEXT_MESSAGE\",\n \"TRADE_RESEND_AUTH_EMAIL\",\n \"TRANSFER\",\n \"TRANSFER_IN_ACCEPT\",\n \"TRANSFER_IN_CANCEL\",\n \"TRANSFER_IN_RESTART\",\n \"TRANSFER_IN_RETRY\",\n \"TRANSFER_OUT_ACCEPT\",\n \"TRANSFER_OUT_REJECT\",\n \"TRANSFER_OUT_REQUESTED\",\n \"TRANSIT\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/actions/{type}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_v2_customers_customer_id_domains_domain_actions_type\",\n \"summary\": \"Cancel the most recent user action for the specified domain\",\n \"tags\": [\n \"Actions\"\n ]\n },\n \"delete_v2_customers_customer_id_domains_domain_change_of_registrant\": {\n \"description\": \"Cancels a pending change of registrant request for a given domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_v2_customers_customer_id_domains_domain_change_of_registrant\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose change of registrant is to be cancelled\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/changeOfRegistrant\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_v2_customers_customer_id_domains_domain_change_of_registrant\",\n \"summary\": \"Cancels a pending change of registrant request for a given domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"delete_v2_customers_customer_id_domains_domain_dnssec_records\": {\n \"description\": \"Remove the specifed DNSSEC record from the domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_v2_customers_customer_id_domains_domain_dnssec_records\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to delete the DNSSEC record for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/dnssecRecords\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/definitions/DomainDnssec\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"delete_v2_customers_customer_id_domains_domain_dnssec_records\",\n \"summary\": \"Remove the specifed DNSSEC record from the domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"domains_forwards_delete\": {\n \"description\": \"<strong>Notes:</strong><ul><li>**shopperId** is **not the same** as **customerId**. **shopperId** is a number of max length 10 digits (*ex:* 1234567890) whereas **customerId** is a UUIDv4 (*ex:* 295e3bc3-b3b9-4d95-aae5-ede41a994d13)</li></ul>\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"domains_forwards_delete\",\n \"parameters\": [\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The fully qualified domain name whose forwarding details are to be deleted.\",\n \"in\": \"path\",\n \"name\": \"fqdn\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/forwards/{fqdn}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"domains_forwards_delete\",\n \"summary\": \"Submit a forwarding cancellation request for the given fqdn\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"domains_forwards_get\": {\n \"description\": \"<strong>Notes:</strong><ul><li>**shopperId** is **not the same** as **customerId**. **shopperId** is a number of max length 10 digits (*ex:* 1234567890) whereas **customerId** is a UUIDv4 (*ex:* 295e3bc3-b3b9-4d95-aae5-ede41a994d13)</li></ul>\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"domains_forwards_get\",\n \"parameters\": [\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The fully qualified domain name whose forwarding details are to be retrieved.\",\n \"in\": \"path\",\n \"name\": \"fqdn\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Optionally include all sub domains if the fqdn specified is a domain and not a sub domain.\",\n \"in\": \"query\",\n \"name\": \"includeSubs\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/forwards/{fqdn}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"domains_forwards_get\",\n \"summary\": \"Retrieve the forwarding information for the given fqdn\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"domains_forwards_post\": {\n \"description\": \"<strong>Notes:</strong><ul><li>**shopperId** is **not the same** as **customerId**. **shopperId** is a number of max length 10 digits (*ex:* 1234567890) whereas **customerId** is a UUIDv4 (*ex:* 295e3bc3-b3b9-4d95-aae5-ede41a994d13)</li></ul>\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"domains_forwards_post\",\n \"parameters\": [\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your own customer id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The fully qualified domain name whose forwarding details are to be modified.\",\n \"in\": \"path\",\n \"name\": \"fqdn\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/forwards/{fqdn}\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainForwardingCreate\"\n },\n \"security\": null,\n \"skill_name\": \"domains_forwards_post\",\n \"summary\": \"Create a new forwarding configuration for the given FQDN\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"domains_forwards_put\": {\n \"description\": \"<strong>Notes:</strong><ul><li>**shopperId** is **not the same** as **customerId**. **shopperId** is a number of max length 10 digits (*ex:* 1234567890) whereas **customerId** is a UUIDv4 (*ex:* 295e3bc3-b3b9-4d95-aae5-ede41a994d13)</li></ul>\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"domains_forwards_put\",\n \"parameters\": [\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The fully qualified domain name whose forwarding details are to be modified.\",\n \"in\": \"path\",\n \"name\": \"fqdn\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/forwards/{fqdn}\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainForwardingCreate\"\n },\n \"security\": null,\n \"skill_name\": \"domains_forwards_put\",\n \"summary\": \"Modify the forwarding information for the given fqdn\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get\": {\n \"description\": \"Retrieve details for the specified Domain\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID expected to own the specified domain\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain name whose details are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get\",\n \"summary\": \"Retrieve details for the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"get_agreement\": {\n \"description\": \"Retrieve the legal agreement(s) required to purchase the specified TLD and add-ons\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_agreement\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier of the Market used to retrieve/translate Legal Agreements\",\n \"in\": \"header\",\n \"name\": \"X-Market-Id\",\n \"required\": false,\n \"schema\": {\n \"default\": \"en-US\",\n \"format\": \"bcp-47\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"list of TLDs whose legal agreements are to be retrieved\",\n \"in\": \"query\",\n \"name\": \"tlds\",\n \"required\": true,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Whether or not privacy has been requested\",\n \"in\": \"query\",\n \"name\": \"privacy\",\n \"required\": true,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Whether or not domain tranfer has been requested\",\n \"in\": \"query\",\n \"name\": \"forTransfer\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"path\": \"/v1/domains/agreements\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_agreement\",\n \"summary\": \"Retrieve the legal agreement(s) required to purchase the specified TLD and add-ons\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain\": {\n \"description\": \"Retrieve details for the specified Domain\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain name whose details are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Optional details to be included in the response\",\n \"in\": \"query\",\n \"name\": \"includes\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"actions\",\n \"contacts\",\n \"dnssecRecords\",\n \"registryStatusCodes\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain\",\n \"summary\": \"Retrieve details for the specified Domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain_actions\": {\n \"description\": \"Retrieves a list of the most recent actions for the specified domain\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain_actions\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose actions are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/actions\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain_actions\",\n \"summary\": \"Retrieves a list of the most recent actions for the specified domain\",\n \"tags\": [\n \"Actions\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain_actions_type\": {\n \"description\": \"Retrieves the most recent action for the specified domain\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain_actions_type\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose action is to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The type of action to retrieve\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"AUTH_CODE_PURCHASE\",\n \"AUTH_CODE_REGENERATE\",\n \"AUTO_RENEWAL\",\n \"BACKORDER_PURCHASE\",\n \"BACKORDER_DELETE\",\n \"BACKORDER_UPDATE\",\n \"CHANGE_OF_REGISTRANT_DELETE\",\n \"DNS_VERIFICATION\",\n \"DNSSEC_CREATE\",\n \"DNSSEC_DELETE\",\n \"DOMAIN_DELETE\",\n \"DOMAIN_UPDATE\",\n \"DOMAIN_UPDATE_CONTACTS\",\n \"DOMAIN_UPDATE_NAME_SERVERS\",\n \"EXPIRY\",\n \"ICANN_VERIFICATION\",\n \"MIGRATE\",\n \"MIGRATE_IN\",\n \"PREMIUM\",\n \"PRIVACY_FORWARDING_UPDATE\",\n \"PRIVACY_PURCHASE\",\n \"PRIVACY_DELETE\",\n \"REDEEM\",\n \"REGISTER\",\n \"RENEW\",\n \"RENEW_UNDO\",\n \"TRADE\",\n \"TRADE_CANCEL\",\n \"TRADE_PURCHASE\",\n \"TRADE_PURCHASE_AUTH_TEXT_MESSAGE\",\n \"TRADE_RESEND_AUTH_EMAIL\",\n \"TRANSFER\",\n \"TRANSFER_IN\",\n \"TRANSFER_IN_ACCEPT\",\n \"TRANSFER_IN_CANCEL\",\n \"TRANSFER_IN_RESTART\",\n \"TRANSFER_IN_RETRY\",\n \"TRANSFER_OUT\",\n \"TRANSFER_OUT_ACCEPT\",\n \"TRANSFER_OUT_REJECT\",\n \"TRANSFER_OUT_REQUESTED\",\n \"TRANSIT\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/actions/{type}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain_actions_type\",\n \"summary\": \"Retrieves the most recent action for the specified domain\",\n \"tags\": [\n \"Actions\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain_change_of_registrant\": {\n \"description\": \"Retrieve change of registrant information\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain_change_of_registrant\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose change of registrant information is to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/changeOfRegistrant\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain_change_of_registrant\",\n \"summary\": \"Retrieve change of registrant information\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain_privacy_forwarding\": {\n \"description\": \"Retrieve privacy email forwarding settings showing where emails are delivered\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain_privacy_forwarding\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain name whose details are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/privacy/forwarding\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain_privacy_forwarding\",\n \"summary\": \"Retrieve privacy email forwarding settings showing where emails are delivered\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_customers_customer_id_domains_domain_transfer\": {\n \"description\": \"Query the current transfer status\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_domain_transfer\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain Name\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transfer\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_domain_transfer\",\n \"summary\": \"Query the current transfer status\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_customers_customer_id_domains_notifications\": {\n \"description\": \"Retrieve the next domain notification\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_notifications\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/notifications\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_notifications\",\n \"summary\": \"Retrieve the next domain notification\",\n \"tags\": [\n \"Notifications\"\n ]\n },\n \"get_v2_customers_customer_id_domains_notifications_opt_in\": {\n \"description\": \"Retrieve a list of notification types that are opted in\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_notifications_opt_in\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/notifications/optIn\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_notifications_opt_in\",\n \"summary\": \"Retrieve a list of notification types that are opted in\",\n \"tags\": [\n \"Notifications\"\n ]\n },\n \"get_v2_customers_customer_id_domains_notifications_schemas_type\": {\n \"description\": \"Retrieve the schema for the notification data for the specified notification type\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_notifications_schemas_type\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The notification type whose schema should be retrieved\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"AUTO_RENEWAL\",\n \"BACKORDER\",\n \"BACKORDER_PURCHASE\",\n \"EXPIRY\",\n \"PREMIUM\",\n \"PRIVACY_PURCHASE\",\n \"REDEEM\",\n \"REGISTER\",\n \"RENEW\",\n \"TRADE\",\n \"TRANSFER\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/notifications/schemas/{type}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_notifications_schemas_type\",\n \"summary\": \"Retrieve the schema for the notification data for the specified notification type\",\n \"tags\": [\n \"Notifications\"\n ]\n },\n \"get_v2_customers_customer_id_domains_register_schema_tld\": {\n \"description\": \"Retrieve the schema to be submitted when registering a Domain for the specified TLD\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_customers_customer_id_domains_register_schema_tld\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Top-Level Domain whose schema should be retrieved\",\n \"in\": \"path\",\n \"name\": \"tld\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/register/schema/{tld}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_customers_customer_id_domains_register_schema_tld\",\n \"summary\": \"Retrieve the schema to be submitted when registering a Domain for the specified TLD\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_domains_maintenances\": {\n \"description\": \"Retrieve a list of upcoming system Maintenances\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_domains_maintenances\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Only include results with the selected `status` value. Returns all results if omitted<br/><ul><li><strong style='margin-left: 12px;'>ACTIVE</strong> - The upcoming maintenance is active.</li><li><strong style='margin-left: 12px;'>CANCELLED</strong> - The upcoming maintenance has been cancelled.</li></ul>\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"ACTIVE\",\n \"CANCELLED\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Only include results with `modifiedAt` after the supplied date\",\n \"in\": \"query\",\n \"name\": \"modifiedAtAfter\",\n \"required\": false,\n \"schema\": {\n \"format\": \"iso-datetime\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Only include results with `startsAt` after the supplied date\",\n \"in\": \"query\",\n \"name\": \"startsAtAfter\",\n \"required\": false,\n \"schema\": {\n \"format\": \"iso-datetime\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Maximum number of results to return\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/v2/domains/maintenances\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_domains_maintenances\",\n \"summary\": \"Retrieve a list of upcoming system Maintenances\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_domains_maintenances_maintenance_id\": {\n \"description\": \"Retrieve the details for an upcoming system Maintenances\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_domains_maintenances_maintenance_id\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The identifier for the system maintenance\",\n \"in\": \"path\",\n \"name\": \"maintenanceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/domains/maintenances/{maintenanceId}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_domains_maintenances_maintenance_id\",\n \"summary\": \"Retrieve the details for an upcoming system Maintenances\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_v2_domains_usage_yyyymm\": {\n \"description\": \"Retrieve api usage request counts for a specific year/month. The data is retained for a period of three months.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_v2_domains_usage_yyyymm\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The year/month timeframe for the request counts (in the format yyyy-mm)\",\n \"in\": \"path\",\n \"name\": \"yyyymm\",\n \"required\": true,\n \"schema\": {\n \"pattern\": \"^\\\\d{4}-\\\\d{2}$\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Determines if the detail records (grouped by request path) are included in the response\",\n \"in\": \"query\",\n \"name\": \"includes\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"details\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/v2/domains/usage/{yyyymm}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_v2_domains_usage_yyyymm\",\n \"summary\": \"Retrieve api usage request counts for a specific year/month. The data is retained for a period of three months.\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"list\": {\n \"description\": \"Retrieve a list of Domains for the specified Shopper\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"list\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID whose domains are to be retrieved\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Only include results with `status` value in the specified set\",\n \"in\": \"query\",\n \"name\": \"statuses\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"ACTIVE\",\n \"AWAITING_CLAIM_ACK\",\n \"AWAITING_DOCUMENT_AFTER_TRANSFER\",\n \"AWAITING_DOCUMENT_AFTER_UPDATE_ACCOUNT\",\n \"AWAITING_DOCUMENT_UPLOAD\",\n \"AWAITING_FAILED_TRANSFER_WHOIS_PRIVACY\",\n \"AWAITING_PAYMENT\",\n \"AWAITING_RENEWAL_TRANSFER_IN_COMPLETE\",\n \"AWAITING_TRANSFER_IN_ACK\",\n \"AWAITING_TRANSFER_IN_AUTH\",\n \"AWAITING_TRANSFER_IN_AUTO\",\n \"AWAITING_TRANSFER_IN_WHOIS\",\n \"AWAITING_TRANSFER_IN_WHOIS_FIX\",\n \"AWAITING_VERIFICATION_ICANN\",\n \"AWAITING_VERIFICATION_ICANN_MANUAL\",\n \"CANCELLED\",\n \"CANCELLED_HELD\",\n \"CANCELLED_REDEEMABLE\",\n \"CANCELLED_TRANSFER\",\n \"CONFISCATED\",\n \"DISABLED_SPECIAL\",\n \"EXCLUDED_INVALID_CLAIM_FIREHOSE\",\n \"EXPIRED_REASSIGNED\",\n \"FAILED_BACKORDER_CAPTURE\",\n \"FAILED_DROP_IMMEDIATE_THEN_ADD\",\n \"FAILED_PRE_REGISTRATION\",\n \"FAILED_REDEMPTION\",\n \"FAILED_REDEMPTION_REPORT\",\n \"FAILED_REGISTRATION\",\n \"FAILED_REGISTRATION_FIREHOSE\",\n \"FAILED_RESTORATION_REDEMPTION_MOCK\",\n \"FAILED_SETUP\",\n \"FAILED_TRANSFER_IN\",\n \"FAILED_TRANSFER_IN_BAD_STATUS\",\n \"FAILED_TRANSFER_IN_REGISTRY\",\n \"HELD_COURT_ORDERED\",\n \"HELD_DISPUTED\",\n \"HELD_EXPIRATION_PROTECTION\",\n \"HELD_EXPIRED_REDEMPTION_MOCK\",\n \"HELD_REGISTRAR_ADD\",\n \"HELD_REGISTRAR_REMOVE\",\n \"HELD_SHOPPER\",\n \"HELD_TEMPORARY\",\n \"LOCKED_ABUSE\",\n \"LOCKED_COPYRIGHT\",\n \"LOCKED_REGISTRY\",\n \"LOCKED_SUPER\",\n \"PARKED_AND_HELD\",\n \"PARKED_EXPIRED\",\n \"PARKED_VERIFICATION_ICANN\",\n \"PENDING_ABORT_CANCEL_SETUP\",\n \"PENDING_AGREEMENT_PRE_REGISTRATION\",\n \"PENDING_APPLY_RENEWAL_CREDITS\",\n \"PENDING_BACKORDER_CAPTURE\",\n \"PENDING_BLOCKED_REGISTRY\",\n \"PENDING_CANCEL_REGISTRANT_PROFILE\",\n \"PENDING_COMPLETE_REDEMPTION_WITHOUT_RECEIPT\",\n \"PENDING_COMPLETE_REGISTRANT_PROFILE\",\n \"PENDING_COO\",\n \"PENDING_COO_COMPLETE\",\n \"PENDING_DNS\",\n \"PENDING_DNS_ACTIVE\",\n \"PENDING_DNS_INACTIVE\",\n \"PENDING_DOCUMENT_VALIDATION\",\n \"PENDING_DOCUMENT_VERIFICATION\",\n \"PENDING_DROP_IMMEDIATE\",\n \"PENDING_DROP_IMMEDIATE_THEN_ADD\",\n \"PENDING_EPP_CREATE\",\n \"PENDING_EPP_DELETE\",\n \"PENDING_EPP_UPDATE\",\n \"PENDING_ESCALATION_REGISTRY\",\n \"PENDING_EXPIRATION\",\n \"PENDING_EXPIRATION_RESPONSE\",\n \"PENDING_EXPIRATION_SYNC\",\n \"PENDING_EXPIRED_REASSIGNMENT\",\n \"PENDING_EXPIRE_AUTO_ADD\",\n \"PENDING_EXTEND_REGISTRANT_PROFILE\",\n \"PENDING_FAILED_COO\",\n \"PENDING_FAILED_EPP_CREATE\",\n \"PENDING_FAILED_HELD\",\n \"PENDING_FAILED_PURCHASE_PREMIUM\",\n \"PENDING_FAILED_RECONCILE_FIREHOSE\",\n \"PENDING_FAILED_REDEMPTION_WITHOUT_RECEIPT\",\n \"PENDING_FAILED_RELEASE_PREMIUM\",\n \"PENDING_FAILED_RENEW_EXPIRATION_PROTECTION\",\n \"PENDING_FAILED_RESERVE_PREMIUM\",\n \"PENDING_FAILED_SUBMIT_FIREHOSE\",\n \"PENDING_FAILED_TRANSFER_ACK_PREMIUM\",\n \"PENDING_FAILED_TRANSFER_IN_ACK_PREMIUM\",\n \"PENDING_FAILED_TRANSFER_IN_PREMIUM\",\n \"PENDING_FAILED_TRANSFER_PREMIUM\",\n \"PENDING_FAILED_TRANSFER_SUBMIT_PREMIUM\",\n \"PENDING_FAILED_UNLOCK_PREMIUM\",\n \"PENDING_FAILED_UPDATE_API\",\n \"PENDING_FRAUD_VERIFICATION\",\n \"PENDING_FRAUD_VERIFIED\",\n \"PENDING_GET_CONTACTS\",\n \"PENDING_GET_HOSTS\",\n \"PENDING_GET_NAME_SERVERS\",\n \"PENDING_GET_STATUS\",\n \"PENDING_HOLD_ESCROW\",\n \"PENDING_HOLD_REDEMPTION\",\n \"PENDING_LOCK_CLIENT_REMOVE\",\n \"PENDING_LOCK_DATA_QUALITY\",\n \"PENDING_LOCK_THEN_HOLD_REDEMPTION\",\n \"PENDING_PARKING_DETERMINATION\",\n \"PENDING_PARK_INVALID_WHOIS\",\n \"PENDING_PARK_INVALID_WHOIS_REMOVAL\",\n \"PENDING_PURCHASE_PREMIUM\",\n \"PENDING_RECONCILE\",\n \"PENDING_RECONCILE_FIREHOSE\",\n \"PENDING_REDEMPTION\",\n \"PENDING_REDEMPTION_REPORT\",\n \"PENDING_REDEMPTION_REPORT_COMPLETE\",\n \"PENDING_REDEMPTION_REPORT_SUBMITTED\",\n \"PENDING_REDEMPTION_WITHOUT_RECEIPT\",\n \"PENDING_REDEMPTION_WITHOUT_RECEIPT_MOCK\",\n \"PENDING_RELEASE_PREMIUM\",\n \"PENDING_REMOVAL\",\n \"PENDING_REMOVAL_HELD\",\n \"PENDING_REMOVAL_PARKED\",\n \"PENDING_REMOVAL_UNPARK\",\n \"PENDING_RENEWAL\",\n \"PENDING_RENEW_EXPIRATION_PROTECTION\",\n \"PENDING_RENEW_INFINITE\",\n \"PENDING_RENEW_LOCKED\",\n \"PENDING_RENEW_WITHOUT_RECEIPT\",\n \"PENDING_REPORT_REDEMPTION_WITHOUT_RECEIPT\",\n \"PENDING_RESERVE_PREMIUM\",\n \"PENDING_RESET_VERIFICATION_ICANN\",\n \"PENDING_RESPONSE_FIREHOSE\",\n \"PENDING_RESTORATION\",\n \"PENDING_RESTORATION_INACTIVE\",\n \"PENDING_RESTORATION_REDEMPTION_MOCK\",\n \"PENDING_RETRY_EPP_CREATE\",\n \"PENDING_RETRY_HELD\",\n \"PENDING_SEND_AUTH_CODE\",\n \"PENDING_SETUP\",\n \"PENDING_SETUP_ABANDON\",\n \"PENDING_SETUP_AGREEMENT_LANDRUSH\",\n \"PENDING_SETUP_AGREEMENT_SUNRISE2_A\",\n \"PENDING_SETUP_AGREEMENT_SUNRISE2_B\",\n \"PENDING_SETUP_AGREEMENT_SUNRISE2_C\",\n \"PENDING_SETUP_AUTH\",\n \"PENDING_SETUP_DNS\",\n \"PENDING_SETUP_FAILED\",\n \"PENDING_SETUP_REVIEW\",\n \"PENDING_SETUP_SUNRISE\",\n \"PENDING_SETUP_SUNRISE_PRE\",\n \"PENDING_SETUP_SUNRISE_RESPONSE\",\n \"PENDING_SUBMIT_FAILURE\",\n \"PENDING_SUBMIT_FIREHOSE\",\n \"PENDING_SUBMIT_HOLD_FIREHOSE\",\n \"PENDING_SUBMIT_HOLD_LANDRUSH\",\n \"PENDING_SUBMIT_HOLD_SUNRISE\",\n \"PENDING_SUBMIT_LANDRUSH\",\n \"PENDING_SUBMIT_RESPONSE_FIREHOSE\",\n \"PENDING_SUBMIT_RESPONSE_LANDRUSH\",\n \"PENDING_SUBMIT_RESPONSE_SUNRISE\",\n \"PENDING_SUBMIT_SUCCESS_FIREHOSE\",\n \"PENDING_SUBMIT_SUCCESS_LANDRUSH\",\n \"PENDING_SUBMIT_SUCCESS_SUNRISE\",\n \"PENDING_SUBMIT_SUNRISE\",\n \"PENDING_SUBMIT_WAITING_LANDRUSH\",\n \"PENDING_SUCCESS_PRE_REGISTRATION\",\n \"PENDING_SUSPENDED_DATA_QUALITY\",\n \"PENDING_TRANSFER_ACK_PREMIUM\",\n \"PENDING_TRANSFER_IN\",\n \"PENDING_TRANSFER_IN_ACK\",\n \"PENDING_TRANSFER_IN_ACK_PREMIUM\",\n \"PENDING_TRANSFER_IN_BAD_REGISTRANT\",\n \"PENDING_TRANSFER_IN_CANCEL\",\n \"PENDING_TRANSFER_IN_CANCEL_REGISTRY\",\n \"PENDING_TRANSFER_IN_COMPLETE_ACK\",\n \"PENDING_TRANSFER_IN_DELETE\",\n \"PENDING_TRANSFER_IN_LOCK\",\n \"PENDING_TRANSFER_IN_NACK\",\n \"PENDING_TRANSFER_IN_NOTIFICATION\",\n \"PENDING_TRANSFER_IN_PREMIUM\",\n \"PENDING_TRANSFER_IN_RELEASE\",\n \"PENDING_TRANSFER_IN_RESPONSE\",\n \"PENDING_TRANSFER_IN_UNDERAGE\",\n \"PENDING_TRANSFER_OUT\",\n \"PENDING_TRANSFER_OUT_ACK\",\n \"PENDING_TRANSFER_OUT_NACK\",\n \"PENDING_TRANSFER_OUT_PREMIUM\",\n \"PENDING_TRANSFER_OUT_UNDERAGE\",\n \"PENDING_TRANSFER_OUT_VALIDATION\",\n \"PENDING_TRANSFER_PREMIUM\",\n \"PENDING_TRANSFER_PREMUIM\",\n \"PENDING_TRANSFER_SUBMIT_PREMIUM\",\n \"PENDING_UNLOCK_DATA_QUALITY\",\n \"PENDING_UNLOCK_PREMIUM\",\n \"PENDING_UPDATE\",\n \"PENDING_UPDATED_REGISTRANT_DATA_QUALITY\",\n \"PENDING_UPDATE_ACCOUNT\",\n \"PENDING_UPDATE_API\",\n \"PENDING_UPDATE_API_RESPONSE\",\n \"PENDING_UPDATE_AUTH\",\n \"PENDING_UPDATE_CONTACTS\",\n \"PENDING_UPDATE_CONTACTS_PRIVACY\",\n \"PENDING_UPDATE_DNS\",\n \"PENDING_UPDATE_DNS_SECURITY\",\n \"PENDING_UPDATE_ELIGIBILITY\",\n \"PENDING_UPDATE_EPP_CONTACTS\",\n \"PENDING_UPDATE_MEMBERSHIP\",\n \"PENDING_UPDATE_OWNERSHIP\",\n \"PENDING_UPDATE_OWNERSHIP_AUTH_AUCTION\",\n \"PENDING_UPDATE_OWNERSHIP_HELD\",\n \"PENDING_UPDATE_REGISTRANT\",\n \"PENDING_UPDATE_REPO\",\n \"PENDING_VALIDATION_DATA_QUALITY\",\n \"PENDING_VERIFICATION_FRAUD\",\n \"PENDING_VERIFICATION_STATUS\",\n \"PENDING_VERIFY_REGISTRANT_DATA_QUALITY\",\n \"RESERVED\",\n \"RESERVED_PREMIUM\",\n \"REVERTED\",\n \"SUSPENDED_VERIFICATION_ICANN\",\n \"TRANSFERRED_OUT\",\n \"UNLOCKED_ABUSE\",\n \"UNLOCKED_SUPER\",\n \"UNPARKED_AND_UNHELD\",\n \"UPDATED_OWNERSHIP\",\n \"UPDATED_OWNERSHIP_HELD\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Only include results with `status` value in any of the specified groups\",\n \"in\": \"query\",\n \"name\": \"statusGroups\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"INACTIVE\",\n \"PRE_REGISTRATION\",\n \"REDEMPTION\",\n \"RENEWABLE\",\n \"VERIFICATION_ICANN\",\n \"VISIBLE\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Maximum number of domains to return\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Marker Domain to use as the offset in results\",\n \"in\": \"query\",\n \"name\": \"marker\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Optional details to be included in the response\",\n \"in\": \"query\",\n \"name\": \"includes\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"authCode\",\n \"contacts\",\n \"nameServers\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Only include results that have been modified since the specified date\",\n \"in\": \"query\",\n \"name\": \"modifiedDate\",\n \"required\": false,\n \"schema\": {\n \"format\": \"iso-datetime\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"list\",\n \"summary\": \"Retrieve a list of Domains for the specified Shopper\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"patch_v2_customers_customer_id_domains_domain_contacts\": {\n \"description\": \"Update domain contacts\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_v2_customers_customer_id_domains_domain_contacts\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose Contacts are to be updated.\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/contacts\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainContactsUpdateV2\"\n },\n \"security\": null,\n \"skill_name\": \"patch_v2_customers_customer_id_domains_domain_contacts\",\n \"summary\": \"Update domain contacts\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"patch_v2_customers_customer_id_domains_domain_dnssec_records\": {\n \"description\": \"Add the specifed DNSSEC records to the domain\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_v2_customers_customer_id_domains_domain_dnssec_records\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to add the DNSSEC record for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/dnssecRecords\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/definitions/DomainDnssec\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"patch_v2_customers_customer_id_domains_domain_dnssec_records\",\n \"summary\": \"Add the specifed DNSSEC records to the domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"patch_v2_customers_customer_id_domains_domain_privacy_forwarding\": {\n \"description\": \"Update privacy email forwarding settings to determine how emails are delivered\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_v2_customers_customer_id_domains_domain_privacy_forwarding\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain name whose details are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/privacy/forwarding\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainPrivacyForwardingUpdate\"\n },\n \"security\": null,\n \"skill_name\": \"patch_v2_customers_customer_id_domains_domain_privacy_forwarding\",\n \"summary\": \"Update privacy email forwarding settings to determine how emails are delivered\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_redeem\": {\n \"description\": \"Purchase a restore for the given domain to bring it out of redemption\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_redeem\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to request redeem for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/redeem\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainRedeemV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_redeem\",\n \"summary\": \"Purchase a restore for the given domain to bring it out of redemption\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_regenerate_auth_code\": {\n \"description\": \"Regenerate the auth code for the given domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_regenerate_auth_code\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to update authcode for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/regenerateAuthCode\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_regenerate_auth_code\",\n \"summary\": \"Regenerate the auth code for the given domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_renew\": {\n \"description\": \"Renew the specified Domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_renew\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to be renewed\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/renew\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainRenewV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_renew\",\n \"summary\": \"Renew the specified Domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer\": {\n \"description\": \"Purchase and start or restart transfer process\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to transfer in\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transfer\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainTransferInV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer\",\n \"summary\": \"Purchase and start or restart transfer process\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_in_accept\": {\n \"description\": \"Accepts the transfer in\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_in_accept\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to accept the transfer in for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferInAccept\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainTransferAuthCode\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_in_accept\",\n \"summary\": \"Accepts the transfer in\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_in_cancel\": {\n \"description\": \"Cancels the transfer in\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_in_cancel\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to cancel the transfer in for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferInCancel\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_in_cancel\",\n \"summary\": \"Cancels the transfer in\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_in_restart\": {\n \"description\": \"Restarts transfer in request from the beginning\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_in_restart\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to restart the transfer in\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferInRestart\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_in_restart\",\n \"summary\": \"Restarts transfer in request from the beginning\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_in_retry\": {\n \"description\": \"Retries the current transfer in request with supplied Authorization code\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_in_retry\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to retry the transfer in\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferInRetry\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainTransferAuthCode\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_in_retry\",\n \"summary\": \"Retries the current transfer in request with supplied Authorization code\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_out\": {\n \"description\": \"Initiate transfer out to another registrar for a .uk domain.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_out\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to initiate the transfer out for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Registrar tag to push transfer to\",\n \"in\": \"query\",\n \"name\": \"registrar\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferOut\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_out\",\n \"summary\": \"Initiate transfer out to another registrar for a .uk domain.\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_out_accept\": {\n \"description\": \"Accept transfer out\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_out_accept\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to accept the transfer out for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferOutAccept\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_out_accept\",\n \"summary\": \"Accept transfer out\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_out_reject\": {\n \"description\": \"Reject transfer out\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_out_reject\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to reject the transfer out for\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Transfer out reject reason\",\n \"in\": \"query\",\n \"name\": \"reason\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"EVIDENCE_OF_FRAUD\",\n \"URDP_ACTION\",\n \"COURT_ORDER\",\n \"DISPUTE_OVER_IDENTITY\",\n \"NO_PAYMENT_FOR_PREVIOUS_REGISTRATION_PERIOD\",\n \"WRITTEN_OBJECTION\",\n \"TRANSFERRED_WITHIN_SIXTY_DAYS\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transferOutReject\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_out_reject\",\n \"summary\": \"Reject transfer out\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_domain_transfer_validate\": {\n \"description\": \"Validate the request body using the Domain Transfer Schema for the specified TLD\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_domain_transfer_validate\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to transfer in\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/transfer/validate\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainTransferInV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_domain_transfer_validate\",\n \"summary\": \"Validate the request body using the Domain Transfer Schema for the specified TLD\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge\": {\n \"description\": \"Acknowledge a domain notification\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The notification ID to acknowledge\",\n \"in\": \"path\",\n \"name\": \"notificationId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/notifications/{notificationId}/acknowledge\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge\",\n \"summary\": \"Acknowledge a domain notification\",\n \"tags\": [\n \"Notifications\"\n ]\n },\n \"post_v2_customers_customer_id_domains_register\": {\n \"description\": \"Purchase and register the specified Domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_register\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/register\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainPurchaseV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_register\",\n \"summary\": \"Purchase and register the specified Domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_v2_customers_customer_id_domains_register_validate\": {\n \"description\": \"Validate the request body using the Domain Registration Schema for the specified TLD\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_v2_customers_customer_id_domains_register_validate\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/register/validate\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainPurchaseV2\"\n },\n \"security\": null,\n \"skill_name\": \"post_v2_customers_customer_id_domains_register_validate\",\n \"summary\": \"Validate the request body using the Domain Registration Schema for the specified TLD\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"purchase\": {\n \"description\": \"Purchase and register the specified Domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"purchase\",\n \"parameters\": [\n {\n \"description\": \"The Shopper for whom the domain should be purchased\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/purchase\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainPurchase\"\n },\n \"security\": null,\n \"skill_name\": \"purchase\",\n \"summary\": \"Purchase and register the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"purchase_privacy\": {\n \"description\": \"Purchase privacy for a specified domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"purchase_privacy\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID of the owner of the domain\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain for which to purchase privacy\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/privacy/purchase\",\n \"request_body\": {\n \"$ref\": \"#/definitions/PrivacyPurchase\"\n },\n \"security\": null,\n \"skill_name\": \"purchase_privacy\",\n \"summary\": \"Purchase privacy for a specified domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"put_v2_customers_customer_id_domains_domain_name_servers\": {\n \"description\": \"Replaces the existing name servers on the domain.\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"put_v2_customers_customer_id_domains_domain_name_servers\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose name servers are to be replaced\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/{domain}/nameServers\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainNameServerUpdateV2\"\n },\n \"security\": null,\n \"skill_name\": \"put_v2_customers_customer_id_domains_domain_name_servers\",\n \"summary\": \"Replaces the existing name servers on the domain.\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"put_v2_customers_customer_id_domains_notifications_opt_in\": {\n \"description\": \"Opt in to recieve notifications for the submitted notification types\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"put_v2_customers_customer_id_domains_notifications_opt_in\",\n \"parameters\": [\n {\n \"description\": \"A client provided identifier for tracking this request.\",\n \"in\": \"header\",\n \"name\": \"X-Request-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Customer identifier<br/> Note: For API Resellers, performing actions on behalf of your customers, you need to specify the Subaccount you're operating on behalf of; otherwise use your shopper id.\",\n \"in\": \"path\",\n \"name\": \"customerId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The notification types that should be opted in\",\n \"in\": \"query\",\n \"name\": \"types\",\n \"required\": true,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"AUTH_CODE_PURCHASE\",\n \"AUTH_CODE_REGENERATE\",\n \"AUTO_RENEWAL\",\n \"BACKORDER\",\n \"BACKORDER_PURCHASE\",\n \"BACKORDER_DELETE\",\n \"BACKORDER_UPDATE\",\n \"CHANGE_OF_REGISTRANT_DELETE\",\n \"CONTACT_CREATE\",\n \"CONTACT_DELETE\",\n \"CONTACT_UPDATE\",\n \"DNS_VERIFICATION\",\n \"DNSSEC_CREATE\",\n \"DNSSEC_DELETE\",\n \"DOMAIN_DELETE\",\n \"DOMAIN_UPDATE\",\n \"DOMAIN_UPDATE_CONTACTS\",\n \"DOMAIN_UPDATE_NAME_SERVERS\",\n \"EXPIRY\",\n \"HOST_CREATE\",\n \"HOST_DELETE\",\n \"ICANN_VERIFICATION\",\n \"MIGRATE\",\n \"MIGRATE_IN\",\n \"PREMIUM\",\n \"PRIVACY_FORWARDING_UPDATE\",\n \"PRIVACY_PURCHASE\",\n \"PRIVACY_DELETE\",\n \"REDEEM\",\n \"REGISTER\",\n \"RENEW\",\n \"RENEW_UNDO\",\n \"TRADE\",\n \"TRADE_CANCEL\",\n \"TRADE_PURCHASE\",\n \"TRADE_PURCHASE_AUTH_TEXT_MESSAGE\",\n \"TRADE_RESEND_AUTH_EMAIL\",\n \"TRANSFER\",\n \"TRANSFER_IN\",\n \"TRANSFER_IN_ACCEPT\",\n \"TRANSFER_IN_CANCEL\",\n \"TRANSFER_IN_RESTART\",\n \"TRANSFER_IN_RETRY\",\n \"TRANSFER_OUT\",\n \"TRANSFER_OUT_ACCEPT\",\n \"TRANSFER_OUT_REJECT\",\n \"TRANSFER_OUT_REQUESTED\",\n \"TRANSIT\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/v2/customers/{customerId}/domains/notifications/optIn\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"put_v2_customers_customer_id_domains_notifications_opt_in\",\n \"summary\": \"Opt in to recieve notifications for the submitted notification types\",\n \"tags\": [\n \"Notifications\"\n ]\n },\n \"record_add\": {\n \"description\": \"Add the specified DNS Records to the specified Domain\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"record_add\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be augmented\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records\",\n \"request_body\": {\n \"$ref\": \"#/definitions/ArrayOfDNSRecord\"\n },\n \"security\": null,\n \"skill_name\": \"record_add\",\n \"summary\": \"Add the specified DNS Records to the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"record_delete_type_name\": {\n \"description\": \"Delete all DNS Records for the specified Domain with the specified Type and Name\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"record_delete_type_name\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be deleted\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Type for which DNS Records are to be deleted\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"A\",\n \"AAAA\",\n \"CNAME\",\n \"MX\",\n \"SRV\",\n \"TXT\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Name for which DNS Records are to be deleted\",\n \"in\": \"path\",\n \"name\": \"name\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records/{type}/{name}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"record_delete_type_name\",\n \"summary\": \"Delete all DNS Records for the specified Domain with the specified Type and Name\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"record_get\": {\n \"description\": \"Retrieve DNS Records for the specified Domain, optionally with the specified Type and/or Name\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"record_get\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Type for which DNS Records are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"A\",\n \"AAAA\",\n \"CNAME\",\n \"MX\",\n \"NS\",\n \"SOA\",\n \"SRV\",\n \"TXT\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Name for which DNS Records are to be retrieved\",\n \"in\": \"path\",\n \"name\": \"name\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of results to skip for pagination\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Maximum number of items to return\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records/{type}/{name}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"record_get\",\n \"summary\": \"Retrieve DNS Records for the specified Domain, optionally with the specified Type and/or Name\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"record_replace\": {\n \"description\": \"Replace all DNS Records for the specified Domain\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"record_replace\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/definitions/DNSRecord\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"record_replace\",\n \"summary\": \"Replace all DNS Records for the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"record_replace_type\": {\n \"description\": \"Replace all DNS Records for the specified Domain with the specified Type\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"record_replace_type\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Type for which DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"A\",\n \"AAAA\",\n \"CNAME\",\n \"MX\",\n \"NS\",\n \"SOA\",\n \"SRV\",\n \"TXT\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records/{type}\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/definitions/DNSRecordCreateType\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"record_replace_type\",\n \"summary\": \"Replace all DNS Records for the specified Domain with the specified Type\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"record_replace_type_name\": {\n \"description\": \"Replace all DNS Records for the specified Domain with the specified Type and Name\",\n \"destructive\": true,\n \"method\": \"PUT\",\n \"operation_id\": \"record_replace_type_name\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID which owns the domain. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Type for which DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"type\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"A\",\n \"AAAA\",\n \"CNAME\",\n \"MX\",\n \"NS\",\n \"SOA\",\n \"SRV\",\n \"TXT\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"DNS Record Name for which DNS Records are to be replaced\",\n \"in\": \"path\",\n \"name\": \"name\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/records/{type}/{name}\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/definitions/DNSRecordCreateTypeName\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"record_replace_type_name\",\n \"summary\": \"Replace all DNS Records for the specified Domain with the specified Type and Name\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"renew\": {\n \"description\": \"Renew the specified Domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"renew\",\n \"parameters\": [\n {\n \"description\": \"Shopper for whom Domain is to be renewed. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to renew\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/renew\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainRenew\"\n },\n \"security\": null,\n \"skill_name\": \"renew\",\n \"summary\": \"Renew the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"schema\": {\n \"description\": \"Retrieve the schema to be submitted when registering a Domain for the specified TLD\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"schema\",\n \"parameters\": [\n {\n \"description\": \"The Top-Level Domain whose schema should be retrieved\",\n \"in\": \"path\",\n \"name\": \"tld\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/purchase/schema/{tld}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"schema\",\n \"summary\": \"Retrieve the schema to be submitted when registering a Domain for the specified TLD\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"suggest\": {\n \"description\": \"Suggest alternate Domain names based on a seed Domain, a set of keywords, or the shopper's purchase history\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"suggest\",\n \"parameters\": [\n {\n \"description\": \"Shopper ID for which the suggestions are being generated\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain name or set of keywords for which alternative domain names will be suggested\",\n \"in\": \"query\",\n \"name\": \"query\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Two-letter ISO country code to be used as a hint for target region<br/><br/>\\nNOTE: These are sample values, there are many\\n<a href=\\\"http://www.iso.org/iso/country_codes.htm\\\">more</a>\",\n \"in\": \"query\",\n \"name\": \"country\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"AC\",\n \"AD\",\n \"AE\",\n \"AF\",\n \"AG\",\n \"AI\",\n \"AL\",\n \"AM\",\n \"AO\",\n \"AQ\",\n \"AR\",\n \"AS\",\n \"AT\",\n \"AU\",\n \"AW\",\n \"AX\",\n \"AZ\",\n \"BA\",\n \"BB\",\n \"BD\",\n \"BE\",\n \"BF\",\n \"BG\",\n \"BH\",\n \"BI\",\n \"BJ\",\n \"BM\",\n \"BN\",\n \"BO\",\n \"BQ\",\n \"BR\",\n \"BS\",\n \"BT\",\n \"BV\",\n \"BW\",\n \"BY\",\n \"BZ\",\n \"CA\",\n \"CC\",\n \"CD\",\n \"CF\",\n \"CG\",\n \"CH\",\n \"CI\",\n \"CK\",\n \"CL\",\n \"CM\",\n \"CN\",\n \"CO\",\n \"CR\",\n \"CV\",\n \"CW\",\n \"CX\",\n \"CY\",\n \"CZ\",\n \"DE\",\n \"DJ\",\n \"DK\",\n \"DM\",\n \"DO\",\n \"DZ\",\n \"EC\",\n \"EE\",\n \"EG\",\n \"EH\",\n \"ER\",\n \"ES\",\n \"ET\",\n \"FI\",\n \"FJ\",\n \"FK\",\n \"FM\",\n \"FO\",\n \"FR\",\n \"GA\",\n \"GB\",\n \"GD\",\n \"GE\",\n \"GF\",\n \"GG\",\n \"GH\",\n \"GI\",\n \"GL\",\n \"GM\",\n \"GN\",\n \"GP\",\n \"GQ\",\n \"GR\",\n \"GS\",\n \"GT\",\n \"GU\",\n \"GW\",\n \"GY\",\n \"HK\",\n \"HM\",\n \"HN\",\n \"HR\",\n \"HT\",\n \"HU\",\n \"ID\",\n \"IE\",\n \"IL\",\n \"IM\",\n \"IN\",\n \"IO\",\n \"IQ\",\n \"IS\",\n \"IT\",\n \"JE\",\n \"JM\",\n \"JO\",\n \"JP\",\n \"KE\",\n \"KG\",\n \"KH\",\n \"KI\",\n \"KM\",\n \"KN\",\n \"KR\",\n \"KV\",\n \"KW\",\n \"KY\",\n \"KZ\",\n \"LA\",\n \"LB\",\n \"LC\",\n \"LI\",\n \"LK\",\n \"LR\",\n \"LS\",\n \"LT\",\n \"LU\",\n \"LV\",\n \"LY\",\n \"MA\",\n \"MC\",\n \"MD\",\n \"ME\",\n \"MG\",\n \"MH\",\n \"MK\",\n \"ML\",\n \"MM\",\n \"MN\",\n \"MO\",\n \"MP\",\n \"MQ\",\n \"MR\",\n \"MS\",\n \"MT\",\n \"MU\",\n \"MV\",\n \"MW\",\n \"MX\",\n \"MY\",\n \"MZ\",\n \"NA\",\n \"NC\",\n \"NE\",\n \"NF\",\n \"NG\",\n \"NI\",\n \"NL\",\n \"NO\",\n \"NP\",\n \"NR\",\n \"NU\",\n \"NZ\",\n \"OM\",\n \"PA\",\n \"PE\",\n \"PF\",\n \"PG\",\n \"PH\",\n \"PK\",\n \"PL\",\n \"PM\",\n \"PN\",\n \"PR\",\n \"PS\",\n \"PT\",\n \"PW\",\n \"PY\",\n \"QA\",\n \"RE\",\n \"RO\",\n \"RS\",\n \"RU\",\n \"RW\",\n \"SA\",\n \"SB\",\n \"SC\",\n \"SE\",\n \"SG\",\n \"SH\",\n \"SI\",\n \"SJ\",\n \"SK\",\n \"SL\",\n \"SM\",\n \"SN\",\n \"SO\",\n \"SR\",\n \"ST\",\n \"SV\",\n \"SX\",\n \"SZ\",\n \"TC\",\n \"TD\",\n \"TF\",\n \"TG\",\n \"TH\",\n \"TJ\",\n \"TK\",\n \"TL\",\n \"TM\",\n \"TN\",\n \"TO\",\n \"TP\",\n \"TR\",\n \"TT\",\n \"TV\",\n \"TW\",\n \"TZ\",\n \"UA\",\n \"UG\",\n \"UM\",\n \"US\",\n \"UY\",\n \"UZ\",\n \"VA\",\n \"VC\",\n \"VE\",\n \"VG\",\n \"VI\",\n \"VN\",\n \"VU\",\n \"WF\",\n \"WS\",\n \"YE\",\n \"YT\",\n \"ZA\",\n \"ZM\",\n \"ZW\"\n ],\n \"format\": \"iso-country-code\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Name of city to be used as a hint for target region\",\n \"in\": \"query\",\n \"name\": \"city\",\n \"required\": false,\n \"schema\": {\n \"format\": \"city-name\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Sources to be queried<br/><br/><ul>\\n<li><strong>CC_TLD</strong> - Varies the TLD using Country Codes</li>\\n<li><strong>EXTENSION</strong> - Varies the TLD</li>\\n<li><strong>KEYWORD_SPIN</strong> - Identifies keywords and then rotates each one</li>\\n<li><strong>PREMIUM</strong> - Includes variations with premium prices</li></ul>\",\n \"in\": \"query\",\n \"name\": \"sources\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"enum\": [\n \"CC_TLD\",\n \"EXTENSION\",\n \"KEYWORD_SPIN\",\n \"PREMIUM\",\n \"cctld\",\n \"extension\",\n \"keywordspin\",\n \"premium\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Top-level domains to be included in suggestions<br/><br/>\\nNOTE: These are sample values, there are many\\n<a href=\\\"http://www.godaddy.com/tlds/gtld.aspx#domain_search_form\\\">more</a>\",\n \"in\": \"query\",\n \"name\": \"tlds\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Maximum length of second-level domain\",\n \"in\": \"query\",\n \"name\": \"lengthMax\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Minimum length of second-level domain\",\n \"in\": \"query\",\n \"name\": \"lengthMin\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Maximum number of suggestions to return\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Maximum amount of time, in milliseconds, to wait for responses\\nIf elapses, return the results compiled up to that point\",\n \"in\": \"query\",\n \"name\": \"waitMs\",\n \"required\": false,\n \"schema\": {\n \"default\": 1000,\n \"format\": \"integer-positive\",\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/v1/domains/suggest\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"suggest\",\n \"summary\": \"Suggest alternate Domain names based on a seed Domain, a set of keywords, or the shopper's purchase history\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"tlds\": {\n \"description\": \"Retrieves a list of TLDs supported and enabled for sale\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"tlds\",\n \"parameters\": [],\n \"path\": \"/v1/domains/tlds\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"tlds\",\n \"summary\": \"Retrieves a list of TLDs supported and enabled for sale\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"transfer_in\": {\n \"description\": \"Purchase and start or restart transfer process\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"transfer_in\",\n \"parameters\": [\n {\n \"description\": \"The Shopper to whom the domain should be transfered\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain to transfer in\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/transfer\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainTransferIn\"\n },\n \"security\": null,\n \"skill_name\": \"transfer_in\",\n \"summary\": \"Purchase and start or restart transfer process\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"update\": {\n \"description\": \"Update details for the specified Domain\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update\",\n \"parameters\": [\n {\n \"description\": \"Domain whose details are to be updated\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Shopper for whom Domain is to be updated. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainUpdate\"\n },\n \"security\": null,\n \"skill_name\": \"update\",\n \"summary\": \"Update details for the specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"update_contacts\": {\n \"description\": \"Update domain\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"update_contacts\",\n \"parameters\": [\n {\n \"description\": \"Shopper for whom domain contacts are to be updated. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose Contacts are to be updated.\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/contacts\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainContacts\"\n },\n \"security\": null,\n \"skill_name\": \"update_contacts\",\n \"summary\": \"Update domain\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"validate\": {\n \"description\": \"Validate the request body using the Domain Purchase Schema for the specified TLD\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"validate\",\n \"parameters\": [],\n \"path\": \"/v1/domains/purchase/validate\",\n \"request_body\": {\n \"$ref\": \"#/definitions/DomainPurchase\"\n },\n \"security\": null,\n \"skill_name\": \"validate\",\n \"summary\": \"Validate the request body using the Domain Purchase Schema for the specified TLD\",\n \"tags\": [\n \"v1\"\n ]\n },\n \"verify_email\": {\n \"description\": \"Re-send Contact E-mail Verification for specified Domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"verify_email\",\n \"parameters\": [\n {\n \"description\": \"Shopper for whom domain contact e-mail should be verified. NOTE: This is only required if you are a Reseller managing a domain purchased outside the scope of your reseller account. For instance, if you're a Reseller, but purchased a Domain via http://www.godaddy.com\",\n \"in\": \"header\",\n \"name\": \"X-Shopper-Id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Domain whose Contact E-mail should be verified.\",\n \"in\": \"path\",\n \"name\": \"domain\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/v1/domains/{domain}/verifyRegistrantEmail\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"verify_email\",\n \"summary\": \"Re-send Contact E-mail Verification for specified Domain\",\n \"tags\": [\n \"v1\"\n ]\n }\n}")
|
|
ROOT_SECURITY = json.loads("[\n {\n \"godaddy_sso_key\": []\n }\n]")
|
|
SECURITY_SCHEMES = json.loads("{\n \"godaddy_sso_key\": {\n \"description\": \"GoDaddy API key and secret in API_KEY:API_SECRET format.\",\n \"in\": \"header\",\n \"name\": \"Authorization\",\n \"type\": \"apiKey\",\n \"x-a2a-description\": \"Enter API_KEY:API_SECRET. Requests send it as Authorization: sso-key <value>.\",\n \"x-a2a-field-name\": \"GODADDY_API_KEY_SECRET\",\n \"x-a2a-label\": \"GoDaddy API key and secret\",\n \"x-a2a-prefix\": \"sso-key \"\n }\n}")
|
|
SECURITY_FIELDS = json.loads("{\n \"godaddy_sso_key\": {\n \"field\": \"GODADDY_API_KEY_SECRET\",\n \"kind\": \"apiKey\",\n \"location\": \"header\",\n \"name\": \"Authorization\",\n \"prefix\": \"sso-key \"\n }\n}")
|
|
PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}")
|
|
|
|
|
|
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 GoDaddy(A2AAgent):
|
|
name = "go-daddy"
|
|
description = "<p>The Domains API is for domain-related actions such as purchasing, renewing, or managing domains.</p><p>Updates to domains generally require the domain to be in an `ACTIVE` status. Some update actions (such as updating nameservers) on protected and high-value domains requires 2FA which is currently not supported via the api.</p>"
|
|
version = "0.1.0"
|
|
consumer_setup = ConsumerSetup.from_fields(
|
|
ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://api.ote-godaddy.com).", required=False, input_type="url"),
|
|
ConsumerSetupField.secret("GODADDY_API_KEY_SECRET", label="GoDaddy API key and secret", description="Enter API_KEY:API_SECRET. Requests send it as Authorization: sso-key <value>.", required=True),
|
|
)
|
|
llm_provisioning = LLMProvisioning.PLATFORM
|
|
pricing = Pricing(
|
|
price_per_call_usd=0.0,
|
|
caller_pays_llm=False,
|
|
notes="Uses a scoped platform LLM grant through ctx.llm.",
|
|
)
|
|
resources = Resources(cpu="200m", memory="512Mi")
|
|
egress = EgressPolicy(
|
|
allow_hosts=('api.ote-godaddy.com',),
|
|
deny_internet_by_default=True,
|
|
)
|
|
tools_used = ("openapi", "deepagents")
|
|
capabilities = {
|
|
"openapi_auto_agent": {
|
|
"operation_count": len(OPERATIONS),
|
|
"default_base_url": DEFAULT_BASE_URL,
|
|
"security_schemes": list(SECURITY_SCHEMES),
|
|
}
|
|
}
|
|
|
|
@skill(
|
|
name="auto",
|
|
description="Use the OpenAPI service to complete a natural-language goal.",
|
|
tags=("openapi", "auto"),
|
|
timeout_seconds=180,
|
|
)
|
|
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 credentials were not available for this run. Hosted "
|
|
"generated OpenAPI agents should receive a platform LLM grant."
|
|
),
|
|
"messages": [],
|
|
}
|
|
model_kwargs: dict[str, Any] = {
|
|
"model": creds.model,
|
|
"base_url": creds.base_url,
|
|
"api_key": creds.api_key,
|
|
}
|
|
if creds.temperature_mode != "omit" and creds.temperature is not None:
|
|
model_kwargs["temperature"] = creds.temperature
|
|
if creds.extra_body:
|
|
model_kwargs["extra_body"] = dict(creds.extra_body)
|
|
model = ChatOpenAI(**model_kwargs)
|
|
graph = create_deep_agent(
|
|
model=model,
|
|
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="list",
|
|
description="GET /v1/domains - Retrieve a list of Domains for the specified Shopper",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def list(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"list",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_agreement",
|
|
description="GET /v1/domains/agreements - Retrieve the legal agreement(s) required to purchase the specified TLD and add-ons",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_agreement(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_agreement",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="available",
|
|
description="GET /v1/domains/available - Determine whether or not the specified domain is available for purchase",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def available(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"available",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="available_bulk",
|
|
description="POST /v1/domains/available - Determine whether or not the specified domains are available for purchase",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def available_bulk(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"available_bulk",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="contacts_validate",
|
|
description="POST /v1/domains/contacts/validate - Validate the request body using the Domain Contact Validation Schema for specified domains.",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def contacts_validate(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"contacts_validate",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="purchase",
|
|
description="POST /v1/domains/purchase - Purchase and register the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def purchase(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"purchase",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="schema",
|
|
description="GET /v1/domains/purchase/schema/{tld} - Retrieve the schema to be submitted when registering a Domain for the specified TLD",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def schema(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"schema",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="validate",
|
|
description="POST /v1/domains/purchase/validate - Validate the request body using the Domain Purchase Schema for the specified TLD",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def validate(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"validate",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="suggest",
|
|
description="GET /v1/domains/suggest - Suggest alternate Domain names based on a seed Domain, a set of keywords, or the shopper's purchase history",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def suggest(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"suggest",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="tlds",
|
|
description="GET /v1/domains/tlds - Retrieves a list of TLDs supported and enabled for sale",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def tlds(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"tlds",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="cancel",
|
|
description="DELETE /v1/domains/{domain} - Cancel a purchased domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def cancel(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"cancel",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get",
|
|
description="GET /v1/domains/{domain} - Retrieve details for the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="update",
|
|
description="PATCH /v1/domains/{domain} - Update details for the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def update(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"update",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="update_contacts",
|
|
description="PATCH /v1/domains/{domain}/contacts - Update domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def update_contacts(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"update_contacts",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="cancel_privacy",
|
|
description="DELETE /v1/domains/{domain}/privacy - Submit a privacy cancellation request for the given domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def cancel_privacy(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"cancel_privacy",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="purchase_privacy",
|
|
description="POST /v1/domains/{domain}/privacy/purchase - Purchase privacy for a specified domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def purchase_privacy(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"purchase_privacy",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_add",
|
|
description="PATCH /v1/domains/{domain}/records - Add the specified DNS Records to the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def record_add(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_add",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_replace",
|
|
description="PUT /v1/domains/{domain}/records - Replace all DNS Records for the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def record_replace(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_replace",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_get",
|
|
description="GET /v1/domains/{domain}/records/{type}/{name} - Retrieve DNS Records for the specified Domain, optionally with the specified Type and/or Name",
|
|
tags=('v1',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def record_get(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_get",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_replace_type_name",
|
|
description="PUT /v1/domains/{domain}/records/{type}/{name} - Replace all DNS Records for the specified Domain with the specified Type and Name",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def record_replace_type_name(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_replace_type_name",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_delete_type_name",
|
|
description="DELETE /v1/domains/{domain}/records/{type}/{name} - Delete all DNS Records for the specified Domain with the specified Type and Name",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def record_delete_type_name(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_delete_type_name",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="record_replace_type",
|
|
description="PUT /v1/domains/{domain}/records/{type} - Replace all DNS Records for the specified Domain with the specified Type",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def record_replace_type(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"record_replace_type",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="renew",
|
|
description="POST /v1/domains/{domain}/renew - Renew the specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def renew(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"renew",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="transfer_in",
|
|
description="POST /v1/domains/{domain}/transfer - Purchase and start or restart transfer process",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def transfer_in(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"transfer_in",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="verify_email",
|
|
description="POST /v1/domains/{domain}/verifyRegistrantEmail - Re-send Contact E-mail Verification for specified Domain",
|
|
tags=('v1',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def verify_email(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"verify_email",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain",
|
|
description="GET /v2/customers/{customerId}/domains/{domain} - Retrieve details for the specified Domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_v2_customers_customer_id_domains_domain_change_of_registrant",
|
|
description="DELETE /v2/customers/{customerId}/domains/{domain}/changeOfRegistrant - Cancels a pending change of registrant request for a given domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_v2_customers_customer_id_domains_domain_change_of_registrant(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_v2_customers_customer_id_domains_domain_change_of_registrant",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain_change_of_registrant",
|
|
description="GET /v2/customers/{customerId}/domains/{domain}/changeOfRegistrant - Retrieve change of registrant information",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain_change_of_registrant(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain_change_of_registrant",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_v2_customers_customer_id_domains_domain_dnssec_records",
|
|
description="PATCH /v2/customers/{customerId}/domains/{domain}/dnssecRecords - Add the specifed DNSSEC records to the domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_v2_customers_customer_id_domains_domain_dnssec_records(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_v2_customers_customer_id_domains_domain_dnssec_records",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_v2_customers_customer_id_domains_domain_dnssec_records",
|
|
description="DELETE /v2/customers/{customerId}/domains/{domain}/dnssecRecords - Remove the specifed DNSSEC record from the domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_v2_customers_customer_id_domains_domain_dnssec_records(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_v2_customers_customer_id_domains_domain_dnssec_records",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="put_v2_customers_customer_id_domains_domain_name_servers",
|
|
description="PUT /v2/customers/{customerId}/domains/{domain}/nameServers - Replaces the existing name servers on the domain.",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def put_v2_customers_customer_id_domains_domain_name_servers(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"put_v2_customers_customer_id_domains_domain_name_servers",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain_privacy_forwarding",
|
|
description="GET /v2/customers/{customerId}/domains/{domain}/privacy/forwarding - Retrieve privacy email forwarding settings showing where emails are delivered",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain_privacy_forwarding(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain_privacy_forwarding",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_v2_customers_customer_id_domains_domain_privacy_forwarding",
|
|
description="PATCH /v2/customers/{customerId}/domains/{domain}/privacy/forwarding - Update privacy email forwarding settings to determine how emails are delivered",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_v2_customers_customer_id_domains_domain_privacy_forwarding(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_v2_customers_customer_id_domains_domain_privacy_forwarding",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_redeem",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/redeem - Purchase a restore for the given domain to bring it out of redemption",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_redeem(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_redeem",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_renew",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/renew - Renew the specified Domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_renew(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_renew",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transfer - Purchase and start or restart transfer process",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain_transfer",
|
|
description="GET /v2/customers/{customerId}/domains/{domain}/transfer - Query the current transfer status",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain_transfer(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain_transfer",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_validate",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transfer/validate - Validate the request body using the Domain Transfer Schema for the specified TLD",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_validate(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_validate",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_in_accept",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferInAccept - Accepts the transfer in",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_in_accept(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_in_accept",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_in_cancel",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferInCancel - Cancels the transfer in",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_in_cancel(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_in_cancel",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_in_restart",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferInRestart - Restarts transfer in request from the beginning",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_in_restart(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_in_restart",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_in_retry",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferInRetry - Retries the current transfer in request with supplied Authorization code",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_in_retry(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_in_retry",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_out",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferOut - Initiate transfer out to another registrar for a .uk domain.",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_out(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_out",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_out_accept",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferOutAccept - Accept transfer out",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_out_accept(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_out_accept",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_transfer_out_reject",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/transferOutReject - Reject transfer out",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_transfer_out_reject(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_transfer_out_reject",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="domains_forwards_delete",
|
|
description="DELETE /v2/customers/{customerId}/domains/forwards/{fqdn} - Submit a forwarding cancellation request for the given fqdn",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def domains_forwards_delete(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"domains_forwards_delete",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="domains_forwards_get",
|
|
description="GET /v2/customers/{customerId}/domains/forwards/{fqdn} - Retrieve the forwarding information for the given fqdn",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def domains_forwards_get(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"domains_forwards_get",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="domains_forwards_put",
|
|
description="PUT /v2/customers/{customerId}/domains/forwards/{fqdn} - Modify the forwarding information for the given fqdn",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def domains_forwards_put(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"domains_forwards_put",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="domains_forwards_post",
|
|
description="POST /v2/customers/{customerId}/domains/forwards/{fqdn} - Create a new forwarding configuration for the given FQDN",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def domains_forwards_post(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"domains_forwards_post",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain_actions",
|
|
description="GET /v2/customers/{customerId}/domains/{domain}/actions - Retrieves a list of the most recent actions for the specified domain",
|
|
tags=('Actions',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain_actions(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain_actions",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="delete_v2_customers_customer_id_domains_domain_actions_type",
|
|
description="DELETE /v2/customers/{customerId}/domains/{domain}/actions/{type} - Cancel the most recent user action for the specified domain",
|
|
tags=('Actions',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def delete_v2_customers_customer_id_domains_domain_actions_type(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"delete_v2_customers_customer_id_domains_domain_actions_type",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_domain_actions_type",
|
|
description="GET /v2/customers/{customerId}/domains/{domain}/actions/{type} - Retrieves the most recent action for the specified domain",
|
|
tags=('Actions',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_domain_actions_type(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_domain_actions_type",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_notifications",
|
|
description="GET /v2/customers/{customerId}/domains/notifications - Retrieve the next domain notification",
|
|
tags=('Notifications',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_notifications(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_notifications",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_notifications_opt_in",
|
|
description="GET /v2/customers/{customerId}/domains/notifications/optIn - Retrieve a list of notification types that are opted in",
|
|
tags=('Notifications',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_notifications_opt_in(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_notifications_opt_in",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="put_v2_customers_customer_id_domains_notifications_opt_in",
|
|
description="PUT /v2/customers/{customerId}/domains/notifications/optIn - Opt in to recieve notifications for the submitted notification types",
|
|
tags=('Notifications',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def put_v2_customers_customer_id_domains_notifications_opt_in(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"put_v2_customers_customer_id_domains_notifications_opt_in",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_notifications_schemas_type",
|
|
description="GET /v2/customers/{customerId}/domains/notifications/schemas/{type} - Retrieve the schema for the notification data for the specified notification type",
|
|
tags=('Notifications',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_notifications_schemas_type(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_notifications_schemas_type",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge",
|
|
description="POST /v2/customers/{customerId}/domains/notifications/{notificationId}/acknowledge - Acknowledge a domain notification",
|
|
tags=('Notifications',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_notifications_notification_id_acknowledge",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_register",
|
|
description="POST /v2/customers/{customerId}/domains/register - Purchase and register the specified Domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_register(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_register",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_customers_customer_id_domains_register_schema_tld",
|
|
description="GET /v2/customers/{customerId}/domains/register/schema/{tld} - Retrieve the schema to be submitted when registering a Domain for the specified TLD",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_customers_customer_id_domains_register_schema_tld(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_customers_customer_id_domains_register_schema_tld",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_register_validate",
|
|
description="POST /v2/customers/{customerId}/domains/register/validate - Validate the request body using the Domain Registration Schema for the specified TLD",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_register_validate(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_register_validate",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_domains_maintenances",
|
|
description="GET /v2/domains/maintenances - Retrieve a list of upcoming system Maintenances",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_domains_maintenances(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_domains_maintenances",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_domains_maintenances_maintenance_id",
|
|
description="GET /v2/domains/maintenances/{maintenanceId} - Retrieve the details for an upcoming system Maintenances",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_domains_maintenances_maintenance_id(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_domains_maintenances_maintenance_id",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="get_v2_domains_usage_yyyymm",
|
|
description="GET /v2/domains/usage/{yyyymm} - Retrieve api usage request counts for a specific year/month. The data is retained for a period of three months.",
|
|
tags=('Domains',),
|
|
timeout_seconds=60,
|
|
)
|
|
async def get_v2_domains_usage_yyyymm(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"get_v2_domains_usage_yyyymm",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="patch_v2_customers_customer_id_domains_domain_contacts",
|
|
description="PATCH /v2/customers/{customerId}/domains/{domain}/contacts - Update domain contacts",
|
|
tags=('Contacts',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def patch_v2_customers_customer_id_domains_domain_contacts(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"patch_v2_customers_customer_id_domains_domain_contacts",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
@skill(
|
|
name="post_v2_customers_customer_id_domains_domain_regenerate_auth_code",
|
|
description="POST /v2/customers/{customerId}/domains/{domain}/regenerateAuthCode - Regenerate the auth code for the given domain",
|
|
tags=('Domains',),
|
|
timeout_seconds=120,
|
|
)
|
|
async def post_v2_customers_customer_id_domains_domain_regenerate_auth_code(
|
|
self,
|
|
ctx: RunContext,
|
|
parameters: dict[str, Any] | None = None,
|
|
body: Any | None = None,
|
|
) -> dict[str, Any]:
|
|
return await self._request(
|
|
ctx,
|
|
"post_v2_customers_customer_id_domains_domain_regenerate_auth_code",
|
|
parameters=parameters or {},
|
|
body=body,
|
|
)
|
|
|
|
def _operation_tools(self, ctx: RunContext) -> list[StructuredTool]:
|
|
tools: list[StructuredTool] = []
|
|
for operation_id, operation in OPERATIONS.items():
|
|
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:
|
|
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.",
|
|
"",
|
|
"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 _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]
|
|
base_url = str(ctx.consumer_config("OPENAPI_BASE_URL", 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:
|
|
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:
|
|
return {
|
|
"ok": False,
|
|
"status_code": response.status_code,
|
|
"operation_id": operation_id,
|
|
"error": payload,
|
|
}
|
|
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 _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 = GoDaddy()
|