From 0c9c0aa26d951053d051fc04ecc624bcdc73fecf Mon Sep 17 00:00:00 2001 From: a2a-platform Date: Sat, 27 Jun 2026 01:06:13 +0000 Subject: [PATCH] deploy --- README.md | 11 + a2a.yaml | 13 + agent.py | 434 ++ openapi.json | 6949 ++++++++++++++++++++++++++++ requirements.txt | 7 + skills/api-keys/SKILL.md | 42 + skills/audiences/SKILL.md | 47 + skills/automations/SKILL.md | 94 + skills/broadcasts/SKILL.md | 71 + skills/contact-properties/SKILL.md | 61 + skills/contacts/SKILL.md | 116 + skills/domains/SKILL.md | 70 + skills/emails/SKILL.md | 136 + skills/events/SKILL.md | 69 + skills/logs/SKILL.md | 34 + skills/segments/SKILL.md | 51 + skills/templates/SKILL.md | 79 + skills/topics/SKILL.md | 61 + skills/webhooks/SKILL.md | 61 + 19 files changed, 8406 insertions(+) create mode 100644 README.md create mode 100644 a2a.yaml create mode 100644 agent.py create mode 100644 openapi.json create mode 100644 requirements.txt create mode 100644 skills/api-keys/SKILL.md create mode 100644 skills/audiences/SKILL.md create mode 100644 skills/automations/SKILL.md create mode 100644 skills/broadcasts/SKILL.md create mode 100644 skills/contact-properties/SKILL.md create mode 100644 skills/contacts/SKILL.md create mode 100644 skills/domains/SKILL.md create mode 100644 skills/emails/SKILL.md create mode 100644 skills/events/SKILL.md create mode 100644 skills/logs/SKILL.md create mode 100644 skills/segments/SKILL.md create mode 100644 skills/templates/SKILL.md create mode 100644 skills/topics/SKILL.md create mode 100644 skills/webhooks/SKILL.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..de3a6a8 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# resend-openapi-agent + +Generated A2APack agent for Resend. + +- Source OpenAPI: https://resend.com/openapi.json +- Generated operations: 83 +- Main skill: `auto` +- Routing mode: DeepAgents subagents across 14 route groups + +The generated code is intentionally editable. Tune prompts, operation +grouping, auth names, and safety policy before publishing serious agents. diff --git a/a2a.yaml b/a2a.yaml new file mode 100644 index 0000000..67bea7d --- /dev/null +++ b/a2a.yaml @@ -0,0 +1,13 @@ +name: resend-openapi-agent +version: 1.5.0 +entrypoint: agent:ResendOpenapiAgent +description: Transactional email API for sends, domains, audiences, contacts, receiving, + and webhooks. +runtime: + resources: + cpu: 200m + memory: 512Mi + egress: + allow_hosts: + - api.resend.com + deny_internet_by_default: true diff --git a/agent.py b/agent.py new file mode 100644 index 0000000..cdc6341 --- /dev/null +++ b/agent.py @@ -0,0 +1,434 @@ +from __future__ import annotations + +import base64 +import json +import re +from pathlib import Path +from typing import Any + +import httpx +from a2a_pack.deepagents import create_a2a_deep_agent +from langchain_core.messages import BaseMessage +from langchain_core.tools import StructuredTool +from pydantic import BaseModel, Field + +from a2a_pack import ( + A2AAgent, + ConsumerSetup, + ConsumerSetupField, + ConsumerSetupMissing, + EgressPolicy, + LLMProvisioning, + Pricing, + Resources, + RunContext, + skill, +) + + +DEFAULT_BASE_URL = "https://api.resend.com" +OPERATIONS = json.loads("{\n \"delete_api_keys_api_key_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing API key\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_api_keys_api_key_id\",\n \"parameters\": [\n {\n \"description\": \"The API key ID.\",\n \"in\": \"path\",\n \"name\": \"api_key_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api-keys/{api_key_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_api_keys_api_key_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing API key\",\n \"tags\": [\n \"API keys\"\n ]\n },\n \"delete_audiences_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_audiences_id\",\n \"parameters\": [\n {\n \"description\": \"The Audience ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/audiences/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_audiences_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing audience\",\n \"tags\": [\n \"Audiences\"\n ]\n },\n \"delete_automations_automation_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an automation\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_automations_automation_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_automations_automation_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Delete an automation\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"delete_broadcasts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing broadcast that is in the draft status\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_broadcasts_id\",\n \"parameters\": [\n {\n \"description\": \"The Broadcast ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/broadcasts/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_broadcasts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing broadcast that is in the draft status\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"delete_contact_properties_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing contact property\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_contact_properties_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact Property ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contact-properties/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_contact_properties_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing contact property\",\n \"tags\": [\n \"Contact Properties\"\n ]\n },\n \"delete_contacts_contact_id_segments_segment_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove a contact from a segment\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_contacts_contact_id_segments_segment_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"contact_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Segment ID.\",\n \"in\": \"path\",\n \"name\": \"segment_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{contact_id}/segments/{segment_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_contacts_contact_id_segments_segment_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove a contact from a segment\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"delete_contacts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing contact by ID or email\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_contacts_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_contacts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing contact by ID or email\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"delete_domains_domain_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing domain\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_domains_domain_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the domain.\",\n \"in\": \"path\",\n \"name\": \"domain_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains/{domain_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_domains_domain_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"delete_events_identifier\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an event\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_events_identifier\",\n \"parameters\": [\n {\n \"description\": \"The event ID (UUID) or event name.\",\n \"in\": \"path\",\n \"name\": \"identifier\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/events/{identifier}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_events_identifier\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Delete an event\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"delete_segments_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing segment\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_segments_id\",\n \"parameters\": [\n {\n \"description\": \"The Segment ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/segments/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_segments_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing segment\",\n \"tags\": [\n \"Segments\"\n ]\n },\n \"delete_templates_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing template\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_templates_id\",\n \"parameters\": [\n {\n \"description\": \"The Template ID or alias.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_templates_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"delete_topics_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing topic\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_topics_id\",\n \"parameters\": [\n {\n \"description\": \"The Topic ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/topics/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_topics_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing topic\",\n \"tags\": [\n \"Topics\"\n ]\n },\n \"delete_webhooks_webhook_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Remove an existing webhook\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"delete_webhooks_webhook_id\",\n \"parameters\": [\n {\n \"description\": \"The Webhook ID.\",\n \"in\": \"path\",\n \"name\": \"webhook_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/webhooks/{webhook_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"delete_webhooks_webhook_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Remove an existing webhook\",\n \"tags\": [\n \"Webhooks\"\n ]\n },\n \"get_api_keys\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of API keys\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_api_keys\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/api-keys\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_api_keys\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of API keys\",\n \"tags\": [\n \"API keys\"\n ]\n },\n \"get_audiences\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_audiences\",\n \"parameters\": [],\n \"path\": \"/audiences\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_audiences\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of audiences\",\n \"tags\": [\n \"Audiences\"\n ]\n },\n \"get_audiences_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_audiences_id\",\n \"parameters\": [\n {\n \"description\": \"The Audience ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/audiences/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_audiences_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single audience\",\n \"tags\": [\n \"Audiences\"\n ]\n },\n \"get_automations\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of automations\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_automations\",\n \"parameters\": [\n {\n \"description\": \"Filter automations by status.\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"enabled\",\n \"disabled\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_automations\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of automations\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"get_automations_automation_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single automation\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_automations_automation_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_automations_automation_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single automation\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"get_automations_automation_id_runs\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of automation runs\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_automations_automation_id_runs\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Filter runs by status. Comma-separated list of: running, completed, failed, cancelled.\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}/runs\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_automations_automation_id_runs\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of automation runs\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"get_automations_automation_id_runs_run_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single automation run\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_automations_automation_id_runs_run_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The ID of the automation run.\",\n \"in\": \"path\",\n \"name\": \"run_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}/runs/{run_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_automations_automation_id_runs_run_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single automation run\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"get_broadcasts\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of broadcasts\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_broadcasts\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/broadcasts\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_broadcasts\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of broadcasts\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"get_broadcasts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single broadcast\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_broadcasts_id\",\n \"parameters\": [\n {\n \"description\": \"The Broadcast ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/broadcasts/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_broadcasts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single broadcast\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"get_contact_properties\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of contact properties\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contact_properties\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contact-properties\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contact_properties\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of contact properties\",\n \"tags\": [\n \"Contact Properties\"\n ]\n },\n \"get_contact_properties_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single contact property\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contact_properties_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact Property ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contact-properties/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contact_properties_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single contact property\",\n \"tags\": [\n \"Contact Properties\"\n ]\n },\n \"get_contacts\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of contacts\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contacts\",\n \"parameters\": [\n {\n \"description\": \"Filter contacts by segment ID.\",\n \"in\": \"query\",\n \"name\": \"segment_id\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contacts\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of contacts\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"get_contacts_contact_id_segments\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of segments for a contact\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contacts_contact_id_segments\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"contact_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{contact_id}/segments\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contacts_contact_id_segments\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of segments for a contact\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"get_contacts_contact_id_topics\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve topics for a contact\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contacts_contact_id_topics\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"contact_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{contact_id}/topics\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contacts_contact_id_topics\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve topics for a contact\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"get_contacts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single contact by ID or email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_contacts_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_contacts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single contact by ID or email\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"get_domains\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of domains\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_domains\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_domains\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of domains\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_domains_domain_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single domain\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_domains_domain_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the domain.\",\n \"in\": \"path\",\n \"name\": \"domain_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains/{domain_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_domains_domain_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"get_emails\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of emails\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of emails\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"get_emails_email_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_email_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/{email_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_email_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single email\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"get_emails_email_id_attachments\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of attachments for a sent email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_email_id_attachments\",\n \"parameters\": [\n {\n \"description\": \"The ID of the email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Maximum number of attachments to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results after this attachment ID. Cannot be used with 'before'.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results before this attachment ID. Cannot be used with 'after'.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/{email_id}/attachments\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_email_id_attachments\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of attachments for a sent email\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"get_emails_email_id_attachments_attachment_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single attachment for a sent email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_email_id_attachments_attachment_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The ID of the attachment.\",\n \"in\": \"path\",\n \"name\": \"attachment_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/{email_id}/attachments/{attachment_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_email_id_attachments_attachment_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single attachment for a sent email\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"get_emails_receiving\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of received emails\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_receiving\",\n \"parameters\": [\n {\n \"description\": \"Maximum number of received emails to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results after this email ID. Cannot be used with 'before'.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results before this email ID. Cannot be used with 'after'.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/receiving\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_receiving\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of received emails\",\n \"tags\": [\n \"Receiving Emails\"\n ]\n },\n \"get_emails_receiving_email_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single received email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_receiving_email_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the received email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/receiving/{email_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_receiving_email_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single received email\",\n \"tags\": [\n \"Receiving Emails\"\n ]\n },\n \"get_emails_receiving_email_id_attachments\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of attachments for a received email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_receiving_email_id_attachments\",\n \"parameters\": [\n {\n \"description\": \"The ID of the received email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Maximum number of attachments to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results after this attachment ID. Cannot be used with 'before'.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results before this attachment ID. Cannot be used with 'after'.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/receiving/{email_id}/attachments\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_receiving_email_id_attachments\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of attachments for a received email\",\n \"tags\": [\n \"Receiving Emails\"\n ]\n },\n \"get_emails_receiving_email_id_attachments_attachment_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single attachment for a received email\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_emails_receiving_email_id_attachments_attachment_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the received email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The ID of the attachment.\",\n \"in\": \"path\",\n \"name\": \"attachment_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/receiving/{email_id}/attachments/{attachment_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_emails_receiving_email_id_attachments_attachment_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single attachment for a received email\",\n \"tags\": [\n \"Receiving Emails\"\n ]\n },\n \"get_events\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of events\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_events\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/events\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_events\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of events\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"get_events_identifier\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single event\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_events_identifier\",\n \"parameters\": [\n {\n \"description\": \"The event ID (UUID) or event name.\",\n \"in\": \"path\",\n \"name\": \"identifier\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/events/{identifier}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_events_identifier\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single event\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"get_logs\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of logs\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_logs\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/logs\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_logs\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of logs\",\n \"tags\": [\n \"Logs\"\n ]\n },\n \"get_logs_log_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single log\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_logs_log_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the log.\",\n \"in\": \"path\",\n \"name\": \"log_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/logs/{log_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_logs_log_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single log\",\n \"tags\": [\n \"Logs\"\n ]\n },\n \"get_segments\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of segments\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_segments\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/segments\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_segments\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of segments\",\n \"tags\": [\n \"Segments\"\n ]\n },\n \"get_segments_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single segment\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_segments_id\",\n \"parameters\": [\n {\n \"description\": \"The Segment ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/segments/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_segments_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single segment\",\n \"tags\": [\n \"Segments\"\n ]\n },\n \"get_templates\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of templates\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_templates\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_templates\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of templates\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"get_templates_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single template\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_templates_id\",\n \"parameters\": [\n {\n \"description\": \"The Template ID or alias.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_templates_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"get_topics\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of topics\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_topics\",\n \"parameters\": [\n {\n \"description\": \"Number of items to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Return items after this cursor.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Return items before this cursor.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/topics\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_topics\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of topics\",\n \"tags\": [\n \"Topics\"\n ]\n },\n \"get_topics_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single topic\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_topics_id\",\n \"parameters\": [\n {\n \"description\": \"The Topic ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/topics/{id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_topics_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single topic\",\n \"tags\": [\n \"Topics\"\n ]\n },\n \"get_webhooks\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of webhooks\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_webhooks\",\n \"parameters\": [\n {\n \"description\": \"Maximum number of webhooks to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results after this webhook ID. Cannot be used with 'before'.\",\n \"in\": \"query\",\n \"name\": \"after\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Pagination cursor to fetch results before this webhook ID. Cannot be used with 'after'.\",\n \"in\": \"query\",\n \"name\": \"before\",\n \"required\": false,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/webhooks\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_webhooks\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a list of webhooks\",\n \"tags\": [\n \"Webhooks\"\n ]\n },\n \"get_webhooks_webhook_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a single webhook\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_webhooks_webhook_id\",\n \"parameters\": [\n {\n \"description\": \"The Webhook ID.\",\n \"in\": \"path\",\n \"name\": \"webhook_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/webhooks/{webhook_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_webhooks_webhook_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Retrieve a single webhook\",\n \"tags\": [\n \"Webhooks\"\n ]\n },\n \"patch_automations_automation_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an automation\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_automations_automation_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/PatchAutomationRequest\"\n },\n \"security\": null,\n \"skill_name\": \"patch_automations_automation_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an automation\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"patch_broadcasts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing broadcast\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_broadcasts_id\",\n \"parameters\": [\n {\n \"description\": \"The Broadcast ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/broadcasts/{id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateBroadcastOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_broadcasts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing broadcast\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"patch_contact_properties_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing contact property\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_contact_properties_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact Property ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contact-properties/{id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateContactPropertyOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_contact_properties_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing contact property\",\n \"tags\": [\n \"Contact Properties\"\n ]\n },\n \"patch_contacts_contact_id_topics\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update topics for a contact\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_contacts_contact_id_topics\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"contact_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{contact_id}/topics\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateContactTopicsOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_contacts_contact_id_topics\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update topics for a contact\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"patch_contacts_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update a single contact by ID or email\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_contacts_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateContactOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_contacts_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update a single contact by ID or email\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"patch_domains_domain_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing domain\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_domains_domain_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the domain.\",\n \"in\": \"path\",\n \"name\": \"domain_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains/{domain_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateDomainOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_domains_domain_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"patch_emails_email_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update a single email\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_emails_email_id\",\n \"parameters\": [\n {\n \"description\": \"The ID of the email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/{email_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"patch_emails_email_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update a single email\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"patch_events_identifier\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an event\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_events_identifier\",\n \"parameters\": [\n {\n \"description\": \"The event ID (UUID) or event name.\",\n \"in\": \"path\",\n \"name\": \"identifier\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/events/{identifier}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateEventRequest\"\n },\n \"security\": null,\n \"skill_name\": \"patch_events_identifier\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an event\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"patch_templates_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing template\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_templates_id\",\n \"parameters\": [\n {\n \"description\": \"The Template ID or alias.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates/{id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateTemplateOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_templates_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"patch_topics_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing topic\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_topics_id\",\n \"parameters\": [\n {\n \"description\": \"The Topic ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/topics/{id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateTopicOptions\"\n },\n \"security\": null,\n \"skill_name\": \"patch_topics_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing topic\",\n \"tags\": [\n \"Topics\"\n ]\n },\n \"patch_webhooks_webhook_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update an existing webhook\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"patch_webhooks_webhook_id\",\n \"parameters\": [\n {\n \"description\": \"The Webhook ID.\",\n \"in\": \"path\",\n \"name\": \"webhook_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/webhooks/{webhook_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/UpdateWebhookRequest\"\n },\n \"security\": null,\n \"skill_name\": \"patch_webhooks_webhook_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Update an existing webhook\",\n \"tags\": [\n \"Webhooks\"\n ]\n },\n \"post_api_keys\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new API key\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_api_keys\",\n \"parameters\": [],\n \"path\": \"/api-keys\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateApiKeyRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_api_keys\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new API key\",\n \"tags\": [\n \"API keys\"\n ]\n },\n \"post_audiences\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_audiences\",\n \"parameters\": [],\n \"path\": \"/audiences\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateAudienceOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_audiences\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a list of contacts\",\n \"tags\": [\n \"Audiences\"\n ]\n },\n \"post_automations\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create an automation\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_automations\",\n \"parameters\": [],\n \"path\": \"/automations\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateAutomationRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_automations\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create an automation\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"post_automations_automation_id_stop\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Stop an automation\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_automations_automation_id_stop\",\n \"parameters\": [\n {\n \"description\": \"The ID of the automation.\",\n \"in\": \"path\",\n \"name\": \"automation_id\",\n \"required\": true,\n \"schema\": {\n \"format\": \"uuid\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/automations/{automation_id}/stop\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_automations_automation_id_stop\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Stop an automation\",\n \"tags\": [\n \"Automations\"\n ]\n },\n \"post_broadcasts\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a broadcast\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_broadcasts\",\n \"parameters\": [],\n \"path\": \"/broadcasts\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateBroadcastOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_broadcasts\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a broadcast\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"post_broadcasts_id_send\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Send or schedule a broadcast\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_broadcasts_id_send\",\n \"parameters\": [\n {\n \"description\": \"The Broadcast ID.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/broadcasts/{id}/send\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/SendBroadcastOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_broadcasts_id_send\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Send or schedule a broadcast\",\n \"tags\": [\n \"Broadcasts\"\n ]\n },\n \"post_contact_properties\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new contact property\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_contact_properties\",\n \"parameters\": [],\n \"path\": \"/contact-properties\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateContactPropertyOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_contact_properties\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new contact property\",\n \"tags\": [\n \"Contact Properties\"\n ]\n },\n \"post_contacts\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new contact\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_contacts\",\n \"parameters\": [],\n \"path\": \"/contacts\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateContactOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_contacts\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new contact\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"post_contacts_contact_id_segments_segment_id\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Add a contact to a segment\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_contacts_contact_id_segments_segment_id\",\n \"parameters\": [\n {\n \"description\": \"The Contact ID or email address.\",\n \"in\": \"path\",\n \"name\": \"contact_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"The Segment ID.\",\n \"in\": \"path\",\n \"name\": \"segment_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/contacts/{contact_id}/segments/{segment_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_contacts_contact_id_segments_segment_id\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Add a contact to a segment\",\n \"tags\": [\n \"Contacts\"\n ]\n },\n \"post_domains\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new domain\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_domains\",\n \"parameters\": [],\n \"path\": \"/domains\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateDomainRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_domains\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_domains_domain_id_verify\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Triggers verification of the domain's DNS records including DKIM, SPF, and the tracking CNAME (if a tracking subdomain is configured).\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_domains_domain_id_verify\",\n \"parameters\": [\n {\n \"description\": \"The ID of the domain.\",\n \"in\": \"path\",\n \"name\": \"domain_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains/{domain_id}/verify\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_domains_domain_id_verify\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Verify an existing domain\",\n \"tags\": [\n \"Domains\"\n ]\n },\n \"post_emails\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Send an email\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_emails\",\n \"parameters\": [\n {\n \"description\": \"A unique identifier for the request to ensure emails are only sent once. [Learn more](https://resend.com/docs/dashboard/emails/idempotency-keys)\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/SendEmailRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_emails\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Send an email\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"post_emails_batch\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Trigger up to 100 batch emails at once.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_emails_batch\",\n \"parameters\": [\n {\n \"description\": \"A unique identifier for the request to ensure emails are only sent once. [Learn more](https://resend.com/docs/dashboard/emails/idempotency-keys)\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/batch\",\n \"request_body\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/SendEmailRequest\"\n },\n \"type\": \"array\"\n },\n \"security\": null,\n \"skill_name\": \"post_emails_batch\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Trigger up to 100 batch emails at once.\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"post_emails_email_id_cancel\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Cancel the schedule of the e-mail.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_emails_email_id_cancel\",\n \"parameters\": [\n {\n \"description\": \"The ID of the email.\",\n \"in\": \"path\",\n \"name\": \"email_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/emails/{email_id}/cancel\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_emails_email_id_cancel\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Cancel the schedule of the e-mail.\",\n \"tags\": [\n \"Emails\"\n ]\n },\n \"post_events\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create an event\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_events\",\n \"parameters\": [],\n \"path\": \"/events\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateEventRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_events\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create an event\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"post_events_send\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Send an event\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_events_send\",\n \"parameters\": [],\n \"path\": \"/events/send\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/SendEventRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_events_send\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Send an event\",\n \"tags\": [\n \"Events\"\n ]\n },\n \"post_segments\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new segment\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_segments\",\n \"parameters\": [],\n \"path\": \"/segments\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateSegmentOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_segments\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new segment\",\n \"tags\": [\n \"Segments\"\n ]\n },\n \"post_templates\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a template\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_templates\",\n \"parameters\": [],\n \"path\": \"/templates\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateTemplateRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_templates\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"post_templates_id_duplicate\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Duplicate a template\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_templates_id_duplicate\",\n \"parameters\": [\n {\n \"description\": \"The Template ID or alias.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates/{id}/duplicate\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_templates_id_duplicate\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Duplicate a template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"post_templates_id_publish\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Publish a template\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_templates_id_publish\",\n \"parameters\": [\n {\n \"description\": \"The Template ID or alias.\",\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/templates/{id}/publish\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"post_templates_id_publish\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Publish a template\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"post_topics\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new topic\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_topics\",\n \"parameters\": [],\n \"path\": \"/topics\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateTopicOptions\"\n },\n \"security\": null,\n \"skill_name\": \"post_topics\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new topic\",\n \"tags\": [\n \"Topics\"\n ]\n },\n \"post_webhooks\": {\n \"base_url\": \"https://api.resend.com\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Create a new webhook\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"post_webhooks\",\n \"parameters\": [],\n \"path\": \"/webhooks\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/CreateWebhookRequest\"\n },\n \"security\": null,\n \"skill_name\": \"post_webhooks\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://resend.com/openapi.json\",\n \"source_title\": \"Resend\",\n \"summary\": \"Create a new webhook\",\n \"tags\": [\n \"Webhooks\"\n ]\n }\n}") +OPERATION_GROUPS = json.loads("[\n {\n \"common_prefix\": \"/emails\",\n \"description\": \"Handle 12 OpenAPI operation(s) under /emails for the emails route group.\",\n \"id\": \"emails\",\n \"label\": \"emails\",\n \"operation_ids\": [\n \"post_emails\",\n \"get_emails\",\n \"get_emails_email_id\",\n \"patch_emails_email_id\",\n \"post_emails_email_id_cancel\",\n \"post_emails_batch\",\n \"get_emails_email_id_attachments\",\n \"get_emails_email_id_attachments_attachment_id\",\n \"get_emails_receiving\",\n \"get_emails_receiving_email_id\",\n \"get_emails_receiving_email_id_attachments\",\n \"get_emails_receiving_email_id_attachments_attachment_id\"\n ],\n \"skill_dir\": \"emails\",\n \"skill_name\": \"emails-routes\",\n \"skill_path\": \"skills/emails/SKILL.md\",\n \"subagent_name\": \"emails-api\"\n },\n {\n \"common_prefix\": \"/domains\",\n \"description\": \"Handle 6 OpenAPI operation(s) under /domains for the domains route group.\",\n \"id\": \"domains\",\n \"label\": \"domains\",\n \"operation_ids\": [\n \"post_domains\",\n \"get_domains\",\n \"get_domains_domain_id\",\n \"patch_domains_domain_id\",\n \"delete_domains_domain_id\",\n \"post_domains_domain_id_verify\"\n ],\n \"skill_dir\": \"domains\",\n \"skill_name\": \"domains-routes\",\n \"skill_path\": \"skills/domains/SKILL.md\",\n \"subagent_name\": \"domains-api\"\n },\n {\n \"common_prefix\": \"/api-keys\",\n \"description\": \"Handle 3 OpenAPI operation(s) under /api-keys for the api keys route group.\",\n \"id\": \"api_keys\",\n \"label\": \"api keys\",\n \"operation_ids\": [\n \"post_api_keys\",\n \"get_api_keys\",\n \"delete_api_keys_api_key_id\"\n ],\n \"skill_dir\": \"api-keys\",\n \"skill_name\": \"api-keys-routes\",\n \"skill_path\": \"skills/api-keys/SKILL.md\",\n \"subagent_name\": \"api-keys-api\"\n },\n {\n \"common_prefix\": \"/templates\",\n \"description\": \"Handle 7 OpenAPI operation(s) under /templates for the templates route group.\",\n \"id\": \"templates\",\n \"label\": \"templates\",\n \"operation_ids\": [\n \"post_templates\",\n \"get_templates\",\n \"get_templates_id\",\n \"patch_templates_id\",\n \"delete_templates_id\",\n \"post_templates_id_publish\",\n \"post_templates_id_duplicate\"\n ],\n \"skill_dir\": \"templates\",\n \"skill_name\": \"templates-routes\",\n \"skill_path\": \"skills/templates/SKILL.md\",\n \"subagent_name\": \"templates-api\"\n },\n {\n \"common_prefix\": \"/audiences\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /audiences for the audiences route group.\",\n \"id\": \"audiences\",\n \"label\": \"audiences\",\n \"operation_ids\": [\n \"post_audiences\",\n \"get_audiences\",\n \"delete_audiences_id\",\n \"get_audiences_id\"\n ],\n \"skill_dir\": \"audiences\",\n \"skill_name\": \"audiences-routes\",\n \"skill_path\": \"skills/audiences/SKILL.md\",\n \"subagent_name\": \"audiences-api\"\n },\n {\n \"common_prefix\": \"/contacts\",\n \"description\": \"Handle 10 OpenAPI operation(s) under /contacts for the contacts route group.\",\n \"id\": \"contacts\",\n \"label\": \"contacts\",\n \"operation_ids\": [\n \"post_contacts\",\n \"get_contacts\",\n \"get_contacts_id\",\n \"patch_contacts_id\",\n \"delete_contacts_id\",\n \"get_contacts_contact_id_segments\",\n \"post_contacts_contact_id_segments_segment_id\",\n \"delete_contacts_contact_id_segments_segment_id\",\n \"get_contacts_contact_id_topics\",\n \"patch_contacts_contact_id_topics\"\n ],\n \"skill_dir\": \"contacts\",\n \"skill_name\": \"contacts-routes\",\n \"skill_path\": \"skills/contacts/SKILL.md\",\n \"subagent_name\": \"contacts-api\"\n },\n {\n \"common_prefix\": \"/broadcasts\",\n \"description\": \"Handle 6 OpenAPI operation(s) under /broadcasts for the broadcasts route group.\",\n \"id\": \"broadcasts\",\n \"label\": \"broadcasts\",\n \"operation_ids\": [\n \"post_broadcasts\",\n \"get_broadcasts\",\n \"delete_broadcasts_id\",\n \"get_broadcasts_id\",\n \"patch_broadcasts_id\",\n \"post_broadcasts_id_send\"\n ],\n \"skill_dir\": \"broadcasts\",\n \"skill_name\": \"broadcasts-routes\",\n \"skill_path\": \"skills/broadcasts/SKILL.md\",\n \"subagent_name\": \"broadcasts-api\"\n },\n {\n \"common_prefix\": \"/webhooks\",\n \"description\": \"Handle 5 OpenAPI operation(s) under /webhooks for the webhooks route group.\",\n \"id\": \"webhooks\",\n \"label\": \"webhooks\",\n \"operation_ids\": [\n \"post_webhooks\",\n \"get_webhooks\",\n \"get_webhooks_webhook_id\",\n \"patch_webhooks_webhook_id\",\n \"delete_webhooks_webhook_id\"\n ],\n \"skill_dir\": \"webhooks\",\n \"skill_name\": \"webhooks-routes\",\n \"skill_path\": \"skills/webhooks/SKILL.md\",\n \"subagent_name\": \"webhooks-api\"\n },\n {\n \"common_prefix\": \"/segments\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /segments for the segments route group.\",\n \"id\": \"segments\",\n \"label\": \"segments\",\n \"operation_ids\": [\n \"post_segments\",\n \"get_segments\",\n \"get_segments_id\",\n \"delete_segments_id\"\n ],\n \"skill_dir\": \"segments\",\n \"skill_name\": \"segments-routes\",\n \"skill_path\": \"skills/segments/SKILL.md\",\n \"subagent_name\": \"segments-api\"\n },\n {\n \"common_prefix\": \"/topics\",\n \"description\": \"Handle 5 OpenAPI operation(s) under /topics for the topics route group.\",\n \"id\": \"topics\",\n \"label\": \"topics\",\n \"operation_ids\": [\n \"post_topics\",\n \"get_topics\",\n \"get_topics_id\",\n \"patch_topics_id\",\n \"delete_topics_id\"\n ],\n \"skill_dir\": \"topics\",\n \"skill_name\": \"topics-routes\",\n \"skill_path\": \"skills/topics/SKILL.md\",\n \"subagent_name\": \"topics-api\"\n },\n {\n \"common_prefix\": \"/contact-properties\",\n \"description\": \"Handle 5 OpenAPI operation(s) under /contact-properties for the contact properties route group.\",\n \"id\": \"contact_properties\",\n \"label\": \"contact properties\",\n \"operation_ids\": [\n \"post_contact_properties\",\n \"get_contact_properties\",\n \"get_contact_properties_id\",\n \"patch_contact_properties_id\",\n \"delete_contact_properties_id\"\n ],\n \"skill_dir\": \"contact-properties\",\n \"skill_name\": \"contact-properties-routes\",\n \"skill_path\": \"skills/contact-properties/SKILL.md\",\n \"subagent_name\": \"contact-properties-api\"\n },\n {\n \"common_prefix\": \"/logs\",\n \"description\": \"Handle 2 OpenAPI operation(s) under /logs for the logs route group.\",\n \"id\": \"logs\",\n \"label\": \"logs\",\n \"operation_ids\": [\n \"get_logs\",\n \"get_logs_log_id\"\n ],\n \"skill_dir\": \"logs\",\n \"skill_name\": \"logs-routes\",\n \"skill_path\": \"skills/logs/SKILL.md\",\n \"subagent_name\": \"logs-api\"\n },\n {\n \"common_prefix\": \"/automations\",\n \"description\": \"Handle 8 OpenAPI operation(s) under /automations for the automations route group.\",\n \"id\": \"automations\",\n \"label\": \"automations\",\n \"operation_ids\": [\n \"post_automations\",\n \"get_automations\",\n \"get_automations_automation_id\",\n \"patch_automations_automation_id\",\n \"delete_automations_automation_id\",\n \"post_automations_automation_id_stop\",\n \"get_automations_automation_id_runs\",\n \"get_automations_automation_id_runs_run_id\"\n ],\n \"skill_dir\": \"automations\",\n \"skill_name\": \"automations-routes\",\n \"skill_path\": \"skills/automations/SKILL.md\",\n \"subagent_name\": \"automations-api\"\n },\n {\n \"common_prefix\": \"/events\",\n \"description\": \"Handle 6 OpenAPI operation(s) under /events for the events route group.\",\n \"id\": \"events\",\n \"label\": \"events\",\n \"operation_ids\": [\n \"post_events\",\n \"get_events\",\n \"post_events_send\",\n \"get_events_identifier\",\n \"patch_events_identifier\",\n \"delete_events_identifier\"\n ],\n \"skill_dir\": \"events\",\n \"skill_name\": \"events-routes\",\n \"skill_path\": \"skills/events/SKILL.md\",\n \"subagent_name\": \"events-api\"\n }\n]") +ROOT_SECURITY = json.loads("[\n {\n \"bearerAuth\": []\n }\n]") +SECURITY_SCHEMES = json.loads("{\n \"bearerAuth\": {\n \"scheme\": \"bearer\",\n \"type\": \"http\"\n }\n}") +SECURITY_FIELDS = json.loads("{\n \"bearerAuth\": {\n \"field\": \"BEARERAUTH_TOKEN\",\n \"kind\": \"http\",\n \"scheme\": \"bearer\"\n }\n}") +PATH_PARAMETER_RE = re.compile(r"{([^}/]+)}") +SOURCE_ROOT = Path(globals().get("__file__", "agent.py")).resolve().parent +SOURCE_SKILLS_DIR = SOURCE_ROOT / "skills" +RUNTIME_SKILLS_DIR = ".deepagents/openapi-skills/" + + +class OperationInput(BaseModel): + parameters: dict[str, Any] = Field( + default_factory=dict, + description="Path, query, header, and cookie parameters keyed by OpenAPI parameter name.", + ) + body: Any | None = Field(default=None, description="JSON request body, when the operation accepts one.") + + +class ResendOpenapiAgent(A2AAgent): + name = "resend-openapi-agent" + description = "Transactional email API for sends, domains, audiences, contacts, receiving, and webhooks." + version = "1.5.0" + consumer_setup = ConsumerSetup.from_fields( + ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://api.resend.com).", required=False, input_type="url"), + ConsumerSetupField.secret("BEARERAUTH_TOKEN", label="bearerAuth bearer credential", description="Bearer token.", required=True), + ) + llm_provisioning = LLMProvisioning.PLATFORM + pricing = Pricing( + price_per_call_usd=0.0, + caller_pays_llm=True, + notes="Uses the caller's saved LLM credential through ctx.llm.", + ) + resources = Resources(cpu="200m", memory="512Mi") + egress = EgressPolicy( + allow_hosts=('api.resend.com',), + deny_internet_by_default=True, + ) + tools_used = ("openapi", "deepagents") + capabilities = { + "openapi_auto_agent": { + "operation_count": len(OPERATIONS), + "default_base_url": DEFAULT_BASE_URL, + "source_openapi_url": 'https://resend.com/openapi.json', + "source_openapi_urls": ['https://resend.com/openapi.json'], + "server_urls": ['https://api.resend.com'], + "regenerable": True, + "security_schemes": list(SECURITY_SCHEMES), + } + } + + @skill( + name="auto", + description="Use the OpenAPI service to complete a natural-language goal.", + tags=("openapi", "auto"), + timeout_seconds=900, + ) + async def auto(self, ctx: RunContext, goal: str) -> dict[str, Any]: + creds = ctx.llm + if not creds.api_key: + return { + "error": "llm_credentials_missing", + "final": ( + "LLM key required. Add an LLM credential in Settings > " + "LLM credentials before running this agent." + ), + "messages": [], + } + backend = ctx.workspace_backend() + skills_root = _seed_runtime_skills(backend, ctx) + graph = create_a2a_deep_agent( + ctx, + creds=creds, + backend=backend, + tools=[], + subagents=self._operation_subagents(ctx, skills_root), + 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:]], + } + + + + def _operation_subagents(self, ctx: RunContext, skills_root: str) -> list[dict[str, Any]]: + subagents: list[dict[str, Any]] = [] + for group in OPERATION_GROUPS: + skill_path = ( + f"{skills_root}{group['skill_dir']}/" + if skills_root + else "" + ) + subagent = { + "name": group["subagent_name"], + "description": group["description"], + "system_prompt": self._subagent_prompt(group), + "tools": self._operation_tools(ctx, set(group["operation_ids"])), + } + if skill_path: + subagent["skills"] = [skill_path] + subagents.append(subagent) + return subagents + + def _operation_tools( + self, + ctx: RunContext, + operation_ids: set[str] | None = None, + ) -> list[StructuredTool]: + tools: list[StructuredTool] = [] + for operation_id, operation in OPERATIONS.items(): + if operation_ids is not None and operation_id not in operation_ids: + continue + async def call( + parameters: dict[str, Any] | None = None, + body: Any | None = None, + *, + _operation_id: str = operation_id, + ) -> dict[str, Any]: + return await self._request( + ctx, + _operation_id, + parameters=parameters or {}, + body=body, + ) + + tools.append( + StructuredTool.from_function( + coroutine=call, + name=operation["skill_name"], + description=self._tool_description(operation), + args_schema=OperationInput, + ) + ) + return tools + + def _system_prompt(self) -> str: + if OPERATION_GROUPS: + lines = [ + "You coordinate route-specific OpenAPI subagents.", + "Delegate API work to the matching subagent with the task tool.", + "Do not invent API responses; ask subagents to call their tools for real results.", + "If a subagent reports missing consumer setup, tell the user which setup field is required.", + "If a subagent reports that the generated OpenAPI agent may be stale, ask whether the user wants to refresh it from the latest OpenAPI spec.", + "", + "Available route groups:", + ] + for group in OPERATION_GROUPS: + lines.append( + f"- {group['subagent_name']}: {group['description']}" + ) + return "\n".join(lines) + lines = [ + "You operate an API through generated OpenAPI tools.", + "Call tools to get real results. Do not invent API responses.", + "For write, update, or delete operations, explain the intended action before calling the tool.", + "If an operation reports missing consumer setup, tell the user which setup field is required.", + "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, tell the user this generated agent may need to be refreshed from the latest OpenAPI spec and ask whether they want to refresh it.", + "", + "Available operations:", + ] + for operation in OPERATIONS.values(): + marker = "WRITE" if operation.get("destructive") else "READ" + lines.append( + f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} — {operation['summary']}" + ) + return "\n".join(lines) + + def _subagent_prompt(self, group: dict[str, Any]) -> str: + lines = [ + "You operate one route group from a generated OpenAPI API.", + "Use the available operation tools to make real API calls. Do not invent API responses.", + "Read the route group's SKILL.md when it applies; it lists every route you cover.", + "For write, update, or delete operations, explain the intended action before calling the tool.", + "If an operation reports missing consumer setup, return the exact setup field name.", + "If an operation returns 404, 405, 410, or a schema/validation error that suggests the live API no longer matches these tools, say the generated agent may need to be refreshed from the latest OpenAPI spec.", + "", + f"Route group: {group['label']}", + f"Common prefix: {group.get('common_prefix') or '/'}", + "Available operation tools:", + ] + for operation_id in group["operation_ids"]: + operation = OPERATIONS[operation_id] + marker = "WRITE" if operation.get("destructive") else "READ" + lines.append( + f"- {operation['skill_name']}: {marker} {operation['method']} {operation['path']} - {operation['summary']}" + ) + return "\n".join(lines) + + def _tool_description(self, operation: dict[str, Any]) -> str: + parts = [ + f"{operation['method']} {operation['path']}", + str(operation.get("description") or operation.get("summary") or ""), + ] + if operation.get("parameters"): + parts.append( + "Parameters: " + + ", ".join( + f"{p['name']} in {p['in']}{' required' if p.get('required') else ''}" + for p in operation["parameters"] + ) + ) + if operation.get("request_body") is not None: + parts.append("Accepts a JSON request body.") + return "\n".join(part for part in parts if part) + + async def _request( + self, + ctx: RunContext, + operation_id: str, + *, + parameters: dict[str, Any], + body: Any | None, + ) -> dict[str, Any]: + operation = OPERATIONS[operation_id] + default_base_url = str(operation.get("base_url") or DEFAULT_BASE_URL).rstrip("/") + base_url_field = str(operation.get("base_url_field") or "OPENAPI_BASE_URL") + base_url = str(ctx.consumer_config(base_url_field, default_base_url) or default_base_url).rstrip("/") + url, query, headers = self._request_parts(ctx, operation, parameters) + request_kwargs: dict[str, Any] = { + "params": query, + "headers": headers, + } + if body is not None: + if isinstance(body, (bytes, bytearray)): + body = body.decode("utf-8", errors="replace") + if isinstance(body, str): + stripped = body.strip() + if stripped and stripped[0] in "{[": + try: + body = json.loads(stripped) + except ValueError: + pass + request_kwargs["json"] = body + async with httpx.AsyncClient(timeout=60.0, follow_redirects=True) as client: + response = await client.request( + operation["method"], + f"{base_url}{url}", + **request_kwargs, + ) + content_type = response.headers.get("content-type", "") + try: + payload: Any = response.json() if "json" in content_type else response.text + except ValueError: + payload = response.text + if response.status_code >= 400: + out = { + "ok": False, + "status_code": response.status_code, + "operation_id": operation_id, + "error": payload, + } + if response.status_code in {404, 405, 410, 422}: + out["stale_openapi_hint"] = ( + "This generated OpenAPI agent may be stale. Ask the user " + "whether they want to refresh it from the latest OpenAPI spec." + ) + return out + return { + "ok": True, + "status_code": response.status_code, + "operation_id": operation_id, + "result": payload, + } + + def _request_parts( + self, + ctx: RunContext, + operation: dict[str, Any], + parameters: dict[str, Any], + ) -> tuple[str, dict[str, Any], dict[str, str]]: + path = operation["path"] + query: dict[str, Any] = {} + headers: dict[str, str] = {} + cookies: dict[str, Any] = {} + for param in operation.get("parameters") or []: + name = param["name"] + if name not in parameters: + if param.get("required"): + raise ValueError(f"missing required parameter {name!r}") + continue + value = parameters[name] + location = param["in"] + if location == "path": + path = path.replace("{" + name + "}", str(value)) + elif location == "query": + query[name] = value + elif location == "header": + headers[name] = str(value) + elif location == "cookie": + cookies[name] = value + unresolved = PATH_PARAMETER_RE.findall(path) + if unresolved: + missing = ", ".join(sorted(set(unresolved))) + raise ValueError("missing required path parameter(s): " + missing) + if cookies: + headers["cookie"] = "; ".join(f"{key}={value}" for key, value in cookies.items()) + auth_headers, auth_query = self._auth_for_operation(ctx, operation) + headers.update(auth_headers) + query.update(auth_query) + return path, query, headers + + def _auth_for_operation(self, ctx: RunContext, operation: dict[str, Any]) -> tuple[dict[str, str], dict[str, Any]]: + requirements = operation.get("security") + if requirements is None: + requirements = ROOT_SECURITY + if requirements == []: + return {}, {} + missing: list[str] = [] + for requirement in requirements or []: + if not isinstance(requirement, dict) or not requirement: + return {}, {} + headers: dict[str, str] = {} + query: dict[str, Any] = {} + ok = True + for scheme_name in requirement: + mapping = SECURITY_FIELDS.get(scheme_name) or {} + secret_name = mapping.get("field") + value = _consumer_secret_optional(ctx, secret_name) if secret_name else "" + if not value: + ok = False + if secret_name: + missing.append(secret_name) + continue + kind = mapping.get("kind") + if kind == "apiKey": + prefix = mapping.get("prefix") or "" + sent_value = f"{prefix}{value}" + if mapping.get("location") == "query": + query[mapping.get("name") or scheme_name] = sent_value + else: + headers[mapping.get("name") or scheme_name] = sent_value + elif kind in {"http", "oauth2"}: + scheme = mapping.get("scheme") or "Bearer" + if scheme.lower() == "basic": + token = base64.b64encode(value.encode("utf-8")).decode("ascii") + headers["authorization"] = f"Basic {token}" + else: + headers["authorization"] = f"{scheme} {value}" + else: + ok = False + if ok: + return headers, query + if missing: + raise ConsumerSetupMissing( + "operation requires consumer setup secret(s): " + + ", ".join(sorted(set(missing))) + ) + return {}, {} + + +def _consumer_secret_optional(ctx: RunContext, name: str | None) -> str: + if not name: + return "" + try: + return ctx.consumer_secret(name) + except ConsumerSetupMissing: + return "" + + +def _runtime_skills_root(ctx: RunContext) -> str: + workspace = getattr(ctx, "_workspace", None) + prefixes = tuple(getattr(workspace, "write_prefixes", ()) or ()) + if not prefixes: + outputs_prefix = getattr(workspace, "outputs_prefix", None) + prefixes = (outputs_prefix or "outputs/",) + prefix = str(prefixes[0]).strip("/") + return f"/{prefix}/{RUNTIME_SKILLS_DIR}" if prefix else f"/{RUNTIME_SKILLS_DIR}" + + +def _seed_runtime_skills(backend: Any, ctx: RunContext) -> str: + if not SOURCE_SKILLS_DIR.exists(): + return "" + runtime_root = _runtime_skills_root(ctx) + uploads: list[tuple[str, bytes]] = [] + for path in SOURCE_SKILLS_DIR.rglob("*"): + if not path.is_file(): + continue + rel = path.relative_to(SOURCE_SKILLS_DIR).as_posix() + uploads.append((runtime_root + rel, path.read_bytes())) + if not uploads: + return "" + backend.upload_files(uploads) + return runtime_root + + +def _message_text(message: Any) -> Any: + content = getattr(message, "content", message) + return content + + +def _message_to_dict(message: Any) -> dict[str, Any]: + if isinstance(message, BaseMessage): + return message.model_dump(mode="json") + if hasattr(message, "model_dump"): + return message.model_dump(mode="json") + if isinstance(message, dict): + return message + return {"content": str(message)} + + +agent = ResendOpenapiAgent() diff --git a/openapi.json b/openapi.json new file mode 100644 index 0000000..c6b6349 --- /dev/null +++ b/openapi.json @@ -0,0 +1,6949 @@ +{ + "components": { + "parameters": { + "PaginationAfter": { + "description": "Return items after this cursor.", + "in": "query", + "name": "after", + "required": false, + "schema": { + "type": "string" + } + }, + "PaginationBefore": { + "description": "Return items before this cursor.", + "in": "query", + "name": "before", + "required": false, + "schema": { + "type": "string" + } + }, + "PaginationLimit": { + "description": "Number of items to return.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "maximum": 100, + "minimum": 1, + "type": "integer" + } + } + }, + "schemas": { + "AddContactToSegmentResponseSuccess": { + "properties": { + "contact_id": { + "description": "The ID of the contact.", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "contact_segment", + "type": "string" + }, + "segment_id": { + "description": "The ID of the segment.", + "type": "string" + } + }, + "type": "object" + }, + "ApiKey": { + "properties": { + "created_at": { + "description": "The date and time the API key was created.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the API key.", + "type": "string" + }, + "last_used_at": { + "description": "The date and time the API key was last used.", + "format": "date-time", + "nullable": true, + "type": "string" + }, + "name": { + "description": "The name of the API key.", + "type": "string" + } + }, + "type": "object" + }, + "Attachment": { + "properties": { + "content": { + "description": "Content of an attached file.", + "format": "binary", + "type": "string" + }, + "content_id": { + "description": "Content ID for embedding inline images using cid references (e.g., cid:image001).", + "type": "string" + }, + "content_type": { + "description": "Optional content type for the attachment, if not set it will be derived from the filename property", + "type": "string" + }, + "filename": { + "description": "Name of attached file.", + "type": "string" + }, + "path": { + "description": "Path where the attachment file is hosted", + "type": "string" + } + }, + "type": "object" + }, + "Automation": { + "properties": { + "connections": { + "description": "The connections between steps in the active version of the automation.", + "items": { + "$ref": "#/components/schemas/AutomationConnection" + }, + "type": "array" + }, + "created_at": { + "description": "The date and time the automation was created.", + "type": "string" + }, + "id": { + "description": "The ID of the automation.", + "type": "string" + }, + "name": { + "description": "The name of the automation.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation", + "type": "string" + }, + "status": { + "description": "The current status of the automation.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "steps": { + "description": "The steps in the active version of the automation.", + "items": { + "$ref": "#/components/schemas/AutomationStepResponse" + }, + "type": "array" + }, + "updated_at": { + "description": "The date and time the automation was last updated.", + "type": "string" + } + }, + "type": "object" + }, + "AutomationConnection": { + "description": "A connection between two steps in the automation graph.", + "properties": { + "from": { + "description": "The `key` of the source step.", + "type": "string" + }, + "to": { + "description": "The `key` of the target step.", + "type": "string" + }, + "type": { + "default": "default", + "description": "The type of connection. Defaults to `default`.", + "enum": [ + "default", + "condition_met", + "condition_not_met", + "timeout", + "event_received" + ], + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "AutomationListItem": { + "properties": { + "created_at": { + "description": "The date and time the automation was created.", + "type": "string" + }, + "id": { + "description": "The ID of the automation.", + "type": "string" + }, + "name": { + "description": "The name of the automation.", + "type": "string" + }, + "status": { + "description": "The current status of the automation.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "updated_at": { + "description": "The date and time the automation was last updated.", + "type": "string" + } + }, + "type": "object" + }, + "AutomationRun": { + "properties": { + "completed_at": { + "description": "The date and time the run completed.", + "nullable": true, + "type": "string" + }, + "created_at": { + "description": "The date and time the run was created.", + "type": "string" + }, + "id": { + "description": "The ID of the automation run.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation_run", + "type": "string" + }, + "started_at": { + "description": "The date and time the run started.", + "nullable": true, + "type": "string" + }, + "status": { + "description": "The current status of the automation run.", + "enum": [ + "running", + "completed", + "failed", + "cancelled" + ], + "type": "string" + }, + "steps": { + "description": "The steps executed in this run, sorted in graph order.", + "items": { + "$ref": "#/components/schemas/AutomationRunStep" + }, + "type": "array" + } + }, + "type": "object" + }, + "AutomationRunListItem": { + "properties": { + "completed_at": { + "description": "The date and time the run completed.", + "nullable": true, + "type": "string" + }, + "created_at": { + "description": "The date and time the run was created.", + "type": "string" + }, + "id": { + "description": "The ID of the automation run.", + "type": "string" + }, + "started_at": { + "description": "The date and time the run started.", + "nullable": true, + "type": "string" + }, + "status": { + "description": "The current status of the automation run.", + "enum": [ + "running", + "completed", + "failed", + "cancelled" + ], + "type": "string" + } + }, + "type": "object" + }, + "AutomationRunStep": { + "description": "A step execution within an automation run.", + "properties": { + "completed_at": { + "description": "The date and time the step completed executing.", + "nullable": true, + "type": "string" + }, + "created_at": { + "description": "The date and time the step record was created.", + "type": "string" + }, + "error": { + "description": "The error produced by the step, if any.", + "nullable": true + }, + "key": { + "description": "The key of the automation step.", + "type": "string" + }, + "output": { + "description": "The output produced by the step, if any.", + "nullable": true + }, + "started_at": { + "description": "The date and time the step started executing.", + "nullable": true, + "type": "string" + }, + "status": { + "description": "The execution status of this step.", + "type": "string" + }, + "type": { + "description": "The type of automation step.", + "enum": [ + "trigger", + "send_email", + "delay", + "wait_for_event", + "condition", + "contact_update", + "contact_delete", + "add_to_segment" + ], + "type": "string" + } + }, + "type": "object" + }, + "AutomationStep": { + "description": "A step in an automation workflow. The `config` object varies based on the step `type`.", + "properties": { + "config": { + "description": "Configuration for the step. Shape depends on `type`: - **trigger**: `{ event_name: string }` - **send_email**: `{ template: { id: string, variables?: object }, subject?: string, from?: string, reply_to?: string }` - **delay**: `{ duration: string }` \u2014 a human-readable duration (e.g. `\"30 minutes\"`) - **wait_for_event**: `{ event_name: string, timeout?: string, filter_rule?: object }` \u2014 `timeout` is a human-readable duration (e.g. `\"1 hour\"`) - **condition**: A rule tree with `type` (`rule`, `and`, `or`), `field`, `operator`, and `value` - **contact_update**: `{ first_name?: string|object, last_name?: string|object, unsubscribed?: boolean|object, properties?: object }` - **contact_delete**: `{}` - **add_to_segment**: `{ segment_id: string }`\n", + "type": "object" + }, + "key": { + "description": "A unique key for this step within the automation graph.", + "type": "string" + }, + "type": { + "description": "The type of automation step.", + "enum": [ + "trigger", + "send_email", + "delay", + "wait_for_event", + "condition", + "contact_update", + "contact_delete", + "add_to_segment" + ], + "type": "string" + } + }, + "required": [ + "key", + "type", + "config" + ], + "type": "object" + }, + "AutomationStepResponse": { + "description": "A step as returned when retrieving an automation.", + "properties": { + "config": { + "description": "Configuration for the step. Shape depends on `type`. For `delay` steps, config contains `{ duration: string }` with a human-readable duration (e.g. `\"30 minutes\"`). For `wait_for_event` steps, config contains `{ event_name: string, timeout?: string, filter_rule?: object }` where `timeout` is a human-readable duration.\n", + "type": "object" + }, + "key": { + "description": "The unique key of this step within the automation graph.", + "type": "string" + }, + "type": { + "description": "The type of automation step.", + "enum": [ + "trigger", + "send_email", + "delay", + "wait_for_event", + "condition", + "contact_update", + "contact_delete", + "add_to_segment" + ], + "type": "string" + } + }, + "type": "object" + }, + "CreateApiKeyRequest": { + "properties": { + "domain_id": { + "description": "Restrict an API key to send emails only from a specific domain. Only used when the permission is sending_access.", + "type": "string" + }, + "name": { + "description": "The API key name.", + "type": "string" + }, + "permission": { + "description": "The API key can have full access to Resend\u2019s API or be only restricted to send emails. * full_access - Can create, delete, get, and update any resource. * sending_access - Can only send emails.", + "enum": [ + "full_access", + "sending_access" + ], + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "CreateApiKeyResponse": { + "properties": { + "id": { + "description": "The ID of the API key.", + "type": "string" + }, + "token": { + "description": "The token of the API key.", + "type": "string" + } + }, + "type": "object" + }, + "CreateAudienceOptions": { + "deprecated": true, + "properties": { + "name": { + "description": "The name of the audience you want to create.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "CreateAudienceResponseSuccess": { + "deprecated": true, + "properties": { + "id": { + "description": "The ID of the audience.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "name": { + "description": "The name of the audience.", + "example": "Registered Users", + "type": "string" + }, + "object": { + "description": "The object of the audience.", + "example": "audience", + "type": "string" + } + }, + "type": "object" + }, + "CreateAutomationRequest": { + "properties": { + "connections": { + "description": "The connections between steps in the automation graph.", + "items": { + "$ref": "#/components/schemas/AutomationConnection" + }, + "type": "array" + }, + "name": { + "description": "The name of the automation.", + "minLength": 1, + "type": "string" + }, + "status": { + "default": "disabled", + "description": "The initial status of the automation. Defaults to `disabled`.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "steps": { + "description": "The steps that compose the automation workflow. Must include at least one `trigger` step.", + "items": { + "$ref": "#/components/schemas/AutomationStep" + }, + "maxItems": 150, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "name", + "steps", + "connections" + ], + "type": "object" + }, + "CreateAutomationResponse": { + "properties": { + "id": { + "description": "The ID of the created automation.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation", + "type": "string" + } + }, + "type": "object" + }, + "CreateBatchEmailsResponse": { + "properties": { + "data": { + "items": { + "properties": { + "id": { + "description": "The ID of the sent email.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "CreateBroadcastOptions": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "Use `segment_id` instead. Unique identifier of the segment this broadcast will be sent to.", + "type": "string" + }, + "from": { + "description": "The email address of the sender.", + "type": "string" + }, + "html": { + "description": "The HTML version of the message.", + "type": "string" + }, + "name": { + "description": "Name of the broadcast.", + "type": "string" + }, + "preview_text": { + "description": "The preview text of the email.", + "example": "Here are our announcements", + "type": "string" + }, + "reply_to": { + "description": "The email addresses to which replies should be sent.", + "items": { + "type": "string" + }, + "type": "array" + }, + "scheduled_at": { + "description": "Schedule time to send the broadcast. Can only be used if `send` is true.\n", + "type": "string" + }, + "segment_id": { + "description": "Unique identifier of the segment this broadcast will be sent to.", + "type": "string" + }, + "send": { + "description": "Whether to send the broadcast immediately or keep it as a draft.\n", + "type": "boolean" + }, + "subject": { + "description": "The subject line of the email.", + "type": "string" + }, + "text": { + "description": "The plain text version of the message.", + "type": "string" + }, + "topic_id": { + "description": "The topic ID that the broadcast will be scoped to.", + "type": "string" + } + }, + "required": [ + "from", + "subject", + "segment_id" + ], + "type": "object" + }, + "CreateBroadcastResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the broadcast.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "broadcast", + "type": "string" + } + }, + "type": "object" + }, + "CreateContactOptions": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "Unique identifier of the audience to which the contact belongs.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "email": { + "description": "Email address of the contact.", + "example": "steve.wozniak@gmail.com", + "type": "string" + }, + "first_name": { + "description": "First name of the contact.", + "example": "Steve", + "type": "string" + }, + "last_name": { + "description": "Last name of the contact.", + "example": "Wozniak", + "type": "string" + }, + "properties": { + "additionalProperties": true, + "description": "A map of custom property keys and values to create.", + "type": "object" + }, + "segments": { + "description": "Array of segment IDs to add the contact to.", + "items": { + "type": "string" + }, + "type": "array" + }, + "topics": { + "description": "Array of topic subscriptions for the contact.", + "items": { + "properties": { + "id": { + "description": "The topic ID.", + "type": "string" + }, + "subscription": { + "description": "The subscription status for this topic.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "unsubscribed": { + "description": "The Contact's global subscription status. If set to true, the contact will be unsubscribed from all Broadcasts.", + "example": false, + "type": "boolean" + } + }, + "required": [ + "email" + ], + "type": "object" + }, + "CreateContactPropertyOptions": { + "properties": { + "fallback_value": { + "description": "The default value to use when the property is not set for a contact. Must match the type specified in the type field.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "key": { + "description": "The property key. Max length is 50 characters. Only alphanumeric characters and underscores are allowed.", + "type": "string" + }, + "type": { + "description": "The property type.", + "enum": [ + "string", + "number" + ], + "type": "string" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "CreateContactPropertyResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the contact property.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "contact_property", + "type": "string" + } + }, + "type": "object" + }, + "CreateContactResponseSuccess": { + "properties": { + "id": { + "description": "Unique identifier for the created contact.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "contact", + "type": "string" + } + }, + "type": "object" + }, + "CreateDomainRequest": { + "properties": { + "capabilities": { + "$ref": "#/components/schemas/DomainCapabilities" + }, + "click_tracking": { + "description": "Track clicks within the body of each HTML email.", + "type": "boolean" + }, + "custom_return_path": { + "description": "For advanced use cases, choose a subdomain for the Return-Path address. Defaults to 'send' (i.e., send.yourdomain.tld).", + "type": "string" + }, + "name": { + "description": "The name of the domain you want to create.", + "type": "string" + }, + "open_tracking": { + "description": "Track the open rate of each email.", + "type": "boolean" + }, + "region": { + "default": "us-east-1", + "description": "The region where emails will be sent from. Possible values are us-east-1 | eu-west-1 | sa-east-1 | ap-northeast-1", + "enum": [ + "us-east-1", + "eu-west-1", + "sa-east-1", + "ap-northeast-1" + ], + "type": "string" + }, + "tls": { + "default": "opportunistic", + "description": "TLS mode. Opportunistic attempts secure connection but falls back to unencrypted. Enforced requires TLS or email won't be sent.", + "enum": [ + "opportunistic", + "enforced" + ], + "type": "string" + }, + "tracking_subdomain": { + "description": "The subdomain to use for click and open tracking.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "CreateDomainResponse": { + "properties": { + "capabilities": { + "$ref": "#/components/schemas/DomainCapabilities" + }, + "click_tracking": { + "description": "Whether click tracking is enabled for this domain.", + "type": "boolean" + }, + "created_at": { + "description": "The date and time the domain was created.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the domain.", + "type": "string" + }, + "name": { + "description": "The name of the domain.", + "type": "string" + }, + "open_tracking": { + "description": "Whether open tracking is enabled for this domain.", + "type": "boolean" + }, + "records": { + "items": { + "$ref": "#/components/schemas/DomainRecord" + }, + "type": "array" + }, + "region": { + "description": "The region where the domain is hosted.", + "type": "string" + }, + "status": { + "description": "The status of the domain.", + "type": "string" + }, + "tracking_subdomain": { + "description": "The subdomain used for click and open tracking.", + "type": "string" + } + }, + "type": "object" + }, + "CreateEventRequest": { + "properties": { + "name": { + "description": "The name of the event. Cannot start with the reserved `resend:` prefix.", + "type": "string" + }, + "schema": { + "description": "An optional flat key/type map defining the event payload schema. Supported types are `string`, `number`, `boolean`, and `date`.", + "nullable": true, + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "CreateEventResponse": { + "properties": { + "id": { + "description": "The ID of the created event.", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "event", + "type": "string" + } + }, + "type": "object" + }, + "CreateSegmentOptions": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "The ID of the audience this segment belongs to.", + "type": "string" + }, + "filter": { + "description": "Filter conditions for the segment.", + "type": "object" + }, + "name": { + "description": "The name of the segment.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "CreateSegmentResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the segment.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "segment", + "type": "string" + } + }, + "type": "object" + }, + "CreateTemplateRequest": { + "properties": { + "alias": { + "description": "The alias of the template.", + "type": "string" + }, + "from": { + "description": "Sender email address. To include a friendly name, use the format \"Your Name \".", + "type": "string" + }, + "html": { + "description": "The HTML version of the template.", + "type": "string" + }, + "name": { + "description": "The name of the template.", + "type": "string" + }, + "reply_to": { + "description": "Reply-to email addresses.", + "items": { + "type": "string" + }, + "type": "array" + }, + "subject": { + "description": "Email subject.", + "type": "string" + }, + "text": { + "description": "The plain text version of the template.", + "type": "string" + }, + "variables": { + "items": { + "$ref": "#/components/schemas/TemplateVariableInput" + }, + "type": "array" + } + }, + "required": [ + "name", + "html" + ], + "type": "object" + }, + "CreateTemplateResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "template", + "type": "string" + } + }, + "type": "object" + }, + "CreateTopicOptions": { + "properties": { + "default_subscription": { + "description": "The default subscription status for the topic. Cannot be changed after creation.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + }, + "description": { + "description": "A description of the topic. Max 200 characters.", + "maxLength": 200, + "type": "string" + }, + "name": { + "description": "The name of the topic. Max 50 characters.", + "maxLength": 50, + "type": "string" + }, + "visibility": { + "default": "private", + "description": "The visibility of the topic. Public topics are visible to all contacts on the unsubscribe page. Private topics are only visible to opted-in contacts.", + "enum": [ + "public", + "private" + ], + "type": "string" + } + }, + "required": [ + "name", + "default_subscription" + ], + "type": "object" + }, + "CreateTopicResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the topic.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "topic", + "type": "string" + } + }, + "type": "object" + }, + "CreateWebhookRequest": { + "properties": { + "endpoint": { + "description": "The URL where webhook events will be sent.", + "example": "https://webhook.example.com/handler", + "type": "string" + }, + "events": { + "description": "Array of event types to subscribe to.", + "example": [ + "email.sent", + "email.delivered", + "email.bounced" + ], + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "endpoint", + "events" + ], + "type": "object" + }, + "CreateWebhookResponse": { + "properties": { + "id": { + "description": "The ID of the webhook.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "webhook", + "type": "string" + }, + "signing_secret": { + "description": "The secret key used to verify webhook payloads.", + "example": "whsec_...", + "type": "string" + } + }, + "type": "object" + }, + "DeleteApiKeyResponse": { + "properties": { + "deleted": { + "description": "Indicates whether the API key was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the API key.", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "api_key", + "type": "string" + } + }, + "type": "object" + }, + "DeleteAutomationResponse": { + "properties": { + "deleted": { + "description": "Indicates whether the automation was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the deleted automation.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation", + "type": "string" + } + }, + "type": "object" + }, + "DeleteDomainResponse": { + "properties": { + "deleted": { + "description": "Indicates whether the domain was deleted successfully.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the domain.", + "example": "d91cd9bd-1176-453e-8fc1-35364d380206", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "domain", + "type": "string" + } + }, + "type": "object" + }, + "DeleteWebhookResponse": { + "properties": { + "deleted": { + "description": "Indicates whether the webhook was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the deleted webhook.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "webhook", + "type": "string" + } + }, + "type": "object" + }, + "Domain": { + "properties": { + "capabilities": { + "$ref": "#/components/schemas/DomainCapabilities" + }, + "click_tracking": { + "description": "Whether click tracking is enabled for this domain.", + "type": "boolean" + }, + "created_at": { + "description": "The date and time the domain was created.", + "example": "2023-04-26T20:21:26.347412+00:00", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the domain.", + "example": "d91cd9bd-1176-453e-8fc1-35364d380206", + "type": "string" + }, + "name": { + "description": "The name of the domain.", + "example": "example.com", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "domain", + "type": "string" + }, + "open_tracking": { + "description": "Whether open tracking is enabled for this domain.", + "type": "boolean" + }, + "records": { + "items": { + "$ref": "#/components/schemas/DomainRecord" + }, + "type": "array" + }, + "region": { + "description": "The region where the domain is hosted.", + "example": "us-east-1", + "type": "string" + }, + "status": { + "description": "The status of the domain.", + "example": "not_started", + "type": "string" + }, + "tracking_subdomain": { + "description": "The subdomain used for click and open tracking.", + "type": "string" + } + }, + "type": "object" + }, + "DomainCapabilities": { + "description": "Configure the domain capabilities for sending and receiving emails. At least one capability must be enabled.", + "properties": { + "receiving": { + "description": "Enable or disable receiving emails to this domain.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "sending": { + "description": "Enable or disable sending emails from this domain.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + } + }, + "type": "object" + }, + "DomainRecord": { + "properties": { + "name": { + "description": "The name of the DNS record.", + "type": "string" + }, + "priority": { + "description": "The priority of the record (only applicable for MX records).", + "type": "integer" + }, + "record": { + "description": "The type of record (SPF for sending, DKIM for sending, Receiving for inbound emails, Tracking for click and open tracking).", + "enum": [ + "SPF", + "DKIM", + "Receiving", + "Tracking" + ], + "type": "string" + }, + "status": { + "description": "The status of the record.", + "enum": [ + "pending", + "verified", + "failed", + "temporary_failure", + "not_started" + ], + "type": "string" + }, + "ttl": { + "description": "The time to live for the record.", + "type": "string" + }, + "type": { + "description": "The DNS record type.", + "enum": [ + "MX", + "TXT", + "CNAME" + ], + "type": "string" + }, + "value": { + "description": "The value of the record.", + "type": "string" + } + }, + "type": "object" + }, + "DuplicateTemplateResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the duplicated template.", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "template", + "type": "string" + } + }, + "type": "object" + }, + "Email": { + "properties": { + "bcc": { + "description": "The email addresses of the blind carbon copy recipients.", + "items": { + "type": "string" + }, + "type": "array" + }, + "cc": { + "description": "The email addresses of the carbon copy recipients.", + "items": { + "type": "string" + }, + "type": "array" + }, + "created_at": { + "description": "The date and time the email was created.", + "example": "2023-04-03T22:13:42.674981+00:00", + "format": "date-time", + "type": "string" + }, + "from": { + "description": "The email address of the sender.", + "example": "Acme ", + "type": "string" + }, + "html": { + "description": "The HTML body of the email.", + "example": "Congrats on sending your first email!", + "type": "string" + }, + "id": { + "description": "The ID of the email.", + "example": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c", + "type": "string" + }, + "last_event": { + "description": "The status of the email.", + "example": "delivered", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "email", + "type": "string" + }, + "reply_to": { + "description": "The email addresses to which replies should be sent.", + "items": { + "type": "string" + }, + "type": "array" + }, + "subject": { + "description": "The subject line of the email.", + "example": "Hello World", + "type": "string" + }, + "text": { + "description": "The plain text body of the email.", + "type": "string" + }, + "to": { + "example": [ + "delivered@resend.dev" + ], + "items": { + "description": "The email addresses of the recipients.", + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "EmailTemplateInput": { + "properties": { + "id": { + "description": "The id of the published email template.", + "type": "string" + }, + "variables": { + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "description": "Template variables object with key/value pairs.", + "example": { + "variableName": "Sign up now", + "variableName2": 123 + }, + "type": "object" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "Event": { + "properties": { + "created_at": { + "description": "The date and time the event was created.", + "type": "string" + }, + "id": { + "description": "The event ID.", + "format": "uuid", + "type": "string" + }, + "name": { + "description": "The event name.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "event", + "type": "string" + }, + "schema": { + "description": "A flat key/type map defining the event payload schema. Supported types are `string`, `number`, `boolean`, and `date`.", + "nullable": true, + "type": "object" + }, + "updated_at": { + "description": "The date and time the event was last updated.", + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "EventSummary": { + "properties": { + "created_at": { + "description": "The date and time the event was created.", + "type": "string" + }, + "id": { + "description": "The event ID.", + "format": "uuid", + "type": "string" + }, + "name": { + "description": "The event name.", + "type": "string" + }, + "schema": { + "description": "A flat key/type map defining the event payload schema. Supported types are `string`, `number`, `boolean`, and `date`.", + "nullable": true, + "type": "object" + }, + "updated_at": { + "description": "The date and time the event was last updated.", + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "GetAudienceResponseSuccess": { + "deprecated": true, + "properties": { + "created_at": { + "description": "The date that the object was created.", + "example": "2023-10-06T22:59:55.977Z", + "type": "string" + }, + "id": { + "description": "The ID of the audience.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "name": { + "description": "The name of the audience.", + "example": "Registered Users", + "type": "string" + }, + "object": { + "description": "The object of the audience.", + "example": "audience", + "type": "string" + } + }, + "type": "object" + }, + "GetBroadcastResponseSuccess": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "Deprecated: use `segment_id` instead. Unique identifier of the segment this broadcast will be sent to.", + "nullable": true, + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the broadcast was created.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "from": { + "description": "The email address of the sender.", + "example": "Acme ", + "type": "string" + }, + "html": { + "description": "The HTML version of the broadcast content.", + "example": "

Hello {{{FIRST_NAME|there}}}!

", + "nullable": true, + "type": "string" + }, + "id": { + "description": "Unique identifier for the broadcast.", + "example": "e169aa45-1ecf-4183-9955-b1499d5701d3", + "type": "string" + }, + "name": { + "description": "Name of the broadcast.", + "example": "November announcements", + "type": "string" + }, + "preview_text": { + "description": "The preview text of the email.", + "example": "Here are our announcements", + "type": "string" + }, + "reply_to": { + "description": "The email addresses to which replies should be sent.", + "items": { + "type": "string" + }, + "type": "array" + }, + "scheduled_at": { + "description": "Timestamp indicating when the broadcast is scheduled to be sent.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "segment_id": { + "description": "Unique identifier of the segment this broadcast will be sent to.", + "nullable": true, + "type": "string" + }, + "sent_at": { + "description": "Timestamp indicating when the broadcast was sent.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "status": { + "description": "The status of the broadcast.", + "example": "draft", + "type": "string" + }, + "subject": { + "description": "The subject line of the email.", + "example": "Hello World", + "type": "string" + }, + "text": { + "description": "The plain text version of the broadcast content.", + "example": "Hello {{{FIRST_NAME|there}}}!", + "nullable": true, + "type": "string" + }, + "topic_id": { + "description": "The topic ID that the broadcast is scoped to.", + "example": "b6d24b8e-af0b-4c3c-be0c-359bbd97381e", + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "GetContactPropertyResponseSuccess": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the contact property was created.", + "format": "date-time", + "type": "string" + }, + "fallback_value": { + "description": "The default value when the property is not set for a contact.", + "example": "Acme Corp", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "id": { + "description": "The ID of the contact property.", + "example": "b6d24b8e-af0b-4c3c-be0c-359bbd97381e", + "type": "string" + }, + "key": { + "description": "The property key.", + "example": "company_name", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "contact_property", + "type": "string" + }, + "type": { + "description": "The property type.", + "example": "string", + "type": "string" + } + }, + "type": "object" + }, + "GetContactResponseSuccess": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the contact was created.", + "example": "2023-10-06T23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "email": { + "description": "Email address of the contact.", + "example": "steve.wozniak@gmail.com", + "type": "string" + }, + "first_name": { + "description": "First name of the contact.", + "example": "Steve", + "type": "string" + }, + "id": { + "description": "Unique identifier for the contact.", + "example": "e169aa45-1ecf-4183-9955-b1499d5701d3", + "type": "string" + }, + "last_name": { + "description": "Last name of the contact.", + "example": "Wozniak", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "contact", + "type": "string" + }, + "properties": { + "additionalProperties": true, + "description": "A map of custom property keys and values.", + "type": "object" + }, + "unsubscribed": { + "description": "Indicates if the contact is unsubscribed.", + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "GetContactTopicsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing topic subscriptions for this contact.", + "items": { + "properties": { + "description": { + "description": "Description of the topic.", + "type": "string" + }, + "id": { + "description": "Unique identifier for the topic.", + "type": "string" + }, + "name": { + "description": "Name of the topic.", + "type": "string" + }, + "subscription": { + "description": "The subscription status for this topic.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "GetReceivedEmailResponse": { + "properties": { + "attachments": { + "description": "Array of attachments.", + "items": { + "properties": { + "content_disposition": { + "description": "How the attachment should be displayed.", + "enum": [ + "inline", + "attachment" + ], + "type": "string" + }, + "content_id": { + "description": "The content ID for inline attachments.", + "type": "string" + }, + "content_type": { + "description": "The MIME type of the attachment.", + "type": "string" + }, + "filename": { + "description": "The filename of the attachment.", + "type": "string" + }, + "id": { + "description": "The ID of the attachment.", + "format": "uuid", + "type": "string" + }, + "size": { + "description": "Size of the attachment in bytes.", + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "bcc": { + "description": "The BCC recipients.", + "example": [], + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "cc": { + "description": "The CC recipients.", + "example": [], + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "created_at": { + "description": "Timestamp when the email was received.", + "example": "2023-10-06:23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "from": { + "description": "The sender email address.", + "example": "sender@example.com", + "type": "string" + }, + "headers": { + "description": "The email headers.", + "example": { + "X-Custom-Header": "value" + }, + "nullable": true, + "type": "object" + }, + "html": { + "description": "The HTML content of the email.", + "example": "

Email content

", + "nullable": true, + "type": "string" + }, + "id": { + "description": "The ID of the received email.", + "example": "550e8400-e29b-41d4-a716-446655440000", + "format": "uuid", + "type": "string" + }, + "message_id": { + "description": "The unique message ID from the email headers.", + "example": "", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "email", + "type": "string" + }, + "reply_to": { + "description": "The reply-to addresses.", + "example": [], + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "subject": { + "description": "The email subject.", + "example": "Hello World", + "type": "string" + }, + "text": { + "description": "The plain text content of the email.", + "example": "Email content", + "nullable": true, + "type": "string" + }, + "to": { + "description": "The recipient email addresses.", + "example": [ + "delivered@resend.dev" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "GetSegmentResponseSuccess": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "The ID of the audience this segment belongs to.", + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the segment was created.", + "format": "date-time", + "type": "string" + }, + "filter": { + "description": "Filter conditions for the segment.", + "type": "object" + }, + "id": { + "description": "The ID of the segment.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "name": { + "description": "The name of the segment.", + "example": "Active Users", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "segment", + "type": "string" + } + }, + "type": "object" + }, + "GetTopicResponseSuccess": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the topic was created.", + "format": "date-time", + "type": "string" + }, + "default_subscription": { + "description": "The default subscription status for the topic.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + }, + "description": { + "description": "A description of the topic.", + "type": "string" + }, + "id": { + "description": "The ID of the topic.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "name": { + "description": "The name of the topic.", + "example": "Newsletter", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "topic", + "type": "string" + }, + "visibility": { + "description": "The visibility of the topic.", + "enum": [ + "public", + "private" + ], + "type": "string" + } + }, + "type": "object" + }, + "GetWebhookResponse": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the webhook was created.", + "example": "2023-10-06T23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "endpoint": { + "description": "The URL where webhook events are sent.", + "example": "https://webhook.example.com/handler", + "type": "string" + }, + "events": { + "description": "Array of event types subscribed to.", + "example": [ + "email.sent", + "email.delivered" + ], + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "id": { + "description": "The ID of the webhook.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "webhook", + "type": "string" + }, + "signing_secret": { + "description": "The secret key used to verify webhook payloads.", + "example": "whsec_...", + "type": "string" + }, + "status": { + "description": "The status of the webhook.", + "example": "enabled", + "type": "string" + } + }, + "type": "object" + }, + "ListApiKeysResponse": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/ApiKey" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListAttachmentsResponse": { + "properties": { + "data": { + "description": "Array containing attachment information.", + "items": { + "properties": { + "content_disposition": { + "description": "How the attachment should be displayed.", + "enum": [ + "inline", + "attachment" + ], + "example": "attachment", + "type": "string" + }, + "content_id": { + "description": "The content ID for inline attachments.", + "example": "img001", + "type": "string" + }, + "content_type": { + "description": "The MIME type of the attachment.", + "example": "application/pdf", + "type": "string" + }, + "download_url": { + "description": "Signed URL to download the attachment content.", + "example": "https://cloudfront.example.com/path?Signature=...", + "type": "string" + }, + "expires_at": { + "description": "Timestamp when the download URL expires.", + "example": "2024-10-27T18:30:00.000Z", + "format": "date-time", + "type": "string" + }, + "filename": { + "description": "The filename of the attachment.", + "example": "document.pdf", + "type": "string" + }, + "id": { + "description": "The ID of the attachment.", + "example": "660e8400-e29b-41d4-a716-446655440000", + "format": "uuid", + "type": "string" + }, + "size": { + "description": "Size of the attachment in bytes.", + "example": 2048, + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListAudiencesResponseSuccess": { + "deprecated": true, + "properties": { + "data": { + "description": "Array containing audience information.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the audience was created.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "Unique identifier for the audience.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "name": { + "description": "Name of the audience.", + "example": "Registered Users", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListAutomationRunsResponse": { + "properties": { + "data": { + "description": "Array of automation runs.", + "items": { + "$ref": "#/components/schemas/AutomationRunListItem" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListAutomationsResponse": { + "properties": { + "data": { + "description": "Array of automations.", + "items": { + "$ref": "#/components/schemas/AutomationListItem" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListBroadcastsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing broadcast information.", + "items": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "Deprecated. Use segment_id instead.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the broadcast was created.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "Unique identifier for the broadcast.", + "example": "e169aa45-1ecf-4183-9955-b1499d5701d3", + "type": "string" + }, + "name": { + "description": "Name of the broadcast.", + "example": "November announcements", + "type": "string" + }, + "scheduled_at": { + "description": "Timestamp indicating when the broadcast is scheduled to be sent.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "segment_id": { + "description": "Unique identifier of the segment this broadcast will be sent to.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "sent_at": { + "description": "Timestamp indicating when the broadcast was sent.", + "example": "2023-10-06T22:59:55.977Z", + "format": "date-time", + "type": "string" + }, + "status": { + "description": "The status of the broadcast.", + "example": "draft", + "type": "string" + }, + "topic_id": { + "description": "The topic ID that the broadcast is scoped to.", + "example": "b6d24b8e-af0b-4c3c-be0c-359bbd97381e", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListContactPropertiesResponseSuccess": { + "properties": { + "data": { + "description": "Array containing contact property information.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the contact property was created.", + "format": "date-time", + "type": "string" + }, + "fallback_value": { + "description": "The default value when the property is not set for a contact.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "id": { + "description": "Unique identifier for the contact property.", + "type": "string" + }, + "key": { + "description": "The property key.", + "type": "string" + }, + "type": { + "description": "The property type.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListContactSegmentsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing segment information for this contact.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the contact was added to the segment.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "Unique identifier for the segment.", + "type": "string" + }, + "name": { + "description": "Name of the segment.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListContactsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing contact information.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the contact was created.", + "example": "2023-10-06T23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "email": { + "description": "Email address of the contact.", + "example": "steve.wozniak@gmail.com", + "type": "string" + }, + "first_name": { + "description": "First name of the contact.", + "example": "Steve", + "type": "string" + }, + "id": { + "description": "Unique identifier for the contact.", + "example": "e169aa45-1ecf-4183-9955-b1499d5701d3", + "type": "string" + }, + "last_name": { + "description": "Last name of the contact.", + "example": "Wozniak", + "type": "string" + }, + "unsubscribed": { + "description": "Indicates if the contact is unsubscribed.", + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListDomainsItem": { + "properties": { + "capabilities": { + "$ref": "#/components/schemas/DomainCapabilities" + }, + "created_at": { + "description": "The date and time the domain was created.", + "example": "2023-04-26T20:21:26.347412+00:00", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the domain.", + "example": "d91cd9bd-1176-453e-8fc1-35364d380206", + "type": "string" + }, + "name": { + "description": "The name of the domain.", + "example": "example.com", + "type": "string" + }, + "region": { + "description": "The region where the domain is hosted.", + "example": "us-east-1", + "type": "string" + }, + "status": { + "description": "The status of the domain.", + "example": "not_started", + "type": "string" + } + }, + "type": "object" + }, + "ListDomainsResponse": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/ListDomainsItem" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListEmailsResponse": { + "properties": { + "data": { + "description": "Array containing email information.", + "items": { + "$ref": "#/components/schemas/Email" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListEventsResponse": { + "properties": { + "data": { + "description": "Array containing event information.", + "items": { + "$ref": "#/components/schemas/EventSummary" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListLogsResponse": { + "properties": { + "data": { + "description": "Array containing log information.", + "items": { + "$ref": "#/components/schemas/LogSummary" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListReceivedEmailsResponse": { + "properties": { + "data": { + "description": "Array containing received email information.", + "items": { + "properties": { + "attachments": { + "description": "Array of attachments for this email.", + "items": { + "properties": { + "content_disposition": { + "description": "How the attachment should be displayed.", + "enum": [ + "inline", + "attachment" + ], + "type": "string" + }, + "content_id": { + "description": "The content ID for inline attachments.", + "type": "string" + }, + "content_type": { + "description": "The MIME type of the attachment.", + "type": "string" + }, + "filename": { + "description": "The filename of the attachment.", + "type": "string" + }, + "id": { + "description": "The ID of the attachment.", + "format": "uuid", + "type": "string" + }, + "size": { + "description": "Size of the attachment in bytes.", + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + "bcc": { + "description": "The BCC recipients.", + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "cc": { + "description": "The CC recipients.", + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "created_at": { + "description": "Timestamp when the email was received.", + "example": "2023-10-06T23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "from": { + "description": "The sender email address.", + "example": "sender@example.com", + "type": "string" + }, + "id": { + "description": "The ID of the received email.", + "example": "550e8400-e29b-41d4-a716-446655440000", + "format": "uuid", + "type": "string" + }, + "message_id": { + "description": "The unique message ID from the email headers.", + "example": "", + "type": "string" + }, + "reply_to": { + "description": "The reply-to addresses.", + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "subject": { + "description": "The email subject.", + "example": "Hello World", + "nullable": true, + "type": "string" + }, + "to": { + "description": "The recipient email addresses.", + "example": [ + "delivered@resend.dev" + ], + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListSegmentsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing segment information.", + "items": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "The ID of the audience this segment belongs to.", + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the segment was created.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "Unique identifier for the segment.", + "type": "string" + }, + "name": { + "description": "Name of the segment.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListTemplatesResponseSuccess": { + "properties": { + "data": { + "description": "Array containing templates information.", + "items": { + "$ref": "#/components/schemas/TemplateListItem" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more templates to retrieve.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListTopicsResponseSuccess": { + "properties": { + "data": { + "description": "Array containing topic information.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the topic was created.", + "format": "date-time", + "type": "string" + }, + "default_subscription": { + "description": "The default subscription status for the topic.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + }, + "description": { + "description": "A description of the topic.", + "type": "string" + }, + "id": { + "description": "Unique identifier for the topic.", + "type": "string" + }, + "name": { + "description": "Name of the topic.", + "type": "string" + }, + "visibility": { + "description": "The visibility of the topic.", + "enum": [ + "public", + "private" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "ListWebhooksResponse": { + "properties": { + "data": { + "description": "Array containing webhook information.", + "items": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the webhook was created.", + "example": "2023-10-06T23:47:56.678Z", + "format": "date-time", + "type": "string" + }, + "endpoint": { + "description": "The URL where webhook events are sent.", + "example": "https://webhook.example.com/handler", + "type": "string" + }, + "events": { + "description": "Array of event types subscribed to.", + "example": [ + "email.sent" + ], + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "id": { + "description": "The ID of the webhook.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "format": "uuid", + "type": "string" + }, + "status": { + "description": "The status of the webhook.", + "example": "enabled", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "has_more": { + "description": "Indicates if there are more results available.", + "example": false, + "type": "boolean" + }, + "object": { + "description": "Type of the response object.", + "example": "list", + "type": "string" + } + }, + "type": "object" + }, + "Log": { + "properties": { + "created_at": { + "description": "The date the log was created.", + "format": "date-time", + "type": "string" + }, + "endpoint": { + "description": "The API endpoint that was called.", + "type": "string" + }, + "id": { + "description": "The log ID.", + "format": "uuid", + "type": "string" + }, + "method": { + "description": "The HTTP method used.", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "OPTIONS" + ], + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "log", + "type": "string" + }, + "request_body": { + "description": "The request body sent to the API.", + "nullable": true + }, + "response_body": { + "description": "The response body returned by the API.", + "nullable": true + }, + "response_status": { + "description": "The HTTP status code of the response.", + "type": "integer" + }, + "user_agent": { + "description": "The user agent of the request.", + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "LogSummary": { + "properties": { + "created_at": { + "description": "The date the log was created.", + "format": "date-time", + "type": "string" + }, + "endpoint": { + "description": "The API endpoint that was called.", + "type": "string" + }, + "id": { + "description": "The log ID.", + "format": "uuid", + "type": "string" + }, + "method": { + "description": "The HTTP method used.", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH", + "OPTIONS" + ], + "type": "string" + }, + "response_status": { + "description": "The HTTP status code of the response.", + "type": "integer" + }, + "user_agent": { + "description": "The user agent of the request.", + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "PatchAutomationRequest": { + "description": "At least one of `name`, `status`, or `steps` and `connections` must be provided. When updating the workflow graph, both `steps` and `connections` must be provided together.\n", + "properties": { + "connections": { + "description": "The connections between steps in the automation graph. Must be provided together with `steps`.", + "items": { + "$ref": "#/components/schemas/AutomationConnection" + }, + "type": "array" + }, + "name": { + "description": "The name of the automation.", + "minLength": 1, + "type": "string" + }, + "status": { + "description": "The status of the automation.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "steps": { + "description": "The steps that compose the automation workflow. Must be provided together with `connections`.", + "items": { + "$ref": "#/components/schemas/AutomationStep" + }, + "maxItems": 150, + "minItems": 1, + "type": "array" + } + }, + "type": "object" + }, + "PatchAutomationResponse": { + "properties": { + "id": { + "description": "The ID of the updated automation.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation", + "type": "string" + } + }, + "type": "object" + }, + "PublishTemplateResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "template", + "type": "string" + } + }, + "type": "object" + }, + "RemoveAudienceResponseSuccess": { + "deprecated": true, + "properties": { + "deleted": { + "description": "The deleted attribute indicates that the corresponding audience has been deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the audience.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object of the audience.", + "example": "audience", + "type": "string" + } + }, + "type": "object" + }, + "RemoveBroadcastResponseSuccess": { + "properties": { + "deleted": { + "description": "The deleted attribute indicates that the corresponding broadcast has been deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the broadcast.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "broadcast", + "type": "string" + } + }, + "type": "object" + }, + "RemoveContactFromSegmentResponseSuccess": { + "properties": { + "contact_id": { + "description": "The ID of the contact.", + "type": "string" + }, + "deleted": { + "description": "Indicates whether the contact was successfully removed from the segment.", + "example": true, + "type": "boolean" + }, + "object": { + "description": "The object type.", + "example": "contact_segment", + "type": "string" + }, + "segment_id": { + "description": "The ID of the segment.", + "type": "string" + } + }, + "type": "object" + }, + "RemoveContactPropertyResponseSuccess": { + "properties": { + "deleted": { + "description": "Indicates whether the contact property was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the contact property.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "contact_property", + "type": "string" + } + }, + "type": "object" + }, + "RemoveContactResponseSuccess": { + "properties": { + "deleted": { + "description": "Indicates whether the contact was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "Unique identifier for the removed contact.", + "example": "520784e2-887d-4c25-b53c-4ad46ad38100", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "contact", + "type": "string" + } + }, + "type": "object" + }, + "RemoveEventResponse": { + "properties": { + "deleted": { + "description": "Indicates whether the event was deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the deleted event.", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "event", + "type": "string" + } + }, + "type": "object" + }, + "RemoveSegmentResponseSuccess": { + "properties": { + "deleted": { + "description": "Indicates whether the segment was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the segment.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "segment", + "type": "string" + } + }, + "type": "object" + }, + "RemoveTemplateResponseSuccess": { + "properties": { + "deleted": { + "description": "Indicates whether the template was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "template", + "type": "string" + } + }, + "type": "object" + }, + "RemoveTopicResponseSuccess": { + "properties": { + "deleted": { + "description": "Indicates whether the topic was successfully deleted.", + "example": true, + "type": "boolean" + }, + "id": { + "description": "The ID of the topic.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "topic", + "type": "string" + } + }, + "type": "object" + }, + "RetrievedAttachment": { + "properties": { + "content_disposition": { + "description": "How the attachment should be displayed.", + "enum": [ + "inline", + "attachment" + ], + "example": "attachment", + "type": "string" + }, + "content_id": { + "description": "The content ID for inline attachments.", + "example": "img001", + "type": "string" + }, + "content_type": { + "description": "The MIME type of the attachment.", + "example": "application/pdf", + "type": "string" + }, + "download_url": { + "description": "Signed URL to download the attachment content.", + "example": "https://cloudfront.example.com/path?Signature=...", + "type": "string" + }, + "expires_at": { + "description": "Timestamp when the download URL expires.", + "example": "2024-10-27T18:30:00.000Z", + "format": "date-time", + "type": "string" + }, + "filename": { + "description": "The filename of the attachment.", + "example": "document.pdf", + "type": "string" + }, + "id": { + "description": "The ID of the attachment.", + "example": "660e8400-e29b-41d4-a716-446655440000", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "attachment", + "type": "string" + }, + "size": { + "description": "Size of the attachment in bytes.", + "example": 2048, + "type": "integer" + } + }, + "type": "object" + }, + "SendBroadcastOptions": { + "properties": { + "scheduled_at": { + "description": "Schedule email to be sent later. The date should be in ISO 8601 format.", + "type": "string" + } + }, + "type": "object" + }, + "SendBroadcastResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the broadcast.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + } + }, + "type": "object" + }, + "SendEmailRequest": { + "properties": { + "attachments": { + "items": { + "$ref": "#/components/schemas/Attachment" + }, + "type": "array" + }, + "bcc": { + "description": "Bcc recipient email address. For multiple addresses, send as an array of strings.", + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "cc": { + "description": "Cc recipient email address. For multiple addresses, send as an array of strings.", + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "from": { + "description": "Sender email address. To include a friendly name, use the format \"Your Name \".", + "type": "string" + }, + "headers": { + "description": "Custom headers to add to the email.", + "type": "object" + }, + "html": { + "description": "The HTML version of the message.", + "type": "string" + }, + "reply_to": { + "description": "Reply-to email address. For multiple addresses, send as an array of strings.", + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "scheduled_at": { + "description": "Schedule email to be sent later. The date should be in ISO 8601 format.", + "type": "string" + }, + "subject": { + "description": "Email subject.", + "type": "string" + }, + "tags": { + "items": { + "$ref": "#/components/schemas/Tag" + }, + "type": "array" + }, + "template": { + "allOf": [ + { + "$ref": "#/components/schemas/EmailTemplateInput" + }, + { + "description": "Use a published template to send the email. If provided, do not include html or text." + } + ] + }, + "text": { + "description": "The plain text version of the message.", + "type": "string" + }, + "to": { + "description": "Recipient email address. For multiple addresses, send as an array of strings. Max 50.", + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + } + ] + }, + "topic_id": { + "description": "The topic ID to scope the email to. If the recipient is a contact and opted-in to the topic, the email is sent. If opted-out, the email is not sent. If the recipient is not a contact, the email is sent if the topic's default subscription is opt_in.", + "type": "string" + } + }, + "required": [ + "from", + "to", + "subject" + ], + "type": "object" + }, + "SendEmailResponse": { + "properties": { + "id": { + "description": "The ID of the sent email.", + "type": "string" + } + }, + "type": "object" + }, + "SendEventRequest": { + "properties": { + "contact_id": { + "description": "The ID of the contact to associate with this event. Exactly one of `contact_id` or `email` must be provided.", + "format": "uuid", + "type": "string" + }, + "email": { + "description": "The email address to associate with this event. Exactly one of `contact_id` or `email` must be provided.", + "format": "email", + "type": "string" + }, + "event": { + "description": "The name of the event to send.", + "type": "string" + }, + "payload": { + "additionalProperties": true, + "description": "An optional payload of key/value pairs to include with the event.", + "type": "object" + } + }, + "required": [ + "event" + ], + "type": "object" + }, + "SendEventResponse": { + "properties": { + "event": { + "description": "The name of the event that was sent.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "event", + "type": "string" + } + }, + "type": "object" + }, + "StopAutomationResponse": { + "properties": { + "id": { + "description": "The ID of the stopped automation.", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "automation", + "type": "string" + }, + "status": { + "description": "The status of the automation after stopping.", + "example": "disabled", + "type": "string" + } + }, + "type": "object" + }, + "Tag": { + "properties": { + "name": { + "description": "The name of the email tag. It can only contain ASCII letters (a\u2013z, A\u2013Z), numbers (0\u20139), underscores (_), or dashes (-). It can contain no more than 256 characters.", + "type": "string" + }, + "value": { + "description": "The value of the email tag.It can only contain ASCII letters (a\u2013z, A\u2013Z), numbers (0\u20139), underscores (_), or dashes (-). It can contain no more than 256 characters.", + "type": "string" + } + }, + "type": "object" + }, + "Template": { + "properties": { + "alias": { + "description": "The alias of the template.", + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the template was created.", + "format": "date-time", + "type": "string" + }, + "current_version_id": { + "description": "The ID of the current version of the template.", + "type": "string" + }, + "from": { + "description": "Sender email address. To include a friendly name, use the format \"Your Name \".", + "type": "string" + }, + "has_unpublished_versions": { + "description": "Indicates whether the template has unpublished versions.", + "type": "boolean" + }, + "html": { + "description": "The HTML version of the template.", + "type": "string" + }, + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "name": { + "description": "The name of the template.", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "template", + "type": "string" + }, + "published_at": { + "description": "Timestamp indicating when the template was published.", + "format": "date-time", + "nullable": true, + "type": "string" + }, + "reply_to": { + "description": "Reply-to email addresses.", + "items": { + "type": "string" + }, + "nullable": true, + "type": "array" + }, + "status": { + "description": "The publication status of the template.", + "enum": [ + "draft", + "published" + ], + "type": "string" + }, + "subject": { + "description": "Email subject.", + "type": "string" + }, + "text": { + "description": "The plain text version of the template.", + "type": "string" + }, + "updated_at": { + "description": "Timestamp indicating when the template was last updated.", + "format": "date-time", + "type": "string" + }, + "variables": { + "items": { + "$ref": "#/components/schemas/TemplateVariable" + }, + "type": "array" + } + }, + "type": "object" + }, + "TemplateListItem": { + "properties": { + "alias": { + "description": "The alias of the template.", + "type": "string" + }, + "created_at": { + "description": "Timestamp indicating when the template was created.", + "format": "date-time", + "type": "string" + }, + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "name": { + "description": "The name of the template.", + "type": "string" + }, + "published_at": { + "description": "Timestamp indicating when the template was published.", + "format": "date-time", + "nullable": true, + "type": "string" + }, + "status": { + "description": "The publication status of the template.", + "enum": [ + "draft", + "published" + ], + "type": "string" + }, + "updated_at": { + "description": "Timestamp indicating when the template was last updated.", + "format": "date-time", + "type": "string" + } + }, + "type": "object" + }, + "TemplateVariable": { + "properties": { + "created_at": { + "description": "Timestamp indicating when the variable was created.", + "format": "date-time", + "type": "string" + }, + "fallback_value": { + "description": "The fallback value of the variable.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "items": {}, + "type": "array" + } + ] + }, + "id": { + "description": "The ID of the template variable.", + "type": "string" + }, + "key": { + "description": "The key of the variable.", + "type": "string" + }, + "type": { + "description": "The type of the variable.", + "enum": [ + "string", + "number", + "boolean", + "object", + "list" + ], + "type": "string" + }, + "updated_at": { + "description": "Timestamp indicating when the variable was last updated.", + "format": "date-time", + "type": "string" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "TemplateVariableInput": { + "properties": { + "fallback_value": { + "description": "The fallback value of the variable.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "items": {}, + "type": "array" + } + ] + }, + "key": { + "description": "The key of the variable.", + "type": "string" + }, + "type": { + "description": "The type of the variable.", + "enum": [ + "string", + "number", + "boolean", + "object", + "list" + ], + "type": "string" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "UpdateBroadcastOptions": { + "properties": { + "audience_id": { + "deprecated": true, + "description": "Use `segment_id` instead. Unique identifier of the audience this broadcast will be sent to.", + "type": "string" + }, + "from": { + "description": "The email address of the sender.", + "type": "string" + }, + "html": { + "description": "The HTML version of the message.", + "type": "string" + }, + "name": { + "description": "Name of the broadcast.", + "type": "string" + }, + "preview_text": { + "description": "The preview text of the email.", + "type": "string" + }, + "reply_to": { + "description": "The email addresses to which replies should be sent.", + "items": { + "type": "string" + }, + "type": "array" + }, + "segment_id": { + "description": "Unique identifier of the segment this broadcast will be sent to.", + "type": "string" + }, + "subject": { + "description": "The subject line of the email.", + "type": "string" + }, + "text": { + "description": "The plain text version of the message.", + "type": "string" + }, + "topic_id": { + "description": "The topic ID that the broadcast will be scoped to.", + "type": "string" + } + }, + "type": "object" + }, + "UpdateBroadcastResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the broadcast.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "broadcast", + "type": "string" + } + }, + "type": "object" + }, + "UpdateContactOptions": { + "properties": { + "email": { + "description": "Email address of the contact.", + "example": "steve.wozniak@gmail.com", + "type": "string" + }, + "first_name": { + "description": "First name of the contact.", + "example": "Steve", + "type": "string" + }, + "last_name": { + "description": "Last name of the contact.", + "example": "Wozniak", + "type": "string" + }, + "properties": { + "additionalProperties": true, + "description": "A map of custom property keys and values to update.", + "type": "object" + }, + "unsubscribed": { + "description": "The Contact's global subscription status. If set to true, the contact will be unsubscribed from all Broadcasts.", + "example": false, + "type": "boolean" + } + }, + "type": "object" + }, + "UpdateContactPropertyOptions": { + "properties": { + "fallback_value": { + "description": "The default value to use when the property is not set for a contact. Must match the type of the property.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "type": "object" + }, + "UpdateContactPropertyResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the contact property.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "contact_property", + "type": "string" + } + }, + "type": "object" + }, + "UpdateContactResponseSuccess": { + "properties": { + "id": { + "description": "Unique identifier for the updated contact.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "contact", + "type": "string" + } + }, + "type": "object" + }, + "UpdateContactTopicsOptions": { + "properties": { + "topics": { + "items": { + "properties": { + "id": { + "description": "The ID of the topic.", + "type": "string" + }, + "subscription": { + "description": "The subscription status (opt_in or opt_out).", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "topics" + ], + "type": "object" + }, + "UpdateContactTopicsResponseSuccess": { + "properties": { + "contact_id": { + "description": "The ID of the contact.", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "contact_topics", + "type": "string" + }, + "topics": { + "description": "Array of updated topic subscriptions.", + "items": { + "properties": { + "id": { + "description": "The ID of the topic.", + "type": "string" + }, + "subscription": { + "description": "The subscription status.", + "enum": [ + "opt_in", + "opt_out" + ], + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "UpdateDomainOptions": { + "properties": { + "capabilities": { + "$ref": "#/components/schemas/DomainCapabilities" + }, + "click_tracking": { + "description": "Track clicks within the body of each HTML email.", + "type": "boolean" + }, + "open_tracking": { + "description": "Track the open rate of each email.", + "type": "boolean" + }, + "tls": { + "default": "opportunistic", + "description": "enforced | opportunistic.", + "type": "string" + }, + "tracking_subdomain": { + "description": "The subdomain to use for click and open tracking.", + "type": "string" + } + }, + "type": "object" + }, + "UpdateDomainResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the updated domain.", + "example": "d91cd9bd-1176-453e-8fc1-35364d380206", + "type": "string" + }, + "object": { + "description": "The object type representing the updated domain.", + "example": "domain", + "type": "string" + } + }, + "type": "object" + }, + "UpdateEmailOptions": { + "properties": { + "scheduled_at": { + "description": "Schedule email to be sent later. The date should be in ISO 8601 format.", + "type": "string" + } + }, + "type": "object" + }, + "UpdateEventRequest": { + "properties": { + "schema": { + "description": "A flat key/type map defining the event payload schema. Set to `null` to clear the schema. Supported types are `string`, `number`, `boolean`, and `date`.", + "nullable": true, + "type": "object" + } + }, + "required": [ + "schema" + ], + "type": "object" + }, + "UpdateEventResponse": { + "properties": { + "id": { + "description": "The ID of the updated event.", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "Type of the response object.", + "example": "event", + "type": "string" + } + }, + "type": "object" + }, + "UpdateTemplateOptions": { + "properties": { + "alias": { + "description": "The alias of the template.", + "type": "string" + }, + "from": { + "description": "Sender email address. To include a friendly name, use the format \"Your Name \".", + "type": "string" + }, + "html": { + "description": "The HTML version of the template.", + "type": "string" + }, + "name": { + "description": "The name of the template.", + "type": "string" + }, + "reply_to": { + "description": "Reply-to email addresses.", + "items": { + "type": "string" + }, + "type": "array" + }, + "subject": { + "description": "Email subject.", + "type": "string" + }, + "text": { + "description": "The plain text version of the template.", + "type": "string" + }, + "variables": { + "items": { + "$ref": "#/components/schemas/TemplateVariableInput" + }, + "type": "array" + } + }, + "type": "object" + }, + "UpdateTemplateResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the template.", + "type": "string" + }, + "object": { + "description": "The object type of the response.", + "example": "template", + "type": "string" + } + }, + "type": "object" + }, + "UpdateTopicOptions": { + "properties": { + "description": { + "description": "A description of the topic. Max 200 characters.", + "maxLength": 200, + "type": "string" + }, + "name": { + "description": "The name of the topic. Max 50 characters.", + "maxLength": 50, + "type": "string" + }, + "visibility": { + "description": "The visibility of the topic.", + "enum": [ + "public", + "private" + ], + "type": "string" + } + }, + "type": "object" + }, + "UpdateTopicResponseSuccess": { + "properties": { + "id": { + "description": "The ID of the topic.", + "example": "78261eea-8f8b-4381-83c6-79fa7120f1cf", + "type": "string" + }, + "object": { + "description": "The object type.", + "example": "topic", + "type": "string" + } + }, + "type": "object" + }, + "UpdateWebhookRequest": { + "properties": { + "endpoint": { + "description": "The URL where webhook events will be sent.", + "example": "https://webhook.example.com/new-handler", + "type": "string" + }, + "events": { + "description": "Array of event types to subscribe to.", + "example": [ + "email.sent", + "email.delivered" + ], + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "status": { + "description": "The status of the webhook.", + "enum": [ + "enabled", + "disabled" + ], + "example": "enabled", + "type": "string" + } + }, + "type": "object" + }, + "UpdateWebhookResponse": { + "properties": { + "id": { + "description": "The ID of the updated webhook.", + "example": "479e3145-dd38-476b-932c-529ceb705947", + "format": "uuid", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "webhook", + "type": "string" + } + }, + "type": "object" + }, + "VerifyDomainResponse": { + "properties": { + "id": { + "description": "The ID of the domain.", + "example": "d91cd9bd-1176-453e-8fc1-35364d380206", + "type": "string" + }, + "object": { + "description": "The type of object.", + "example": "domain", + "type": "string" + } + }, + "type": "object" + } + }, + "securitySchemes": { + "bearerAuth": { + "scheme": "bearer", + "type": "http" + } + } + }, + "info": { + "description": "Resend is the email platform for developers.", + "title": "Resend", + "version": "1.5.0" + }, + "openapi": "3.0.3", + "paths": { + "/api-keys": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListApiKeysResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of API keys", + "tags": [ + "API keys" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateApiKeyRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateApiKeyResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new API key", + "tags": [ + "API keys" + ] + } + }, + "/api-keys/{api_key_id}": { + "delete": { + "parameters": [ + { + "description": "The API key ID.", + "in": "path", + "name": "api_key_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteApiKeyResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing API key", + "tags": [ + "API keys" + ] + } + }, + "/audiences": { + "get": { + "deprecated": true, + "description": "Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.", + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAudiencesResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of audiences", + "tags": [ + "Audiences" + ] + }, + "post": { + "deprecated": true, + "description": "Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAudienceOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAudienceResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a list of contacts", + "tags": [ + "Audiences" + ] + } + }, + "/audiences/{id}": { + "delete": { + "deprecated": true, + "description": "Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.", + "parameters": [ + { + "description": "The Audience ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveAudienceResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing audience", + "tags": [ + "Audiences" + ] + }, + "get": { + "deprecated": true, + "description": "Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.", + "parameters": [ + { + "description": "The Audience ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetAudienceResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single audience", + "tags": [ + "Audiences" + ] + } + }, + "/automations": { + "get": { + "parameters": [ + { + "description": "Filter automations by status.", + "in": "query", + "name": "status", + "required": false, + "schema": { + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + } + }, + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAutomationsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of automations", + "tags": [ + "Automations" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAutomationRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAutomationResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Create an automation", + "tags": [ + "Automations" + ] + } + }, + "/automations/{automation_id}": { + "delete": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteAutomationResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Delete an automation", + "tags": [ + "Automations" + ] + }, + "get": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Automation" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single automation", + "tags": [ + "Automations" + ] + }, + "patch": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchAutomationRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchAutomationResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an automation", + "tags": [ + "Automations" + ] + } + }, + "/automations/{automation_id}/runs": { + "get": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Filter runs by status. Comma-separated list of: running, completed, failed, cancelled.", + "in": "query", + "name": "status", + "required": false, + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAutomationRunsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of automation runs", + "tags": [ + "Automations" + ] + } + }, + "/automations/{automation_id}/runs/{run_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "The ID of the automation run.", + "in": "path", + "name": "run_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AutomationRun" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single automation run", + "tags": [ + "Automations" + ] + } + }, + "/automations/{automation_id}/stop": { + "post": { + "parameters": [ + { + "description": "The ID of the automation.", + "in": "path", + "name": "automation_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StopAutomationResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Stop an automation", + "tags": [ + "Automations" + ] + } + }, + "/broadcasts": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListBroadcastsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of broadcasts", + "tags": [ + "Broadcasts" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBroadcastOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBroadcastResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a broadcast", + "tags": [ + "Broadcasts" + ] + } + }, + "/broadcasts/{id}": { + "delete": { + "parameters": [ + { + "description": "The Broadcast ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveBroadcastResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing broadcast that is in the draft status", + "tags": [ + "Broadcasts" + ] + }, + "get": { + "parameters": [ + { + "description": "The Broadcast ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetBroadcastResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single broadcast", + "tags": [ + "Broadcasts" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Broadcast ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateBroadcastOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateBroadcastResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing broadcast", + "tags": [ + "Broadcasts" + ] + } + }, + "/broadcasts/{id}/send": { + "post": { + "parameters": [ + { + "description": "The Broadcast ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendBroadcastOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendBroadcastResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Send or schedule a broadcast", + "tags": [ + "Broadcasts" + ] + } + }, + "/contact-properties": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListContactPropertiesResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of contact properties", + "tags": [ + "Contact Properties" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContactPropertyOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContactPropertyResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new contact property", + "tags": [ + "Contact Properties" + ] + } + }, + "/contact-properties/{id}": { + "delete": { + "parameters": [ + { + "description": "The Contact Property ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveContactPropertyResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing contact property", + "tags": [ + "Contact Properties" + ] + }, + "get": { + "parameters": [ + { + "description": "The Contact Property ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetContactPropertyResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single contact property", + "tags": [ + "Contact Properties" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Contact Property ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactPropertyOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactPropertyResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing contact property", + "tags": [ + "Contact Properties" + ] + } + }, + "/contacts": { + "get": { + "parameters": [ + { + "description": "Filter contacts by segment ID.", + "in": "query", + "name": "segment_id", + "required": false, + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListContactsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of contacts", + "tags": [ + "Contacts" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContactOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContactResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new contact", + "tags": [ + "Contacts" + ] + } + }, + "/contacts/{contact_id}/segments": { + "get": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "contact_id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListContactSegmentsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of segments for a contact", + "tags": [ + "Contacts" + ] + } + }, + "/contacts/{contact_id}/segments/{segment_id}": { + "delete": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "contact_id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Segment ID.", + "in": "path", + "name": "segment_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveContactFromSegmentResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove a contact from a segment", + "tags": [ + "Contacts" + ] + }, + "post": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "contact_id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Segment ID.", + "in": "path", + "name": "segment_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AddContactToSegmentResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Add a contact to a segment", + "tags": [ + "Contacts" + ] + } + }, + "/contacts/{contact_id}/topics": { + "get": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "contact_id", + "required": true, + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetContactTopicsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve topics for a contact", + "tags": [ + "Contacts" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "contact_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactTopicsOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactTopicsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update topics for a contact", + "tags": [ + "Contacts" + ] + } + }, + "/contacts/{id}": { + "delete": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveContactResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing contact by ID or email", + "tags": [ + "Contacts" + ] + }, + "get": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetContactResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single contact by ID or email", + "tags": [ + "Contacts" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Contact ID or email address.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateContactResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update a single contact by ID or email", + "tags": [ + "Contacts" + ] + } + }, + "/domains": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListDomainsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of domains", + "tags": [ + "Domains" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDomainRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDomainResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new domain", + "tags": [ + "Domains" + ] + } + }, + "/domains/{domain_id}": { + "delete": { + "parameters": [ + { + "description": "The ID of the domain.", + "in": "path", + "name": "domain_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteDomainResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing domain", + "tags": [ + "Domains" + ] + }, + "get": { + "parameters": [ + { + "description": "The ID of the domain.", + "in": "path", + "name": "domain_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Domain" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single domain", + "tags": [ + "Domains" + ] + }, + "patch": { + "parameters": [ + { + "description": "The ID of the domain.", + "in": "path", + "name": "domain_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateDomainOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateDomainResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing domain", + "tags": [ + "Domains" + ] + } + }, + "/domains/{domain_id}/verify": { + "post": { + "description": "Triggers verification of the domain's DNS records including DKIM, SPF, and the tracking CNAME (if a tracking subdomain is configured).", + "parameters": [ + { + "description": "The ID of the domain.", + "in": "path", + "name": "domain_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VerifyDomainResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Verify an existing domain", + "tags": [ + "Domains" + ] + } + }, + "/emails": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListEmailsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of emails", + "tags": [ + "Emails" + ] + }, + "post": { + "parameters": [ + { + "description": "A unique identifier for the request to ensure emails are only sent once. [Learn more](https://resend.com/docs/dashboard/emails/idempotency-keys)", + "in": "header", + "name": "Idempotency-Key", + "required": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendEmailRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendEmailResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Send an email", + "tags": [ + "Emails" + ] + } + }, + "/emails/batch": { + "post": { + "parameters": [ + { + "description": "A unique identifier for the request to ensure emails are only sent once. [Learn more](https://resend.com/docs/dashboard/emails/idempotency-keys)", + "in": "header", + "name": "Idempotency-Key", + "required": false, + "schema": { + "maxLength": 256, + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/SendEmailRequest" + }, + "type": "array" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateBatchEmailsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Trigger up to 100 batch emails at once.", + "tags": [ + "Emails" + ] + } + }, + "/emails/receiving": { + "get": { + "parameters": [ + { + "description": "Maximum number of received emails to return.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Pagination cursor to fetch results after this email ID. Cannot be used with 'before'.", + "in": "query", + "name": "after", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Pagination cursor to fetch results before this email ID. Cannot be used with 'after'.", + "in": "query", + "name": "before", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListReceivedEmailsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of received emails", + "tags": [ + "Receiving Emails" + ] + } + }, + "/emails/receiving/{email_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the received email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetReceivedEmailResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single received email", + "tags": [ + "Receiving Emails" + ] + } + }, + "/emails/receiving/{email_id}/attachments": { + "get": { + "parameters": [ + { + "description": "The ID of the received email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Maximum number of attachments to return.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Pagination cursor to fetch results after this attachment ID. Cannot be used with 'before'.", + "in": "query", + "name": "after", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Pagination cursor to fetch results before this attachment ID. Cannot be used with 'after'.", + "in": "query", + "name": "before", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAttachmentsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of attachments for a received email", + "tags": [ + "Receiving Emails" + ] + } + }, + "/emails/receiving/{email_id}/attachments/{attachment_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the received email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "The ID of the attachment.", + "in": "path", + "name": "attachment_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RetrievedAttachment" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single attachment for a received email", + "tags": [ + "Receiving Emails" + ] + } + }, + "/emails/{email_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Email" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single email", + "tags": [ + "Emails" + ] + }, + "patch": { + "parameters": [ + { + "description": "The ID of the email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEmailOptions" + } + } + }, + "description": "OK" + } + }, + "summary": "Update a single email", + "tags": [ + "Emails" + ] + } + }, + "/emails/{email_id}/attachments": { + "get": { + "parameters": [ + { + "description": "The ID of the email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Maximum number of attachments to return.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Pagination cursor to fetch results after this attachment ID. Cannot be used with 'before'.", + "in": "query", + "name": "after", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Pagination cursor to fetch results before this attachment ID. Cannot be used with 'after'.", + "in": "query", + "name": "before", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListAttachmentsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of attachments for a sent email", + "tags": [ + "Emails" + ] + } + }, + "/emails/{email_id}/attachments/{attachment_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "The ID of the attachment.", + "in": "path", + "name": "attachment_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RetrievedAttachment" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single attachment for a sent email", + "tags": [ + "Emails" + ] + } + }, + "/emails/{email_id}/cancel": { + "post": { + "parameters": [ + { + "description": "The ID of the email.", + "in": "path", + "name": "email_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Email" + } + } + }, + "description": "OK" + } + }, + "summary": "Cancel the schedule of the e-mail.", + "tags": [ + "Emails" + ] + } + }, + "/events": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListEventsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of events", + "tags": [ + "Events" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEventRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateEventResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Create an event", + "tags": [ + "Events" + ] + } + }, + "/events/send": { + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendEventRequest" + } + } + } + }, + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendEventResponse" + } + } + }, + "description": "Accepted" + } + }, + "summary": "Send an event", + "tags": [ + "Events" + ] + } + }, + "/events/{identifier}": { + "delete": { + "parameters": [ + { + "description": "The event ID (UUID) or event name.", + "in": "path", + "name": "identifier", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveEventResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Delete an event", + "tags": [ + "Events" + ] + }, + "get": { + "parameters": [ + { + "description": "The event ID (UUID) or event name.", + "in": "path", + "name": "identifier", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Event" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single event", + "tags": [ + "Events" + ] + }, + "patch": { + "parameters": [ + { + "description": "The event ID (UUID) or event name.", + "in": "path", + "name": "identifier", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEventRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateEventResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an event", + "tags": [ + "Events" + ] + } + }, + "/logs": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListLogsResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of logs", + "tags": [ + "Logs" + ] + } + }, + "/logs/{log_id}": { + "get": { + "parameters": [ + { + "description": "The ID of the log.", + "in": "path", + "name": "log_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Log" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single log", + "tags": [ + "Logs" + ] + } + }, + "/segments": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListSegmentsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of segments", + "tags": [ + "Segments" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSegmentOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateSegmentResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new segment", + "tags": [ + "Segments" + ] + } + }, + "/segments/{id}": { + "delete": { + "parameters": [ + { + "description": "The Segment ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveSegmentResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing segment", + "tags": [ + "Segments" + ] + }, + "get": { + "parameters": [ + { + "description": "The Segment ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetSegmentResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single segment", + "tags": [ + "Segments" + ] + } + }, + "/templates": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTemplatesResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of templates", + "tags": [ + "Templates" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTemplateRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTemplateResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a template", + "tags": [ + "Templates" + ] + } + }, + "/templates/{id}": { + "delete": { + "parameters": [ + { + "description": "The Template ID or alias.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveTemplateResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing template", + "tags": [ + "Templates" + ] + }, + "get": { + "parameters": [ + { + "description": "The Template ID or alias.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single template", + "tags": [ + "Templates" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Template ID or alias.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTemplateOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTemplateResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing template", + "tags": [ + "Templates" + ] + } + }, + "/templates/{id}/duplicate": { + "post": { + "parameters": [ + { + "description": "The Template ID or alias.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DuplicateTemplateResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Duplicate a template", + "tags": [ + "Templates" + ] + } + }, + "/templates/{id}/publish": { + "post": { + "parameters": [ + { + "description": "The Template ID or alias.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PublishTemplateResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Publish a template", + "tags": [ + "Templates" + ] + } + }, + "/topics": { + "get": { + "parameters": [ + { + "$ref": "#/components/parameters/PaginationLimit" + }, + { + "$ref": "#/components/parameters/PaginationAfter" + }, + { + "$ref": "#/components/parameters/PaginationBefore" + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListTopicsResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of topics", + "tags": [ + "Topics" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTopicOptions" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTopicResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Create a new topic", + "tags": [ + "Topics" + ] + } + }, + "/topics/{id}": { + "delete": { + "parameters": [ + { + "description": "The Topic ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveTopicResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing topic", + "tags": [ + "Topics" + ] + }, + "get": { + "parameters": [ + { + "description": "The Topic ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetTopicResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single topic", + "tags": [ + "Topics" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Topic ID.", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTopicOptions" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateTopicResponseSuccess" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing topic", + "tags": [ + "Topics" + ] + } + }, + "/webhooks": { + "get": { + "parameters": [ + { + "description": "Maximum number of webhooks to return.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "Pagination cursor to fetch results after this webhook ID. Cannot be used with 'before'.", + "in": "query", + "name": "after", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "description": "Pagination cursor to fetch results before this webhook ID. Cannot be used with 'after'.", + "in": "query", + "name": "before", + "required": false, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListWebhooksResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a list of webhooks", + "tags": [ + "Webhooks" + ] + }, + "post": { + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookRequest" + } + } + } + }, + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateWebhookResponse" + } + } + }, + "description": "Created" + } + }, + "summary": "Create a new webhook", + "tags": [ + "Webhooks" + ] + } + }, + "/webhooks/{webhook_id}": { + "delete": { + "parameters": [ + { + "description": "The Webhook ID.", + "in": "path", + "name": "webhook_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteWebhookResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Remove an existing webhook", + "tags": [ + "Webhooks" + ] + }, + "get": { + "parameters": [ + { + "description": "The Webhook ID.", + "in": "path", + "name": "webhook_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetWebhookResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Retrieve a single webhook", + "tags": [ + "Webhooks" + ] + }, + "patch": { + "parameters": [ + { + "description": "The Webhook ID.", + "in": "path", + "name": "webhook_id", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookRequest" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateWebhookResponse" + } + } + }, + "description": "OK" + } + }, + "summary": "Update an existing webhook", + "tags": [ + "Webhooks" + ] + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "servers": [ + { + "url": "https://api.resend.com" + } + ], + "tags": [ + { + "description": "Start sending emails through the Resend API.", + "name": "Emails" + }, + { + "description": "Create and manage domains through the Resend API.", + "name": "Domains" + }, + { + "description": "Create and manage API Keys through the Resend API.", + "name": "API Keys" + }, + { + "description": "Deprecated: Use Segments instead. Create and manage Audiences through the Resend API.", + "name": "Audiences" + }, + { + "description": "Create and manage Contacts through the Resend API.", + "name": "Contacts" + }, + { + "description": "Retrieve and manage received emails and attachments through the Resend API.", + "name": "Receiving Emails" + }, + { + "description": "Create and manage Webhooks through the Resend API.", + "name": "Webhooks" + }, + { + "description": "Create and manage Templates through the Resend API.", + "name": "Templates" + }, + { + "description": "Create and manage Broadcasts through the Resend API.", + "name": "Broadcasts" + }, + { + "description": "Create and manage Segments through the Resend API.", + "name": "Segments" + }, + { + "description": "Create and manage Topics through the Resend API.", + "name": "Topics" + }, + { + "description": "Create and manage Contact Properties through the Resend API.", + "name": "Contact Properties" + }, + { + "description": "Retrieve API request logs through the Resend API.", + "name": "Logs" + }, + { + "description": "Create and manage Automations through the Resend API.", + "name": "Automations" + }, + { + "description": "Create and manage Events through the Resend API.", + "name": "Events" + } + ] +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..086fbda --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +# a2a-pack is installed by the platform base image. +deepagents>=0.5.0 +langchain>=0.3 +langchain-openai>=0.2 +langchain-core>=0.3 +langgraph>=0.6 +httpx>=0.27 diff --git a/skills/api-keys/SKILL.md b/skills/api-keys/SKILL.md new file mode 100644 index 0000000..c8495b4 --- /dev/null +++ b/skills/api-keys/SKILL.md @@ -0,0 +1,42 @@ +--- +name: api-keys-routes +description: Handle 3 OpenAPI operation(s) under /api-keys for the api keys route group. +--- + +# api keys API Routes + +Handle 3 OpenAPI operation(s) under /api-keys for the api keys route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_api_keys + +- Operation ID: `post_api_keys` +- Route: `POST /api-keys` +- Mode: WRITE +- Summary: Create a new API key +- Body: JSON request body accepted. + +### get_api_keys + +- Operation ID: `get_api_keys` +- Route: `GET /api-keys` +- Mode: READ +- Summary: Retrieve a list of API keys +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### delete_api_keys_api_key_id + +- Operation ID: `delete_api_keys_api_key_id` +- Route: `DELETE /api-keys/{api_key_id}` +- Mode: WRITE +- Summary: Remove an existing API key +- Parameters: + - `api_key_id` in `path` required diff --git a/skills/audiences/SKILL.md b/skills/audiences/SKILL.md new file mode 100644 index 0000000..742fd6a --- /dev/null +++ b/skills/audiences/SKILL.md @@ -0,0 +1,47 @@ +--- +name: audiences-routes +description: Handle 4 OpenAPI operation(s) under /audiences for the audiences route group. +--- + +# audiences API Routes + +Handle 4 OpenAPI operation(s) under /audiences for the audiences route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_audiences + +- Operation ID: `post_audiences` +- Route: `POST /audiences` +- Mode: WRITE +- Summary: Create a list of contacts +- Body: JSON request body accepted. + +### get_audiences + +- Operation ID: `get_audiences` +- Route: `GET /audiences` +- Mode: READ +- Summary: Retrieve a list of audiences + +### delete_audiences_id + +- Operation ID: `delete_audiences_id` +- Route: `DELETE /audiences/{id}` +- Mode: WRITE +- Summary: Remove an existing audience +- Parameters: + - `id` in `path` required + +### get_audiences_id + +- Operation ID: `get_audiences_id` +- Route: `GET /audiences/{id}` +- Mode: READ +- Summary: Retrieve a single audience +- Parameters: + - `id` in `path` required diff --git a/skills/automations/SKILL.md b/skills/automations/SKILL.md new file mode 100644 index 0000000..2fb2831 --- /dev/null +++ b/skills/automations/SKILL.md @@ -0,0 +1,94 @@ +--- +name: automations-routes +description: Handle 8 OpenAPI operation(s) under /automations for the automations route group. +--- + +# automations API Routes + +Handle 8 OpenAPI operation(s) under /automations for the automations route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_automations + +- Operation ID: `post_automations` +- Route: `POST /automations` +- Mode: WRITE +- Summary: Create an automation +- Body: JSON request body accepted. + +### get_automations + +- Operation ID: `get_automations` +- Route: `GET /automations` +- Mode: READ +- Summary: Retrieve a list of automations +- Parameters: + - `status` in `query` + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_automations_automation_id + +- Operation ID: `get_automations_automation_id` +- Route: `GET /automations/{automation_id}` +- Mode: READ +- Summary: Retrieve a single automation +- Parameters: + - `automation_id` in `path` required + +### patch_automations_automation_id + +- Operation ID: `patch_automations_automation_id` +- Route: `PATCH /automations/{automation_id}` +- Mode: WRITE +- Summary: Update an automation +- Parameters: + - `automation_id` in `path` required +- Body: JSON request body accepted. + +### delete_automations_automation_id + +- Operation ID: `delete_automations_automation_id` +- Route: `DELETE /automations/{automation_id}` +- Mode: WRITE +- Summary: Delete an automation +- Parameters: + - `automation_id` in `path` required + +### post_automations_automation_id_stop + +- Operation ID: `post_automations_automation_id_stop` +- Route: `POST /automations/{automation_id}/stop` +- Mode: WRITE +- Summary: Stop an automation +- Parameters: + - `automation_id` in `path` required + +### get_automations_automation_id_runs + +- Operation ID: `get_automations_automation_id_runs` +- Route: `GET /automations/{automation_id}/runs` +- Mode: READ +- Summary: Retrieve a list of automation runs +- Parameters: + - `automation_id` in `path` required + - `status` in `query` + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_automations_automation_id_runs_run_id + +- Operation ID: `get_automations_automation_id_runs_run_id` +- Route: `GET /automations/{automation_id}/runs/{run_id}` +- Mode: READ +- Summary: Retrieve a single automation run +- Parameters: + - `automation_id` in `path` required + - `run_id` in `path` required diff --git a/skills/broadcasts/SKILL.md b/skills/broadcasts/SKILL.md new file mode 100644 index 0000000..b83ba16 --- /dev/null +++ b/skills/broadcasts/SKILL.md @@ -0,0 +1,71 @@ +--- +name: broadcasts-routes +description: Handle 6 OpenAPI operation(s) under /broadcasts for the broadcasts route group. +--- + +# broadcasts API Routes + +Handle 6 OpenAPI operation(s) under /broadcasts for the broadcasts route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_broadcasts + +- Operation ID: `post_broadcasts` +- Route: `POST /broadcasts` +- Mode: WRITE +- Summary: Create a broadcast +- Body: JSON request body accepted. + +### get_broadcasts + +- Operation ID: `get_broadcasts` +- Route: `GET /broadcasts` +- Mode: READ +- Summary: Retrieve a list of broadcasts +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### delete_broadcasts_id + +- Operation ID: `delete_broadcasts_id` +- Route: `DELETE /broadcasts/{id}` +- Mode: WRITE +- Summary: Remove an existing broadcast that is in the draft status +- Parameters: + - `id` in `path` required + +### get_broadcasts_id + +- Operation ID: `get_broadcasts_id` +- Route: `GET /broadcasts/{id}` +- Mode: READ +- Summary: Retrieve a single broadcast +- Parameters: + - `id` in `path` required + +### patch_broadcasts_id + +- Operation ID: `patch_broadcasts_id` +- Route: `PATCH /broadcasts/{id}` +- Mode: WRITE +- Summary: Update an existing broadcast +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. + +### post_broadcasts_id_send + +- Operation ID: `post_broadcasts_id_send` +- Route: `POST /broadcasts/{id}/send` +- Mode: WRITE +- Summary: Send or schedule a broadcast +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. diff --git a/skills/contact-properties/SKILL.md b/skills/contact-properties/SKILL.md new file mode 100644 index 0000000..201e1d5 --- /dev/null +++ b/skills/contact-properties/SKILL.md @@ -0,0 +1,61 @@ +--- +name: contact-properties-routes +description: Handle 5 OpenAPI operation(s) under /contact-properties for the contact properties route group. +--- + +# contact properties API Routes + +Handle 5 OpenAPI operation(s) under /contact-properties for the contact properties route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_contact_properties + +- Operation ID: `post_contact_properties` +- Route: `POST /contact-properties` +- Mode: WRITE +- Summary: Create a new contact property +- Body: JSON request body accepted. + +### get_contact_properties + +- Operation ID: `get_contact_properties` +- Route: `GET /contact-properties` +- Mode: READ +- Summary: Retrieve a list of contact properties +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_contact_properties_id + +- Operation ID: `get_contact_properties_id` +- Route: `GET /contact-properties/{id}` +- Mode: READ +- Summary: Retrieve a single contact property +- Parameters: + - `id` in `path` required + +### patch_contact_properties_id + +- Operation ID: `patch_contact_properties_id` +- Route: `PATCH /contact-properties/{id}` +- Mode: WRITE +- Summary: Update an existing contact property +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. + +### delete_contact_properties_id + +- Operation ID: `delete_contact_properties_id` +- Route: `DELETE /contact-properties/{id}` +- Mode: WRITE +- Summary: Remove an existing contact property +- Parameters: + - `id` in `path` required diff --git a/skills/contacts/SKILL.md b/skills/contacts/SKILL.md new file mode 100644 index 0000000..5d8bdf2 --- /dev/null +++ b/skills/contacts/SKILL.md @@ -0,0 +1,116 @@ +--- +name: contacts-routes +description: Handle 10 OpenAPI operation(s) under /contacts for the contacts route group. +--- + +# contacts API Routes + +Handle 10 OpenAPI operation(s) under /contacts for the contacts route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_contacts + +- Operation ID: `post_contacts` +- Route: `POST /contacts` +- Mode: WRITE +- Summary: Create a new contact +- Body: JSON request body accepted. + +### get_contacts + +- Operation ID: `get_contacts` +- Route: `GET /contacts` +- Mode: READ +- Summary: Retrieve a list of contacts +- Parameters: + - `segment_id` in `query` + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_contacts_id + +- Operation ID: `get_contacts_id` +- Route: `GET /contacts/{id}` +- Mode: READ +- Summary: Retrieve a single contact by ID or email +- Parameters: + - `id` in `path` required + +### patch_contacts_id + +- Operation ID: `patch_contacts_id` +- Route: `PATCH /contacts/{id}` +- Mode: WRITE +- Summary: Update a single contact by ID or email +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. + +### delete_contacts_id + +- Operation ID: `delete_contacts_id` +- Route: `DELETE /contacts/{id}` +- Mode: WRITE +- Summary: Remove an existing contact by ID or email +- Parameters: + - `id` in `path` required + +### get_contacts_contact_id_segments + +- Operation ID: `get_contacts_contact_id_segments` +- Route: `GET /contacts/{contact_id}/segments` +- Mode: READ +- Summary: Retrieve a list of segments for a contact +- Parameters: + - `contact_id` in `path` required + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### post_contacts_contact_id_segments_segment_id + +- Operation ID: `post_contacts_contact_id_segments_segment_id` +- Route: `POST /contacts/{contact_id}/segments/{segment_id}` +- Mode: WRITE +- Summary: Add a contact to a segment +- Parameters: + - `contact_id` in `path` required + - `segment_id` in `path` required + +### delete_contacts_contact_id_segments_segment_id + +- Operation ID: `delete_contacts_contact_id_segments_segment_id` +- Route: `DELETE /contacts/{contact_id}/segments/{segment_id}` +- Mode: WRITE +- Summary: Remove a contact from a segment +- Parameters: + - `contact_id` in `path` required + - `segment_id` in `path` required + +### get_contacts_contact_id_topics + +- Operation ID: `get_contacts_contact_id_topics` +- Route: `GET /contacts/{contact_id}/topics` +- Mode: READ +- Summary: Retrieve topics for a contact +- Parameters: + - `contact_id` in `path` required + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### patch_contacts_contact_id_topics + +- Operation ID: `patch_contacts_contact_id_topics` +- Route: `PATCH /contacts/{contact_id}/topics` +- Mode: WRITE +- Summary: Update topics for a contact +- Parameters: + - `contact_id` in `path` required +- Body: JSON request body accepted. diff --git a/skills/domains/SKILL.md b/skills/domains/SKILL.md new file mode 100644 index 0000000..f046b5f --- /dev/null +++ b/skills/domains/SKILL.md @@ -0,0 +1,70 @@ +--- +name: domains-routes +description: Handle 6 OpenAPI operation(s) under /domains for the domains route group. +--- + +# domains API Routes + +Handle 6 OpenAPI operation(s) under /domains for the domains route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_domains + +- Operation ID: `post_domains` +- Route: `POST /domains` +- Mode: WRITE +- Summary: Create a new domain +- Body: JSON request body accepted. + +### get_domains + +- Operation ID: `get_domains` +- Route: `GET /domains` +- Mode: READ +- Summary: Retrieve a list of domains +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_domains_domain_id + +- Operation ID: `get_domains_domain_id` +- Route: `GET /domains/{domain_id}` +- Mode: READ +- Summary: Retrieve a single domain +- Parameters: + - `domain_id` in `path` required + +### patch_domains_domain_id + +- Operation ID: `patch_domains_domain_id` +- Route: `PATCH /domains/{domain_id}` +- Mode: WRITE +- Summary: Update an existing domain +- Parameters: + - `domain_id` in `path` required +- Body: JSON request body accepted. + +### delete_domains_domain_id + +- Operation ID: `delete_domains_domain_id` +- Route: `DELETE /domains/{domain_id}` +- Mode: WRITE +- Summary: Remove an existing domain +- Parameters: + - `domain_id` in `path` required + +### post_domains_domain_id_verify + +- Operation ID: `post_domains_domain_id_verify` +- Route: `POST /domains/{domain_id}/verify` +- Mode: WRITE +- Summary: Verify an existing domain +- Parameters: + - `domain_id` in `path` required diff --git a/skills/emails/SKILL.md b/skills/emails/SKILL.md new file mode 100644 index 0000000..a176afc --- /dev/null +++ b/skills/emails/SKILL.md @@ -0,0 +1,136 @@ +--- +name: emails-routes +description: Handle 12 OpenAPI operation(s) under /emails for the emails route group. +--- + +# emails API Routes + +Handle 12 OpenAPI operation(s) under /emails for the emails route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_emails + +- Operation ID: `post_emails` +- Route: `POST /emails` +- Mode: WRITE +- Summary: Send an email +- Parameters: + - `Idempotency-Key` in `header` +- Body: JSON request body accepted. + +### get_emails + +- Operation ID: `get_emails` +- Route: `GET /emails` +- Mode: READ +- Summary: Retrieve a list of emails +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_emails_email_id + +- Operation ID: `get_emails_email_id` +- Route: `GET /emails/{email_id}` +- Mode: READ +- Summary: Retrieve a single email +- Parameters: + - `email_id` in `path` required + +### patch_emails_email_id + +- Operation ID: `patch_emails_email_id` +- Route: `PATCH /emails/{email_id}` +- Mode: WRITE +- Summary: Update a single email +- Parameters: + - `email_id` in `path` required + +### post_emails_email_id_cancel + +- Operation ID: `post_emails_email_id_cancel` +- Route: `POST /emails/{email_id}/cancel` +- Mode: WRITE +- Summary: Cancel the schedule of the e-mail. +- Parameters: + - `email_id` in `path` required + +### post_emails_batch + +- Operation ID: `post_emails_batch` +- Route: `POST /emails/batch` +- Mode: WRITE +- Summary: Trigger up to 100 batch emails at once. +- Parameters: + - `Idempotency-Key` in `header` +- Body: JSON request body accepted. + +### get_emails_email_id_attachments + +- Operation ID: `get_emails_email_id_attachments` +- Route: `GET /emails/{email_id}/attachments` +- Mode: READ +- Summary: Retrieve a list of attachments for a sent email +- Parameters: + - `email_id` in `path` required + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_emails_email_id_attachments_attachment_id + +- Operation ID: `get_emails_email_id_attachments_attachment_id` +- Route: `GET /emails/{email_id}/attachments/{attachment_id}` +- Mode: READ +- Summary: Retrieve a single attachment for a sent email +- Parameters: + - `email_id` in `path` required + - `attachment_id` in `path` required + +### get_emails_receiving + +- Operation ID: `get_emails_receiving` +- Route: `GET /emails/receiving` +- Mode: READ +- Summary: Retrieve a list of received emails +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_emails_receiving_email_id + +- Operation ID: `get_emails_receiving_email_id` +- Route: `GET /emails/receiving/{email_id}` +- Mode: READ +- Summary: Retrieve a single received email +- Parameters: + - `email_id` in `path` required + +### get_emails_receiving_email_id_attachments + +- Operation ID: `get_emails_receiving_email_id_attachments` +- Route: `GET /emails/receiving/{email_id}/attachments` +- Mode: READ +- Summary: Retrieve a list of attachments for a received email +- Parameters: + - `email_id` in `path` required + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_emails_receiving_email_id_attachments_attachment_id + +- Operation ID: `get_emails_receiving_email_id_attachments_attachment_id` +- Route: `GET /emails/receiving/{email_id}/attachments/{attachment_id}` +- Mode: READ +- Summary: Retrieve a single attachment for a received email +- Parameters: + - `email_id` in `path` required + - `attachment_id` in `path` required diff --git a/skills/events/SKILL.md b/skills/events/SKILL.md new file mode 100644 index 0000000..c663fc0 --- /dev/null +++ b/skills/events/SKILL.md @@ -0,0 +1,69 @@ +--- +name: events-routes +description: Handle 6 OpenAPI operation(s) under /events for the events route group. +--- + +# events API Routes + +Handle 6 OpenAPI operation(s) under /events for the events route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_events + +- Operation ID: `post_events` +- Route: `POST /events` +- Mode: WRITE +- Summary: Create an event +- Body: JSON request body accepted. + +### get_events + +- Operation ID: `get_events` +- Route: `GET /events` +- Mode: READ +- Summary: Retrieve a list of events +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### post_events_send + +- Operation ID: `post_events_send` +- Route: `POST /events/send` +- Mode: WRITE +- Summary: Send an event +- Body: JSON request body accepted. + +### get_events_identifier + +- Operation ID: `get_events_identifier` +- Route: `GET /events/{identifier}` +- Mode: READ +- Summary: Retrieve a single event +- Parameters: + - `identifier` in `path` required + +### patch_events_identifier + +- Operation ID: `patch_events_identifier` +- Route: `PATCH /events/{identifier}` +- Mode: WRITE +- Summary: Update an event +- Parameters: + - `identifier` in `path` required +- Body: JSON request body accepted. + +### delete_events_identifier + +- Operation ID: `delete_events_identifier` +- Route: `DELETE /events/{identifier}` +- Mode: WRITE +- Summary: Delete an event +- Parameters: + - `identifier` in `path` required diff --git a/skills/logs/SKILL.md b/skills/logs/SKILL.md new file mode 100644 index 0000000..708c2b2 --- /dev/null +++ b/skills/logs/SKILL.md @@ -0,0 +1,34 @@ +--- +name: logs-routes +description: Handle 2 OpenAPI operation(s) under /logs for the logs route group. +--- + +# logs API Routes + +Handle 2 OpenAPI operation(s) under /logs for the logs route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### get_logs + +- Operation ID: `get_logs` +- Route: `GET /logs` +- Mode: READ +- Summary: Retrieve a list of logs +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_logs_log_id + +- Operation ID: `get_logs_log_id` +- Route: `GET /logs/{log_id}` +- Mode: READ +- Summary: Retrieve a single log +- Parameters: + - `log_id` in `path` required diff --git a/skills/segments/SKILL.md b/skills/segments/SKILL.md new file mode 100644 index 0000000..44a983b --- /dev/null +++ b/skills/segments/SKILL.md @@ -0,0 +1,51 @@ +--- +name: segments-routes +description: Handle 4 OpenAPI operation(s) under /segments for the segments route group. +--- + +# segments API Routes + +Handle 4 OpenAPI operation(s) under /segments for the segments route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_segments + +- Operation ID: `post_segments` +- Route: `POST /segments` +- Mode: WRITE +- Summary: Create a new segment +- Body: JSON request body accepted. + +### get_segments + +- Operation ID: `get_segments` +- Route: `GET /segments` +- Mode: READ +- Summary: Retrieve a list of segments +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_segments_id + +- Operation ID: `get_segments_id` +- Route: `GET /segments/{id}` +- Mode: READ +- Summary: Retrieve a single segment +- Parameters: + - `id` in `path` required + +### delete_segments_id + +- Operation ID: `delete_segments_id` +- Route: `DELETE /segments/{id}` +- Mode: WRITE +- Summary: Remove an existing segment +- Parameters: + - `id` in `path` required diff --git a/skills/templates/SKILL.md b/skills/templates/SKILL.md new file mode 100644 index 0000000..0808a12 --- /dev/null +++ b/skills/templates/SKILL.md @@ -0,0 +1,79 @@ +--- +name: templates-routes +description: Handle 7 OpenAPI operation(s) under /templates for the templates route group. +--- + +# templates API Routes + +Handle 7 OpenAPI operation(s) under /templates for the templates route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_templates + +- Operation ID: `post_templates` +- Route: `POST /templates` +- Mode: WRITE +- Summary: Create a template +- Body: JSON request body accepted. + +### get_templates + +- Operation ID: `get_templates` +- Route: `GET /templates` +- Mode: READ +- Summary: Retrieve a list of templates +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_templates_id + +- Operation ID: `get_templates_id` +- Route: `GET /templates/{id}` +- Mode: READ +- Summary: Retrieve a single template +- Parameters: + - `id` in `path` required + +### patch_templates_id + +- Operation ID: `patch_templates_id` +- Route: `PATCH /templates/{id}` +- Mode: WRITE +- Summary: Update an existing template +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. + +### delete_templates_id + +- Operation ID: `delete_templates_id` +- Route: `DELETE /templates/{id}` +- Mode: WRITE +- Summary: Remove an existing template +- Parameters: + - `id` in `path` required + +### post_templates_id_publish + +- Operation ID: `post_templates_id_publish` +- Route: `POST /templates/{id}/publish` +- Mode: WRITE +- Summary: Publish a template +- Parameters: + - `id` in `path` required + +### post_templates_id_duplicate + +- Operation ID: `post_templates_id_duplicate` +- Route: `POST /templates/{id}/duplicate` +- Mode: WRITE +- Summary: Duplicate a template +- Parameters: + - `id` in `path` required diff --git a/skills/topics/SKILL.md b/skills/topics/SKILL.md new file mode 100644 index 0000000..c66c4bc --- /dev/null +++ b/skills/topics/SKILL.md @@ -0,0 +1,61 @@ +--- +name: topics-routes +description: Handle 5 OpenAPI operation(s) under /topics for the topics route group. +--- + +# topics API Routes + +Handle 5 OpenAPI operation(s) under /topics for the topics route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_topics + +- Operation ID: `post_topics` +- Route: `POST /topics` +- Mode: WRITE +- Summary: Create a new topic +- Body: JSON request body accepted. + +### get_topics + +- Operation ID: `get_topics` +- Route: `GET /topics` +- Mode: READ +- Summary: Retrieve a list of topics +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_topics_id + +- Operation ID: `get_topics_id` +- Route: `GET /topics/{id}` +- Mode: READ +- Summary: Retrieve a single topic +- Parameters: + - `id` in `path` required + +### patch_topics_id + +- Operation ID: `patch_topics_id` +- Route: `PATCH /topics/{id}` +- Mode: WRITE +- Summary: Update an existing topic +- Parameters: + - `id` in `path` required +- Body: JSON request body accepted. + +### delete_topics_id + +- Operation ID: `delete_topics_id` +- Route: `DELETE /topics/{id}` +- Mode: WRITE +- Summary: Remove an existing topic +- Parameters: + - `id` in `path` required diff --git a/skills/webhooks/SKILL.md b/skills/webhooks/SKILL.md new file mode 100644 index 0000000..6c207b9 --- /dev/null +++ b/skills/webhooks/SKILL.md @@ -0,0 +1,61 @@ +--- +name: webhooks-routes +description: Handle 5 OpenAPI operation(s) under /webhooks for the webhooks route group. +--- + +# webhooks API Routes + +Handle 5 OpenAPI operation(s) under /webhooks for the webhooks route group. + +Use the generated operation tools to make real API calls. Do not invent API responses. +If a tool reports missing setup, return the exact setup field name to the caller. +For write, update, or delete operations, state the intended action before calling the tool. + +## Operations + +### post_webhooks + +- Operation ID: `post_webhooks` +- Route: `POST /webhooks` +- Mode: WRITE +- Summary: Create a new webhook +- Body: JSON request body accepted. + +### get_webhooks + +- Operation ID: `get_webhooks` +- Route: `GET /webhooks` +- Mode: READ +- Summary: Retrieve a list of webhooks +- Parameters: + - `limit` in `query` + - `after` in `query` + - `before` in `query` + +### get_webhooks_webhook_id + +- Operation ID: `get_webhooks_webhook_id` +- Route: `GET /webhooks/{webhook_id}` +- Mode: READ +- Summary: Retrieve a single webhook +- Parameters: + - `webhook_id` in `path` required + +### patch_webhooks_webhook_id + +- Operation ID: `patch_webhooks_webhook_id` +- Route: `PATCH /webhooks/{webhook_id}` +- Mode: WRITE +- Summary: Update an existing webhook +- Parameters: + - `webhook_id` in `path` required +- Body: JSON request body accepted. + +### delete_webhooks_webhook_id + +- Operation ID: `delete_webhooks_webhook_id` +- Route: `DELETE /webhooks/{webhook_id}` +- Mode: WRITE +- Summary: Remove an existing webhook +- Parameters: + - `webhook_id` in `path` required