435 lines
213 KiB
Python
435 lines
213 KiB
Python
from __future__ import annotations
|
|
|
|
import base64
|
|
import json
|
|
import re
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
import httpx
|
|
from a2a_pack.deepagents import create_a2a_deep_agent
|
|
from langchain_core.messages import BaseMessage
|
|
from langchain_core.tools import StructuredTool
|
|
from pydantic import BaseModel, Field
|
|
|
|
from a2a_pack import (
|
|
A2AAgent,
|
|
ConsumerSetup,
|
|
ConsumerSetupField,
|
|
ConsumerSetupMissing,
|
|
EgressPolicy,
|
|
LLMProvisioning,
|
|
Pricing,
|
|
Resources,
|
|
RunContext,
|
|
skill,
|
|
)
|
|
|
|
|
|
DEFAULT_BASE_URL = "https://api.lob.com/v1"
|
|
OPERATIONS = json.loads("{\n \"address_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new address given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"address_create\",\n \"parameters\": [],\n \"path\": \"/addresses\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/address_editable\"\n },\n \"security\": null,\n \"skill_name\": \"address_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Addresses\"\n ]\n },\n \"address_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Deletes the details of an existing address. You need only supply the unique identifier that was returned upon address creation.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"address_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the address\",\n \"in\": \"path\",\n \"name\": \"adr_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/adr_id\"\n }\n }\n ],\n \"path\": \"/addresses/{adr_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"address_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Addresses\"\n ]\n },\n \"address_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing address. You need only supply the unique identifier that was returned upon address creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"address_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the address\",\n \"in\": \"path\",\n \"name\": \"adr_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/adr_id\"\n }\n }\n ],\n \"path\": \"/addresses/{adr_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"address_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Addresses\"\n ]\n },\n \"addresses_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your addresses. The addresses are returned sorted by creation date, with the most recently created addresses appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"addresses_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n }\n ],\n \"path\": \"/addresses\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"addresses_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Addresses\"\n ]\n },\n \"autocompletion\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Given an address prefix consisting of a partial primary line, as well as optional input of city, state, and zip code, this functionality returns up to 10 full US address suggestions. Not all of them will turn out to be valid addresses; they'll need to be [verified](#operation/verification_us).\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"autocompletion\",\n \"parameters\": [\n {\n \"description\": \"Casing of the verified address. Possible values are `upper` and `proper` for uppercased (e.g. \\\"PO BOX\\\") and proper-cased (e.g. \\\"PO Box\\\"), respectively. Only affects `primary_line`, `city`, and `state`. Default casing is `upper`.\",\n \"in\": \"query\",\n \"name\": \"case\",\n \"required\": false,\n \"schema\": {\n \"default\": \"upper\",\n \"enum\": [\n \"upper\",\n \"proper\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"Possible values are `true` and `false`. If false, not all of the suggestions in the response will be valid addresses; they'll need to be verified in order to determine the deliverability. The valid_addresses flag will greatly reduce the number of keystrokes needed before reaching an intended address.\",\n \"in\": \"query\",\n \"name\": \"valid_addresses\",\n \"required\": false,\n \"schema\": {\n \"default\": false,\n \"enum\": [\n true,\n false\n ],\n \"type\": \"boolean\"\n }\n }\n ],\n \"path\": \"/us_autocompletions\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/us_autocompletions_writable\"\n },\n \"security\": null,\n \"skill_name\": \"autocompletion\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Autocomplete\",\n \"tags\": [\n \"US Autocompletions\"\n ]\n },\n \"bank_account_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new bank account with the provided properties. Bank accounts created in live mode will need to be verified via micro deposits before being able to send live checks. The deposits will appear in the bank account in 2-3 business days and have the description \\\"VERIFICATION\\\".\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"bank_account_create\",\n \"parameters\": [],\n \"path\": \"/bank_accounts\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/bank_account_base\"\n },\n \"security\": null,\n \"skill_name\": \"bank_account_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Bank Accounts\"\n ]\n },\n \"bank_account_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Permanently deletes a bank account. It cannot be undone.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"bank_account_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the bank account\",\n \"in\": \"path\",\n \"name\": \"bank_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/bank_id\"\n }\n }\n ],\n \"path\": \"/bank_accounts/{bank_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"bank_account_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Bank Accounts\"\n ]\n },\n \"bank_account_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing bank account. You need only supply the unique bank account identifier that was returned upon bank account creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"bank_account_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the bank account\",\n \"in\": \"path\",\n \"name\": \"bank_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/bank_id\"\n }\n }\n ],\n \"path\": \"/bank_accounts/{bank_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"bank_account_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Bank Accounts\"\n ]\n },\n \"bank_account_verify\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Verify a bank account in order to create a check.\\n\\nCheck the `microdeposit_type` field returned by `GET /v1/bank_accounts/:id` to determine which parameter to submit:\\n- `amounts` \\u2014 provide the two microdeposit amounts (in cents) that appeared\\n in the bank account statement.\\n\\n- `descriptor_code` \\u2014 provide the 6-character code (beginning with `SM`)\\n from the bank statement descriptor of the single $0.01 microdeposit.\\n\\n\\nSubmitting the wrong parameter type for the account's `microdeposit_type` will return an error.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"bank_account_verify\",\n \"parameters\": [\n {\n \"description\": \"id of the bank account to be verified\",\n \"in\": \"path\",\n \"name\": \"bank_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/bank_id\"\n }\n }\n ],\n \"path\": \"/bank_accounts/{bank_id}/verify\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/bank_account_verify\"\n },\n \"security\": null,\n \"skill_name\": \"bank_account_verify\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Verify\",\n \"tags\": [\n \"Bank Accounts\"\n ]\n },\n \"bank_accounts_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your bank accounts. The bank accounts are returned sorted by creation date, with the most recently created bank accounts appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"bank_accounts_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n }\n ],\n \"path\": \"/bank_accounts\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"bank_accounts_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Bank Accounts\"\n ]\n },\n \"billing_group_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new billing_group with the provided properties.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"billing_group_create\",\n \"parameters\": [],\n \"path\": \"/billing_groups\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/billing_group_editable\"\n },\n \"security\": null,\n \"skill_name\": \"billing_group_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Billing Groups\"\n ]\n },\n \"billing_group_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing billing_group. You need only supply the unique billing_group identifier that was returned upon billing_group creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"billing_group_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the billing_group\",\n \"in\": \"path\",\n \"name\": \"bg_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/bg_id\"\n }\n }\n ],\n \"path\": \"/billing_groups/{bg_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"billing_group_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Billing Groups\"\n ]\n },\n \"billing_group_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Updates all editable attributes of the billing_group with the given id.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"billing_group_update\",\n \"parameters\": [\n {\n \"description\": \"id of the billing_group\",\n \"in\": \"path\",\n \"name\": \"bg_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/bg_id\"\n }\n }\n ],\n \"path\": \"/billing_groups/{bg_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/billing_group_base\"\n },\n \"security\": null,\n \"skill_name\": \"billing_group_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Billing Groups\"\n ]\n },\n \"billing_groups_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your billing_groups. The billing_groups are returned sorted by creation date, with the most recently created billing_groups appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"billing_groups_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"An integer that designates the offset at which to begin returning results. Defaults to 0.\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by date modified. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_modified\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `date_modified`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"date_modified\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"date_modified\"\n ]\n }\n ]\n }\n ]\n }\n }\n ],\n \"path\": \"/billing_groups\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"billing_groups_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Billing Groups\"\n ]\n },\n \"booklet_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new booklet.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"booklet_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/booklets\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/booklet_editable\"\n },\n \"security\": null,\n \"skill_name\": \"booklet_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Booklets\"\n ]\n },\n \"booklet_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a booklet from production. This can only be done if the booklet's `send_date` has not yet passed. If the booklet is successfully canceled, you will not be charged for it.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"booklet_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the booklet\",\n \"in\": \"path\",\n \"name\": \"booklet_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/booklet_id\"\n }\n }\n ],\n \"path\": \"/booklets/{booklet_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"booklet_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Booklets\"\n ]\n },\n \"booklet_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing booklet. You need to only supply the unique booklet identifier that was returned upon booklet creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"booklet_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the booklet\",\n \"in\": \"path\",\n \"name\": \"booklet_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/booklet_id\"\n }\n }\n ],\n \"path\": \"/booklets/{booklet_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"booklet_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Booklets\"\n ]\n },\n \"booklets_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your booklets. The booklets are returned sorted by creation date, with the most recently created booklets appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"booklets_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n }\n ],\n \"path\": \"/booklets\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"booklets_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Booklets\"\n ]\n },\n \"buckslip_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new buckslip given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"buckslip_create\",\n \"parameters\": [],\n \"path\": \"/buckslips\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/buckslip_editable\"\n },\n \"security\": null,\n \"skill_name\": \"buckslip_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Buckslips\"\n ]\n },\n \"buckslip_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an existing buckslip. You need only supply the unique identifier that was returned upon buckslip creation.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"buckslip_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the buckslip\",\n \"in\": \"path\",\n \"name\": \"buckslip_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/buckslip_id\"\n }\n }\n ],\n \"path\": \"/buckslips/{buckslip_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"buckslip_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Buckslips\"\n ]\n },\n \"buckslip_order_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new buckslip order given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"buckslip_order_create\",\n \"parameters\": [\n {\n \"description\": \"The ID of the buckslip to which the buckslip orders belong.\",\n \"in\": \"path\",\n \"name\": \"buckslip_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/buckslip_id\"\n }\n }\n ],\n \"path\": \"/buckslips/{buckslip_id}/orders\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/buckslip_order_editable\"\n },\n \"security\": null,\n \"skill_name\": \"buckslip_order_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Buckslip Orders\"\n ]\n },\n \"buckslip_orders_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the buckslip orders associated with the given buckslip id.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"buckslip_orders_retrieve\",\n \"parameters\": [\n {\n \"description\": \"The ID of the buckslip to which the buckslip orders belong.\",\n \"in\": \"path\",\n \"name\": \"buckslip_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/buckslip_id\"\n }\n },\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"An integer that designates the offset at which to begin returning results. Defaults to 0.\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/buckslips/{buckslip_id}/orders\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"buckslip_orders_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Buckslip Orders\"\n ]\n },\n \"buckslip_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing buckslip. You need only supply the unique customer identifier that was returned upon buckslip creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"buckslip_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the buckslip\",\n \"in\": \"path\",\n \"name\": \"buckslip_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/buckslip_id\"\n }\n }\n ],\n \"path\": \"/buckslips/{buckslip_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"buckslip_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Buckslips\"\n ]\n },\n \"buckslip_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing buckslip. You need only supply the unique identifier that was returned upon buckslip creation.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"buckslip_update\",\n \"parameters\": [\n {\n \"description\": \"id of the buckslip\",\n \"in\": \"path\",\n \"name\": \"buckslip_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/buckslip_id\"\n }\n }\n ],\n \"path\": \"/buckslips/{buckslip_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/buckslip_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"buckslip_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Buckslips\"\n ]\n },\n \"buckslips_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your buckslips. The buckslips are returned sorted by creation date, with the most recently created buckslips appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"buckslips_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/buckslips\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"buckslips_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Buckslips\"\n ]\n },\n \"bulk_intl_verifications\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Verify a list of international (except US or US territories) address _with a live API key_. Requests to this endpoint with a test API key will return a dummy response based on the primary line you input.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"bulk_intl_verifications\",\n \"parameters\": [],\n \"path\": \"/bulk/intl_verifications\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/intl_verifications_payload\"\n },\n \"security\": null,\n \"skill_name\": \"bulk_intl_verifications\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Bulk Verify\",\n \"tags\": [\n \"Intl Verifications\"\n ]\n },\n \"bulk_us_verifications\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Verify a list of US or US territory addresses _with a live API key_. Requests to this endpoint with a test API key will return a dummy response based on the primary line you input.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"bulk_us_verifications\",\n \"parameters\": [\n {\n \"description\": \"Casing of the verified address. Possible values are `upper` and `proper` for uppercased (e.g. \\\"PO BOX\\\") and proper-cased (e.g. \\\"PO Box\\\"), respectively. Only affects `recipient`, `primary_line`, `secondary_line`, `urbanization`, and `last_line`. Default casing is `upper`.\",\n \"in\": \"query\",\n \"name\": \"case\",\n \"required\": false,\n \"schema\": {\n \"default\": \"upper\",\n \"enum\": [\n \"upper\",\n \"proper\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/bulk/us_verifications\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/multiple_components_list\"\n },\n \"security\": null,\n \"skill_name\": \"bulk_us_verifications\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Bulk Verify\",\n \"tags\": [\n \"US Verifications\"\n ]\n },\n \"campaign_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new campaign with the provided properties. See how to launch your first campaign [here](https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/launch-your-first-campaign).\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"campaign_create\",\n \"parameters\": [\n {\n \"description\": \"* `native` - Translate response to the native language of the country in the request\\n* `match` - match the response to the language in the request\\n\\nDefault response is in English.\\n\",\n \"in\": \"header\",\n \"name\": \"x-lang-output\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"native\",\n \"match\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/campaigns\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/campaign_writable\"\n },\n \"security\": null,\n \"skill_name\": \"campaign_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"campaign_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an existing campaign. You need only supply the unique identifier that was returned upon campaign creation. Deleting a campaign also deletes any associated mail pieces that have been created but not sent. A campaign's `send_date` matches its associated mail pieces' `send_date`s.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"campaign_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the campaign\",\n \"in\": \"path\",\n \"name\": \"cmp_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/cmp_id\"\n }\n }\n ],\n \"path\": \"/campaigns/{cmp_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"campaign_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"campaign_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing campaign. You need only supply the unique campaign identifier that was returned upon campaign creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"campaign_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the campaign\",\n \"in\": \"path\",\n \"name\": \"cmp_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/cmp_id\"\n }\n }\n ],\n \"path\": \"/campaigns/{cmp_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"campaign_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"campaign_send\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Sends a campaign. You need only supply the unique campaign identifier that was returned upon campaign creation.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"campaign_send\",\n \"parameters\": [\n {\n \"description\": \"id of the campaign\",\n \"in\": \"path\",\n \"name\": \"cmp_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/cmp_id\"\n }\n }\n ],\n \"path\": \"/campaigns/{cmp_id}/send\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"campaign_send\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Send Campaign\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"campaign_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing campaign. You need only supply the unique identifier that was returned upon campaign creation.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"campaign_update\",\n \"parameters\": [\n {\n \"description\": \"id of the campaign\",\n \"in\": \"path\",\n \"name\": \"cmp_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/cmp_id\"\n }\n }\n ],\n \"path\": \"/campaigns/{cmp_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/campaign_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"campaign_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"campaigns_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your campaigns. The campaigns are returned sorted by creation date, with the most recently created campaigns appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"campaigns_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n }\n ],\n \"path\": \"/campaigns\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"campaigns_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Campaigns\"\n ]\n },\n \"card_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new card given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"card_create\",\n \"parameters\": [],\n \"path\": \"/cards\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/card_editable\"\n },\n \"security\": null,\n \"skill_name\": \"card_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Cards\"\n ]\n },\n \"card_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an existing card. You need only supply the unique identifier that was returned upon card creation.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"card_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the card\",\n \"in\": \"path\",\n \"name\": \"card_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/card_id\"\n }\n }\n ],\n \"path\": \"/cards/{card_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"card_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Cards\"\n ]\n },\n \"card_order_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new card order given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"card_order_create\",\n \"parameters\": [\n {\n \"description\": \"The ID of the card to which the card orders belong.\",\n \"in\": \"path\",\n \"name\": \"card_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/card_id\"\n }\n }\n ],\n \"path\": \"/cards/{card_id}/orders\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/card_order_editable\"\n },\n \"security\": null,\n \"skill_name\": \"card_order_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Card Orders\"\n ]\n },\n \"card_orders_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the card orders associated with the given card id.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"card_orders_retrieve\",\n \"parameters\": [\n {\n \"description\": \"The ID of the card to which the card orders belong.\",\n \"in\": \"path\",\n \"name\": \"card_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/card_id\"\n }\n },\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"An integer that designates the offset at which to begin returning results. Defaults to 0.\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/cards/{card_id}/orders\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"card_orders_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Card Orders\"\n ]\n },\n \"card_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing card. You need only supply the unique customer identifier that was returned upon card creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"card_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the card\",\n \"in\": \"path\",\n \"name\": \"card_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/card_id\"\n }\n }\n ],\n \"path\": \"/cards/{card_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"card_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Cards\"\n ]\n },\n \"card_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing card. You need only supply the unique identifier that was returned upon card creation.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"card_update\",\n \"parameters\": [\n {\n \"description\": \"id of the card\",\n \"in\": \"path\",\n \"name\": \"card_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/card_id\"\n }\n }\n ],\n \"path\": \"/cards/{card_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/card_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"card_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Cards\"\n ]\n },\n \"cards_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your cards. The cards are returned sorted by creation date, with the most recently created addresses appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"cards_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/cards\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"cards_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Cards\"\n ]\n },\n \"check_cancel\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a check from production. This can only be done if the check has a `send_date` and the `send_date` has not yet passed. If the check is successfully canceled, you will not be charged for it. Read more on [cancellation windows](#section/Cancellation-Windows) and [scheduling](#section/Scheduled-Mailings). Scheduling and cancellation is a premium feature. Upgrade to the appropriate <a href=\\\"https://dashboard.lob.com/#/settings/editions\\\" target=\\\"_blank\\\">Print & Mail Edition</a> to gain access.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"check_cancel\",\n \"parameters\": [\n {\n \"description\": \"id of the check\",\n \"in\": \"path\",\n \"name\": \"chk_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/chk_id\"\n }\n }\n ],\n \"path\": \"/checks/{chk_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"check_cancel\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Cancel\",\n \"tags\": [\n \"Checks\"\n ]\n },\n \"check_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new check with the provided properties.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"check_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/checks\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/check_editable\"\n },\n \"security\": null,\n \"skill_name\": \"check_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Checks\"\n ]\n },\n \"check_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing check. You need only supply the unique check identifier that was returned upon check creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"check_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the check\",\n \"in\": \"path\",\n \"name\": \"chk_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/chk_id\"\n }\n }\n ],\n \"path\": \"/checks/{chk_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"check_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Checks\"\n ]\n },\n \"checks_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your checks. The checks are returned sorted by creation date, with the most recently created checks appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"checks_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"* `true` - only return orders (past or future) where `send_date` is\\ngreater than `date_created`\\n* `false` - only return orders where `send_date` is equal to `date_created`\\n\",\n \"in\": \"query\",\n \"name\": \"scheduled\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n }\n ],\n \"path\": \"/checks\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"checks_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Checks\"\n ]\n },\n \"create_template\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new template for use with the Print & Mail API. In Live mode, you can only have as many non-deleted templates as allotted in your current <a href=\\\"https://dashboard.lob.com/#/settings/editions\\\" target=\\\"_blank\\\">Print & Mail Edition</a>. If you attempt to create a template past your limit, you will receive a `403` error. There is no limit in Test mode.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_template\",\n \"parameters\": [],\n \"path\": \"/templates\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/template_writable\"\n },\n \"security\": null,\n \"skill_name\": \"create_template\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"create_template_version\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new template version attached to the specified template.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"create_template_version\",\n \"parameters\": [\n {\n \"description\": \"The ID of the template the new version will be attached to\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}/versions\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/template_version_writable\"\n },\n \"security\": null,\n \"skill_name\": \"create_template_version\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Template Versions\"\n ]\n },\n \"creative_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new creative with the provided properties\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"creative_create\",\n \"parameters\": [\n {\n \"description\": \"* `native` - Translate response to the native language of the country in the request\\n* `match` - match the response to the language in the request\\n\\nDefault response is in English.\\n\",\n \"in\": \"header\",\n \"name\": \"x-lang-output\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"native\",\n \"match\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/creatives\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/creative_writable\"\n },\n \"security\": null,\n \"skill_name\": \"creative_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Creatives\"\n ]\n },\n \"creative_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing creative. You need only supply the unique creative identifier that was returned upon creative creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"creative_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the creative\",\n \"in\": \"path\",\n \"name\": \"crv_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/crv_id\"\n }\n }\n ],\n \"path\": \"/creatives/{crv_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"creative_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Creatives\"\n ]\n },\n \"creative_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing creative. You need only supply the unique identifier that was returned upon creative creation.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"creative_update\",\n \"parameters\": [\n {\n \"description\": \"id of the creative\",\n \"in\": \"path\",\n \"name\": \"crv_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/crv_id\"\n }\n }\n ],\n \"path\": \"/creatives/{crv_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/creative_base\"\n },\n \"security\": null,\n \"skill_name\": \"creative_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Creatives\"\n ]\n },\n \"domain_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Add a new custom domain that can be used to create custom links.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"domain_create\",\n \"parameters\": [],\n \"path\": \"/domains\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/domains\"\n },\n \"security\": null,\n \"skill_name\": \"domain_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create Domain\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"domain_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete a registered domain. This operation can only be performed if all associated links with the domain are deleted.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"domain_delete\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier for a 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\": \"domain_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete a Domain\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"domain_get\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve details for a single domain.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"domain_get\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier for a 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\": \"domain_get\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve a domain\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"domain_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieve a list of all created domains.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"domain_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Filter domains by their configuration status.\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"configured\",\n \"not_configured\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/domains\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"domain_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List all domains\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"export_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing export. You need only supply the unique export identifier that was returned upon export creation. If you try retrieving an export immediately after creating one (i.e., before we're done processing the export), you will get back an export object with `state = in_progress`.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"export_retrieve\",\n \"parameters\": [\n {\n \"description\": \"ID of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n },\n {\n \"description\": \"ID of the export\",\n \"in\": \"path\",\n \"name\": \"ex_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/ex_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}/exports/{ex_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"export_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve Export\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"get_lob_credits_balance\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns the account's current balance of Lob Credits.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"get_lob_credits_balance\",\n \"parameters\": [],\n \"path\": \"/accounts\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"get_lob_credits_balance\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Get Lob Credits Balance\",\n \"tags\": [\n \"Accounts\",\n \"Lob Credits\"\n ]\n },\n \"identity_validation\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Validates whether a given name is associated with an address.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"identity_validation\",\n \"parameters\": [],\n \"path\": \"/identity_validation\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/identity_validation_writable\"\n },\n \"security\": null,\n \"skill_name\": \"identity_validation\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Identity Validation\",\n \"tags\": [\n \"Identity Validation\"\n ]\n },\n \"informed_delivery_campaign_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new Informed Delivery campaign\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"informed_delivery_campaign_create\",\n \"parameters\": [],\n \"path\": \"/informed_delivery_campaigns\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/create\"\n },\n \"security\": null,\n \"skill_name\": \"informed_delivery_campaign_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Informed Delivery Campaign\"\n ]\n },\n \"informed_delivery_campaign_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"List Informed Delivery campaigns\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"informed_delivery_campaign_list\",\n \"parameters\": [],\n \"path\": \"/informed_delivery_campaigns\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"informed_delivery_campaign_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Informed Delivery Campaign\"\n ]\n },\n \"informed_delivery_campaign_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing Informed Delivery campaign. You need only supply the `usps_campaign_id` returned in the campaign creation request.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"informed_delivery_campaign_retrieve\",\n \"parameters\": [\n {\n \"description\": \"usps_campaign_id of the Informed Delivery campaign\",\n \"in\": \"path\",\n \"name\": \"usps_campaign_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/usps_campaign_id\"\n }\n }\n ],\n \"path\": \"/informed_delivery_campaigns/{usps_campaign_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"informed_delivery_campaign_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Informed Delivery Campaign\"\n ]\n },\n \"informed_delivery_campaign_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing Informed Delivery campaign.<br> **NOTE:** you can only update a campaign in the `pending_approval` status.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"informed_delivery_campaign_update\",\n \"parameters\": [\n {\n \"description\": \"usps_campaign_id of the Informed Delivery campaign\",\n \"in\": \"path\",\n \"name\": \"usps_campaign_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/usps_campaign_id\"\n }\n }\n ],\n \"path\": \"/informed_delivery_campaigns/{usps_campaign_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/update\"\n },\n \"security\": null,\n \"skill_name\": \"informed_delivery_campaign_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Informed Delivery Campaign\"\n ]\n },\n \"intl_verification\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Verify an international (except US or US territories) address _with a live API key_. Requests to this endpoint with a test API key will return a dummy response based on the primary line you input.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"intl_verification\",\n \"parameters\": [\n {\n \"description\": \"* `native` - Translate response to the native language of the country in the request\\n* `match` - match the response to the language in the request\\n\\nDefault response is in English.\\n\",\n \"in\": \"header\",\n \"name\": \"x-lang-output\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"native\",\n \"match\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/intl_verifications\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/intl_verification_writable\"\n },\n \"security\": null,\n \"skill_name\": \"intl_verification\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Single Verify\",\n \"tags\": [\n \"Intl Verifications\"\n ]\n },\n \"letter_cancel\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a letter from production. This can only be done if the letter has a `send_date` and the `send_date` has not yet passed. If the letter is successfully canceled, you will not be charged for it. Read more on [cancellation windows](#section/Cancellation-Windows) and [scheduling](#section/Scheduled-Mailings). Scheduling and cancellation is a premium feature. Upgrade to the appropriate <a href=\\\"https://dashboard.lob.com/#/settings/editions\\\" target=\\\"_blank\\\">Print & Mail Edition</a> to gain access.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"letter_cancel\",\n \"parameters\": [\n {\n \"description\": \"id of the letter\",\n \"in\": \"path\",\n \"name\": \"ltr_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/ltr_id\"\n }\n }\n ],\n \"path\": \"/letters/{ltr_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"letter_cancel\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Cancel\",\n \"tags\": [\n \"Letters\"\n ]\n },\n \"letter_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new letter given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"letter_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string representing the version of the API being used. Specifically for letters, if this header is set to `2024-01-01` and above, the `size` property is automatically included with the default value of `us_letter`. Refer to `size` for all possible values. For more information on versioning, refer to our [Versioning and Changelog](#tag/Versioning-and-Changelog) documentation.\\n\",\n \"in\": \"header\",\n \"name\": \"Lob-Version\",\n \"required\": false,\n \"schema\": {\n \"example\": \"2024-01-01\",\n \"pattern\": \"^[0-9]{4}-[0-9]{2}-[0-9]{2}$\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/letters\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/letter_editable\"\n },\n \"security\": null,\n \"skill_name\": \"letter_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Letters\"\n ]\n },\n \"letter_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing letter. You need only supply the unique letter identifier that was returned upon letter creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"letter_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the letter\",\n \"in\": \"path\",\n \"name\": \"ltr_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/ltr_id\"\n }\n }\n ],\n \"path\": \"/letters/{ltr_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"letter_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Letters\"\n ]\n },\n \"letters_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your letters. The letters are returned sorted by creation date, with the most recently created letters appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"letters_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n },\n {\n \"description\": \"Set to `true` to return only color letters. Set to `false` to return only black & white letters.\",\n \"in\": \"query\",\n \"name\": \"color\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"* `true` - only return orders (past or future) where `send_date` is\\ngreater than `date_created`\\n* `false` - only return orders where `send_date` is equal to `date_created`\\n\",\n \"in\": \"query\",\n \"name\": \"scheduled\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n }\n ],\n \"path\": \"/letters\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"letters_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Letters\"\n ]\n },\n \"link_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Given a long URL, shorten your URL either by using a custom domain or Lob's own short domain.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"link_create\",\n \"parameters\": [],\n \"path\": \"/links\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/link_single\"\n },\n \"security\": null,\n \"skill_name\": \"link_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create Link\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"link_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update any of the properties of a shortened link.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"link_update\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier for a link.\",\n \"in\": \"path\",\n \"name\": \"link_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/links/{link_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/link_update\"\n },\n \"security\": null,\n \"skill_name\": \"link_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update a Link\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"links_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete the shortened link.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"links_delete\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier for a link.\",\n \"in\": \"path\",\n \"name\": \"link_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/links/{link_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"links_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete Link\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"links_get\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves a single shortened link.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"links_get\",\n \"parameters\": [\n {\n \"description\": \"Unique identifier for a link.\",\n \"in\": \"path\",\n \"name\": \"link_id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/links/{link_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"links_get\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve a link\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"links_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves a list of shortened links. The list is sorted by creation date, with the most recently created appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"links_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"Filters links by the provided domain id.\",\n \"in\": \"query\",\n \"name\": \"domain_id\",\n \"required\": false,\n \"schema\": {\n \"pattern\": \"^(dom)_[a-zA-Z0-9]+$\",\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/links\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"links_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List all links\",\n \"tags\": [\n \"URL Shortener\"\n ]\n },\n \"postcard_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new postcard given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"postcard_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/postcards\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/postcard_editable\"\n },\n \"security\": null,\n \"skill_name\": \"postcard_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Postcards\"\n ]\n },\n \"postcard_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a postcard from production. This can only be done if the postcard has a `send_date` and the `send_date` has not yet passed. If the postcard is successfully canceled, you will not be charged for it. Read more on [cancellation windows](#section/Cancellation-Windows) and [scheduling](#section/Scheduled-Mailings). Scheduling and cancellation is a premium feature. Upgrade to the appropriate <a href=\\\"https://dashboard.lob.com/#/settings/editions\\\" target=\\\"_blank\\\">Print & Mail Edition</a> to gain access.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"postcard_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the postcard\",\n \"in\": \"path\",\n \"name\": \"psc_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/psc_id\"\n }\n }\n ],\n \"path\": \"/postcards/{psc_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"postcard_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Cancel\",\n \"tags\": [\n \"Postcards\"\n ]\n },\n \"postcard_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing postcard. You need only supply the unique customer identifier that was returned upon postcard creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"postcard_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the postcard\",\n \"in\": \"path\",\n \"name\": \"psc_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/psc_id\"\n }\n }\n ],\n \"path\": \"/postcards/{psc_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"postcard_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Postcards\"\n ]\n },\n \"postcards_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your postcards. The addresses are returned sorted by creation date, with the most recently created addresses appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"postcards_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n },\n {\n \"description\": \"Specifies the size of the postcard. Only `4x6` postcards can be sent to international destinations.\",\n \"in\": \"query\",\n \"name\": \"size\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/postcard_size\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"* `true` - only return orders (past or future) where `send_date` is\\ngreater than `date_created`\\n* `false` - only return orders where `send_date` is equal to `date_created`\\n\",\n \"in\": \"query\",\n \"name\": \"scheduled\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n }\n ],\n \"path\": \"/postcards\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"postcards_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Postcards\"\n ]\n },\n \"qr_codes_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your QR codes. The QR codes are returned sorted by scan date, with the most recently scanned QR codes appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"qr_codes_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"An integer that designates the offset at which to begin returning results. Defaults to 0.\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter list of responses to only include QR codes with at least one scan event.\",\n \"in\": \"query\",\n \"name\": \"scanned\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Filter by the resource ID.\",\n \"in\": \"query\",\n \"name\": \"resource_ids\",\n \"required\": false,\n \"schema\": {\n \"default\": [],\n \"maxItems\": 100,\n \"type\": \"array\"\n }\n }\n ],\n \"path\": \"/qr_code_analytics\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"qr_codes_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"QR Codes\"\n ]\n },\n \"report_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the line item data for each row from the csv file associated with the upload id record. NOTE: This endpoint is currently feature flagged. Please reach out to Lob's support team if you would like access to this API endpoint.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"report_retrieve\",\n \"parameters\": [\n {\n \"description\": \"ID of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n },\n {\n \"description\": \"The status of line items to filter and retrieve. By default all line items are returned.\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"Validated\",\n \"Failed\",\n \"Processing\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 100,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"An integer that designates the offset at which to begin returning results. Defaults to 0.\",\n \"in\": \"query\",\n \"name\": \"offset\",\n \"required\": false,\n \"schema\": {\n \"default\": 0,\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}/report\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"report_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve Line Item Report\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"resource_proof_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new resource proof with the provided properties.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"resource_proof_create\",\n \"parameters\": [],\n \"path\": \"/resource_proofs\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/resource_proof_editable\"\n },\n \"security\": null,\n \"skill_name\": \"resource_proof_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Resource Proofs\"\n ]\n },\n \"resource_proof_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing resource proof. You need only supply the unique resource proof identifier.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"resource_proof_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the resource proof\",\n \"in\": \"path\",\n \"name\": \"res_prf_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/res_prf_id\"\n }\n }\n ],\n \"path\": \"/resource_proofs/{res_prf_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"resource_proof_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Resource Proofs\"\n ]\n },\n \"resource_proof_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Updates the specified resource proof.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"resource_proof_update\",\n \"parameters\": [\n {\n \"description\": \"id of the resource proof\",\n \"in\": \"path\",\n \"name\": \"res_prf_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/res_prf_id\"\n }\n }\n ],\n \"path\": \"/resource_proofs/{res_prf_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/resource_proof_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"resource_proof_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Resource Proofs\"\n ]\n },\n \"reverse_geocode_lookup\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Reverse geocode a valid US location with a live API key.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"reverse_geocode_lookup\",\n \"parameters\": [\n {\n \"description\": \"Determines the number of locations returned. Possible values are between 1 and 50 and any number higher will be rounded down to 50. Default size is a list of 5 reverse geocoded locations.\",\n \"in\": \"query\",\n \"name\": \"size\",\n \"required\": false,\n \"schema\": {\n \"default\": 5,\n \"example\": 5,\n \"maximum\": 50,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n }\n ],\n \"path\": \"/us_reverse_geocode_lookups\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/location\"\n },\n \"security\": null,\n \"skill_name\": \"reverse_geocode_lookup\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Reverse Geocode Lookup\",\n \"tags\": [\n \"Reverse Geocode Lookups\"\n ]\n },\n \"self_mailer_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new self_mailer given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"self_mailer_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/self_mailers\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/self_mailer_editable\"\n },\n \"security\": null,\n \"skill_name\": \"self_mailer_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Self Mailers\"\n ]\n },\n \"self_mailer_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a self mailer from production. This can only be done if the self mailer's `send_date` has not yet passed. If the self mailer is successfully canceled, you will not be charged for it. This feature is exclusive to certain customers. Upgrade to the appropriate <a href=\\\"https://dashboard.lob.com/#/settings/editions\\\" target=\\\"_blank\\\">Print & Mail Edition</a> to gain access.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"self_mailer_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the self_mailer\",\n \"in\": \"path\",\n \"name\": \"sfm_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/sfm_id\"\n }\n }\n ],\n \"path\": \"/self_mailers/{sfm_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"self_mailer_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Self Mailers\"\n ]\n },\n \"self_mailer_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing self_mailer. You need only supply the unique self_mailer identifier that was returned upon self_mailer creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"self_mailer_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the self_mailer\",\n \"in\": \"path\",\n \"name\": \"sfm_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/sfm_id\"\n }\n }\n ],\n \"path\": \"/self_mailers/{sfm_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"self_mailer_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Self Mailers\"\n ]\n },\n \"self_mailers_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your self_mailers. The self_mailers are returned sorted by creation date, with the most recently created self_mailers appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"self_mailers_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"The self mailer sizes to be returned.\",\n \"in\": \"query\",\n \"name\": \"size\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/self_mailer_size\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"* `true` - only return orders (past or future) where `send_date` is\\ngreater than `date_created`\\n* `false` - only return orders where `send_date` is equal to `date_created`\\n\",\n \"in\": \"query\",\n \"name\": \"scheduled\",\n \"required\": false,\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n }\n ],\n \"path\": \"/self_mailers\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"self_mailers_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Self Mailers\"\n ]\n },\n \"snap_pack_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new snap_pack given information\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"snap_pack_create\",\n \"parameters\": [\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"header\",\n \"name\": \"Idempotency-Key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n },\n {\n \"description\": \"A string of no longer than 256 characters that uniquely identifies this resource. For more help integrating idempotency keys, refer to our <a href=\\\"https://help.lob.com/print-and-mail/building-a-mail-strategy/managing-mail-settings#idempotent-requests-12\\\" target=\\\"_blank\\\">implementation guide</a>.\\n\",\n \"in\": \"query\",\n \"name\": \"idempotency_key\",\n \"required\": false,\n \"schema\": {\n \"example\": \"026e7634-24d7-486c-a0bb-4a17fd0eebc5\",\n \"maxLength\": 256,\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/snap_packs\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/snap_pack_editable\"\n },\n \"security\": null,\n \"skill_name\": \"snap_pack_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Snap Packs\"\n ]\n },\n \"snap_pack_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Completely removes a snap pack from production. This can only be done if the snap pack's `send_date` has not yet passed. If the snap pack is successfully canceled, you will not be charged for it.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"snap_pack_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the snap_pack\",\n \"in\": \"path\",\n \"name\": \"snap_pack_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/snap_pack_id\"\n }\n }\n ],\n \"path\": \"/snap_packs/{snap_pack_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"snap_pack_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Snap Packs\"\n ]\n },\n \"snap_pack_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing snap_pack. You need to only supply the unique snap_pack identifier that was returned upon snap_pack creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"snap_pack_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the snap_pack\",\n \"in\": \"path\",\n \"name\": \"snap_pack_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/snap_pack_id\"\n }\n }\n ],\n \"path\": \"/snap_packs/{snap_pack_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"snap_pack_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Snap Packs\"\n ]\n },\n \"snap_packs_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your snap_packs. The snap_packs are returned sorted by creation date, with the most recently created snap_packs appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"snap_packs_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n },\n {\n \"description\": \"Filter by ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\\n\",\n \"in\": \"query\",\n \"name\": \"send_date\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/send_date\"\n }\n },\n {\n \"description\": \"A string designating the mail postage type: * `usps_first_class` - (default) * `usps_standard` - a <a href=\\\"https://lob.com/pricing/print-mail#compare\\\" target=\\\"_blank\\\">cheaper option</a> which is less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6` postcards or for any postcards sent outside of the United States.\\n\",\n \"in\": \"query\",\n \"name\": \"mail_type\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/mail_type\"\n }\n },\n {\n \"description\": \"Sorts items by ascending or descending dates. Use either `date_created` or `send_date`, not both.\\n\",\n \"in\": \"query\",\n \"name\": \"sort_by\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"date_created\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n },\n \"send_date\": {\n \"enum\": [\n \"asc\",\n \"desc\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"date_created\"\n ]\n },\n {\n \"required\": [\n \"send_date\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Filters resources created by the provided campaign id, prefixed with `cmp_`. In the case of snap packs, booklets, and letters with size `us_legal`, however, the campaign id is prefixed with `camp_` instead of `cmp_`.\",\n \"in\": \"query\",\n \"name\": \"campaign_id\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/campaign_id\"\n }\n },\n {\n \"description\": \"A string describing the render status:\\n* `processed` - the rendering process is currently underway.\\n* `rendered` - the rendering process has completed successfully.\\n* `failed` - the rendering process has failed.\\n\",\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/status\"\n }\n }\n ],\n \"path\": \"/snap_packs\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"snap_packs_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Snap Packs\"\n ]\n },\n \"template_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Permanently deletes a template. Deleting a template also deletes its associated versions. Deleted templates can not be used to create postcard, letter, or check resources.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"template_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the template\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"template_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"template_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing template. You need only supply the unique template identifier that was returned upon template creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"template_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the template\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"template_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"template_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Updates the description and/or published version of the template with the given id. To update the template's html, create a new version of the template.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"template_update\",\n \"parameters\": [\n {\n \"description\": \"id of the template\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/template_update\"\n },\n \"security\": null,\n \"skill_name\": \"template_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"template_version_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Permanently deletes a template version. A template's `published_version` can not be deleted.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"template_version_delete\",\n \"parameters\": [\n {\n \"description\": \"The ID of the template to which the version belongs.\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n },\n {\n \"description\": \"id of the template_version\",\n \"in\": \"path\",\n \"name\": \"vrsn_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/vrsn_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}/versions/{vrsn_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"template_version_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Template Versions\"\n ]\n },\n \"template_version_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the template version with the given template and version ids.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"template_version_retrieve\",\n \"parameters\": [\n {\n \"description\": \"The ID of the template to which the version belongs.\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n },\n {\n \"description\": \"id of the template_version\",\n \"in\": \"path\",\n \"name\": \"vrsn_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/vrsn_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}/versions/{vrsn_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"template_version_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Template Versions\"\n ]\n },\n \"template_version_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Updates the template version with the given template and version ids.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"template_version_update\",\n \"parameters\": [\n {\n \"description\": \"The ID of the template to which the version belongs.\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n },\n {\n \"description\": \"id of the template_version\",\n \"in\": \"path\",\n \"name\": \"vrsn_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/vrsn_id\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}/versions/{vrsn_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/template_version_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"template_version_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Template Versions\"\n ]\n },\n \"template_versions_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of template versions for the given template ID. The template versions are sorted by creation date, with the most recently created appearing first.\\n\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"template_versions_list\",\n \"parameters\": [\n {\n \"description\": \"The ID of the template associated with the retrieved versions\",\n \"in\": \"path\",\n \"name\": \"tmpl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/tmpl_id\"\n }\n },\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n }\n ],\n \"path\": \"/templates/{tmpl_id}/versions\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"template_versions_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Template Versions\"\n ]\n },\n \"templates_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your templates. The templates are returned sorted by creation date, with the most recently created templates appearing first.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"templates_list\",\n \"parameters\": [\n {\n \"description\": \"How many results to return.\",\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"default\": 10,\n \"example\": 10,\n \"maximum\": 100,\n \"minimum\": 1,\n \"type\": \"integer\"\n }\n },\n {\n \"description\": \"`before` and `after` are both optional but only one of them can be in the query at a time.\\n\",\n \"in\": \"query\",\n \"name\": \"before/after\",\n \"required\": false,\n \"schema\": {\n \"allOf\": [\n {\n \"properties\": {\n \"after\": {\n \"description\": \"A reference to a list entry used for paginating to the next set of entries. This field is pre-populated in the `next_url` field in the return response.\\n\",\n \"type\": \"string\"\n },\n \"before\": {\n \"description\": \"A reference to a list entry used for paginating to the previous set of entries. This field is pre-populated in the `previous_url` field in the return response.\\n\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n {\n \"oneOf\": [\n {\n \"required\": [\n \"before\"\n ]\n },\n {\n \"required\": [\n \"after\"\n ]\n }\n ]\n }\n ]\n }\n },\n {\n \"description\": \"Request that the response include the total count by specifying `include=[\\\"total_count\\\"]`.\\n\",\n \"in\": \"query\",\n \"name\": \"include\",\n \"required\": false,\n \"schema\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n {\n \"description\": \"Filter by date created. Accepted formats are ISO-8601 date or datetime, e.g. `{ \\\"gt\\\": \\\"2012-01-01\\\", \\\"lt\\\": \\\"2012-01-31T12:34:56Z\\\" }` where `gt` is >, `lt` is <, `gte` is \\u2265, and `lte` is \\u2264.\",\n \"in\": \"query\",\n \"name\": \"date_created\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/date_filter\"\n }\n },\n {\n \"description\": \"Filter by metadata key-value pair`.\",\n \"in\": \"query\",\n \"name\": \"metadata\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/metadata\"\n }\n }\n ],\n \"path\": \"/templates\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"templates_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Templates\"\n ]\n },\n \"upload_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Creates a new upload with the provided properties.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"upload_create\",\n \"parameters\": [],\n \"path\": \"/uploads\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/upload_writable\"\n },\n \"security\": null,\n \"skill_name\": \"upload_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"upload_delete\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Delete an existing upload. You need only supply the unique identifier that was returned upon upload creation.\",\n \"destructive\": true,\n \"method\": \"DELETE\",\n \"operation_id\": \"upload_delete\",\n \"parameters\": [\n {\n \"description\": \"id of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"upload_delete\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Delete\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"upload_export_create\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Campaign Exports can help you understand exactly which records in a campaign could not be created. By initiating and retrieving an export, you will get row-by-row errors for your campaign. For a step-by-step walkthrough of creating a campaign and exporting failures, see our [Campaigns Guide](https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/launch-your-first-campaign).\\n\\nCreate an export file associated with an upload.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"upload_export_create\",\n \"parameters\": [\n {\n \"description\": \"ID of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}/exports\",\n \"request_body\": {\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"all\",\n \"failures\",\n \"successes\"\n ],\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": null,\n \"skill_name\": \"upload_export_create\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Create Export\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"upload_file\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Upload an [audience file](https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/campaign-audience-guide) and associate it with an upload.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"upload_file\",\n \"parameters\": [\n {\n \"description\": \"ID of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}/file\",\n \"request_body\": {\n \"properties\": {\n \"file\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"type\": \"object\"\n },\n \"security\": null,\n \"skill_name\": \"upload_file\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Upload file\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"upload_retrieve\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Retrieves the details of an existing upload. You need only supply the unique upload identifier that was returned upon upload creation.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"upload_retrieve\",\n \"parameters\": [\n {\n \"description\": \"id of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"upload_retrieve\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Retrieve\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"upload_update\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Update the details of an existing upload. You need only supply the unique identifier that was returned upon upload creation.\",\n \"destructive\": true,\n \"method\": \"PATCH\",\n \"operation_id\": \"upload_update\",\n \"parameters\": [\n {\n \"description\": \"id of the upload\",\n \"in\": \"path\",\n \"name\": \"upl_id\",\n \"required\": true,\n \"schema\": {\n \"$ref\": \"#/components/schemas/upl_id\"\n }\n }\n ],\n \"path\": \"/uploads/{upl_id}\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/upload_updatable\"\n },\n \"security\": null,\n \"skill_name\": \"upload_update\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Update\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"uploads_list\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns a list of your uploads. Optionally, filter uploads by campaign.\",\n \"destructive\": false,\n \"method\": \"GET\",\n \"operation_id\": \"uploads_list\",\n \"parameters\": [\n {\n \"description\": \"id of the campaign\",\n \"in\": \"query\",\n \"name\": \"campaignId\",\n \"required\": false,\n \"schema\": {\n \"$ref\": \"#/components/schemas/cmp_id\"\n }\n }\n ],\n \"path\": \"/uploads\",\n \"request_body\": null,\n \"security\": null,\n \"skill_name\": \"uploads_list\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"List\",\n \"tags\": [\n \"Uploads\"\n ]\n },\n \"us_verification\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Verify a US or US territory address _with a live API key_. The address can be in components (e.g. `primary_line` is \\\"210 King Street\\\", `zip_code` is \\\"94107\\\") or as a single string (e.g. \\\"210 King Street 94107\\\"), but not as both. Requests using a test API key validate required fields but return empty values unless specific `primary_line` values are provided. See the [US Verifications Test Environment](#section/US-Verifications-Test-Env) for details.\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"us_verification\",\n \"parameters\": [\n {\n \"description\": \"Casing of the verified address. Possible values are `upper` and `proper` for uppercased (e.g. \\\"PO BOX\\\") and proper-cased (e.g. \\\"PO Box\\\"), respectively. Only affects `recipient`, `primary_line`, `secondary_line`, `urbanization`, and `last_line`. Default casing is `upper`.\",\n \"in\": \"query\",\n \"name\": \"case\",\n \"required\": false,\n \"schema\": {\n \"default\": \"upper\",\n \"enum\": [\n \"upper\",\n \"proper\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"path\": \"/us_verifications\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/us_verifications_writable\"\n },\n \"security\": null,\n \"skill_name\": \"us_verification\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Single Verify\",\n \"tags\": [\n \"US Verifications\"\n ]\n },\n \"zip_lookup\": {\n \"base_url\": \"https://api.lob.com/v1\",\n \"base_url_field\": \"OPENAPI_BASE_URL\",\n \"description\": \"Returns information about a ZIP code\",\n \"destructive\": true,\n \"method\": \"POST\",\n \"operation_id\": \"zip_lookup\",\n \"parameters\": [],\n \"path\": \"/us_zip_lookups\",\n \"request_body\": {\n \"$ref\": \"#/components/schemas/zip5\"\n },\n \"security\": null,\n \"skill_name\": \"zip_lookup\",\n \"source_index\": 1,\n \"source_openapi_url\": \"https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml\",\n \"source_title\": \"Lob\",\n \"summary\": \"Lookups\",\n \"tags\": [\n \"Zip Lookups\"\n ]\n }\n}")
|
|
OPERATION_GROUPS = json.loads("[\n {\n \"common_prefix\": \"/accounts\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /accounts for the accounts route group.\",\n \"id\": \"accounts\",\n \"label\": \"accounts\",\n \"operation_ids\": [\n \"get_lob_credits_balance\"\n ],\n \"skill_dir\": \"accounts\",\n \"skill_name\": \"accounts-routes\",\n \"skill_path\": \"skills/accounts/SKILL.md\",\n \"subagent_name\": \"accounts-api\"\n },\n {\n \"common_prefix\": \"/addresses\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /addresses for the addresses route group.\",\n \"id\": \"addresses\",\n \"label\": \"addresses\",\n \"operation_ids\": [\n \"addresses_list\",\n \"address_create\",\n \"address_retrieve\",\n \"address_delete\"\n ],\n \"skill_dir\": \"addresses\",\n \"skill_name\": \"addresses-routes\",\n \"skill_path\": \"skills/addresses/SKILL.md\",\n \"subagent_name\": \"addresses-api\"\n },\n {\n \"common_prefix\": \"/bank_accounts\",\n \"description\": \"Handle 5 OpenAPI operation(s) under /bank_accounts for the bank accounts route group.\",\n \"id\": \"bank_accounts\",\n \"label\": \"bank accounts\",\n \"operation_ids\": [\n \"bank_account_verify\",\n \"bank_account_retrieve\",\n \"bank_account_delete\",\n \"bank_accounts_list\",\n \"bank_account_create\"\n ],\n \"skill_dir\": \"bank-accounts\",\n \"skill_name\": \"bank-accounts-routes\",\n \"skill_path\": \"skills/bank-accounts/SKILL.md\",\n \"subagent_name\": \"bank-accounts-api\"\n },\n {\n \"common_prefix\": \"/billing_groups\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /billing_groups for the billing groups route group.\",\n \"id\": \"billing_groups\",\n \"label\": \"billing groups\",\n \"operation_ids\": [\n \"billing_group_retrieve\",\n \"billing_group_update\",\n \"billing_groups_list\",\n \"billing_group_create\"\n ],\n \"skill_dir\": \"billing-groups\",\n \"skill_name\": \"billing-groups-routes\",\n \"skill_path\": \"skills/billing-groups/SKILL.md\",\n \"subagent_name\": \"billing-groups-api\"\n },\n {\n \"common_prefix\": \"/booklets\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /booklets for the booklets route group.\",\n \"id\": \"booklets\",\n \"label\": \"booklets\",\n \"operation_ids\": [\n \"booklet_retrieve\",\n \"booklet_delete\",\n \"booklets_list\",\n \"booklet_create\"\n ],\n \"skill_dir\": \"booklets\",\n \"skill_name\": \"booklets-routes\",\n \"skill_path\": \"skills/booklets/SKILL.md\",\n \"subagent_name\": \"booklets-api\"\n },\n {\n \"common_prefix\": \"/buckslips\",\n \"description\": \"Handle 7 OpenAPI operation(s) under /buckslips for the buckslips route group.\",\n \"id\": \"buckslips\",\n \"label\": \"buckslips\",\n \"operation_ids\": [\n \"buckslips_list\",\n \"buckslip_create\",\n \"buckslip_retrieve\",\n \"buckslip_update\",\n \"buckslip_delete\",\n \"buckslip_orders_retrieve\",\n \"buckslip_order_create\"\n ],\n \"skill_dir\": \"buckslips\",\n \"skill_name\": \"buckslips-routes\",\n \"skill_path\": \"skills/buckslips/SKILL.md\",\n \"subagent_name\": \"buckslips-api\"\n },\n {\n \"common_prefix\": \"/bulk\",\n \"description\": \"Handle 2 OpenAPI operation(s) under /bulk for the bulk route group.\",\n \"id\": \"bulk\",\n \"label\": \"bulk\",\n \"operation_ids\": [\n \"bulk_us_verifications\",\n \"bulk_intl_verifications\"\n ],\n \"skill_dir\": \"bulk\",\n \"skill_name\": \"bulk-routes\",\n \"skill_path\": \"skills/bulk/SKILL.md\",\n \"subagent_name\": \"bulk-api\"\n },\n {\n \"common_prefix\": \"/campaigns\",\n \"description\": \"Handle 6 OpenAPI operation(s) under /campaigns for the campaigns route group.\",\n \"id\": \"campaigns\",\n \"label\": \"campaigns\",\n \"operation_ids\": [\n \"campaigns_list\",\n \"campaign_create\",\n \"campaign_retrieve\",\n \"campaign_update\",\n \"campaign_delete\",\n \"campaign_send\"\n ],\n \"skill_dir\": \"campaigns\",\n \"skill_name\": \"campaigns-routes\",\n \"skill_path\": \"skills/campaigns/SKILL.md\",\n \"subagent_name\": \"campaigns-api\"\n },\n {\n \"common_prefix\": \"/cards\",\n \"description\": \"Handle 7 OpenAPI operation(s) under /cards for the cards route group.\",\n \"id\": \"cards\",\n \"label\": \"cards\",\n \"operation_ids\": [\n \"cards_list\",\n \"card_create\",\n \"card_retrieve\",\n \"card_update\",\n \"card_delete\",\n \"card_orders_retrieve\",\n \"card_order_create\"\n ],\n \"skill_dir\": \"cards\",\n \"skill_name\": \"cards-routes\",\n \"skill_path\": \"skills/cards/SKILL.md\",\n \"subagent_name\": \"cards-api\"\n },\n {\n \"common_prefix\": \"/checks\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /checks for the checks route group.\",\n \"id\": \"checks\",\n \"label\": \"checks\",\n \"operation_ids\": [\n \"checks_list\",\n \"check_create\",\n \"check_retrieve\",\n \"check_cancel\"\n ],\n \"skill_dir\": \"checks\",\n \"skill_name\": \"checks-routes\",\n \"skill_path\": \"skills/checks/SKILL.md\",\n \"subagent_name\": \"checks-api\"\n },\n {\n \"common_prefix\": \"/creatives\",\n \"description\": \"Handle 3 OpenAPI operation(s) under /creatives for the creatives route group.\",\n \"id\": \"creatives\",\n \"label\": \"creatives\",\n \"operation_ids\": [\n \"creative_create\",\n \"creative_retrieve\",\n \"creative_update\"\n ],\n \"skill_dir\": \"creatives\",\n \"skill_name\": \"creatives-routes\",\n \"skill_path\": \"skills/creatives/SKILL.md\",\n \"subagent_name\": \"creatives-api\"\n },\n {\n \"common_prefix\": \"/identity_validation\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /identity_validation for the identity validation route group.\",\n \"id\": \"identity_validation\",\n \"label\": \"identity validation\",\n \"operation_ids\": [\n \"identity_validation\"\n ],\n \"skill_dir\": \"identity-validation\",\n \"skill_name\": \"identity-validation-routes\",\n \"skill_path\": \"skills/identity-validation/SKILL.md\",\n \"subagent_name\": \"identity-validation-api\"\n },\n {\n \"common_prefix\": \"/informed_delivery_campaigns\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /informed_delivery_campaigns for the informed delivery campaigns route group.\",\n \"id\": \"informed_delivery_campaigns\",\n \"label\": \"informed delivery campaigns\",\n \"operation_ids\": [\n \"informed_delivery_campaign_list\",\n \"informed_delivery_campaign_create\",\n \"informed_delivery_campaign_retrieve\",\n \"informed_delivery_campaign_update\"\n ],\n \"skill_dir\": \"informed-delivery-campaigns\",\n \"skill_name\": \"informed-delivery-campaigns-routes\",\n \"skill_path\": \"skills/informed-delivery-campaigns/SKILL.md\",\n \"subagent_name\": \"informed-delivery-campaigns-api\"\n },\n {\n \"common_prefix\": \"/intl_verifications\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /intl_verifications for the intl verifications route group.\",\n \"id\": \"intl_verifications\",\n \"label\": \"intl verifications\",\n \"operation_ids\": [\n \"intl_verification\"\n ],\n \"skill_dir\": \"intl-verifications\",\n \"skill_name\": \"intl-verifications-routes\",\n \"skill_path\": \"skills/intl-verifications/SKILL.md\",\n \"subagent_name\": \"intl-verifications-api\"\n },\n {\n \"common_prefix\": \"/letters\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /letters for the letters route group.\",\n \"id\": \"letters\",\n \"label\": \"letters\",\n \"operation_ids\": [\n \"letter_retrieve\",\n \"letter_cancel\",\n \"letters_list\",\n \"letter_create\"\n ],\n \"skill_dir\": \"letters\",\n \"skill_name\": \"letters-routes\",\n \"skill_path\": \"skills/letters/SKILL.md\",\n \"subagent_name\": \"letters-api\"\n },\n {\n \"common_prefix\": \"/postcards\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /postcards for the postcards route group.\",\n \"id\": \"postcards\",\n \"label\": \"postcards\",\n \"operation_ids\": [\n \"postcard_retrieve\",\n \"postcard_delete\",\n \"postcards_list\",\n \"postcard_create\"\n ],\n \"skill_dir\": \"postcards\",\n \"skill_name\": \"postcards-routes\",\n \"skill_path\": \"skills/postcards/SKILL.md\",\n \"subagent_name\": \"postcards-api\"\n },\n {\n \"common_prefix\": \"/qr_code_analytics\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /qr_code_analytics for the qr code analytics route group.\",\n \"id\": \"qr_code_analytics\",\n \"label\": \"qr code analytics\",\n \"operation_ids\": [\n \"qr_codes_list\"\n ],\n \"skill_dir\": \"qr-code-analytics\",\n \"skill_name\": \"qr-code-analytics-routes\",\n \"skill_path\": \"skills/qr-code-analytics/SKILL.md\",\n \"subagent_name\": \"qr-code-analytics-api\"\n },\n {\n \"common_prefix\": \"/domains\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /domains for the domains route group.\",\n \"id\": \"domains\",\n \"label\": \"domains\",\n \"operation_ids\": [\n \"domain_get\",\n \"domain_delete\",\n \"domain_create\",\n \"domain_list\"\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\": \"/links\",\n \"description\": \"Handle 5 OpenAPI operation(s) under /links for the links route group.\",\n \"id\": \"links\",\n \"label\": \"links\",\n \"operation_ids\": [\n \"links_get\",\n \"link_update\",\n \"links_delete\",\n \"link_create\",\n \"links_list\"\n ],\n \"skill_dir\": \"links\",\n \"skill_name\": \"links-routes\",\n \"skill_path\": \"skills/links/SKILL.md\",\n \"subagent_name\": \"links-api\"\n },\n {\n \"common_prefix\": \"/resource_proofs\",\n \"description\": \"Handle 3 OpenAPI operation(s) under /resource_proofs for the resource proofs route group.\",\n \"id\": \"resource_proofs\",\n \"label\": \"resource proofs\",\n \"operation_ids\": [\n \"resource_proof_retrieve\",\n \"resource_proof_update\",\n \"resource_proof_create\"\n ],\n \"skill_dir\": \"resource-proofs\",\n \"skill_name\": \"resource-proofs-routes\",\n \"skill_path\": \"skills/resource-proofs/SKILL.md\",\n \"subagent_name\": \"resource-proofs-api\"\n },\n {\n \"common_prefix\": \"/self_mailers\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /self_mailers for the self mailers route group.\",\n \"id\": \"self_mailers\",\n \"label\": \"self mailers\",\n \"operation_ids\": [\n \"self_mailer_retrieve\",\n \"self_mailer_delete\",\n \"self_mailers_list\",\n \"self_mailer_create\"\n ],\n \"skill_dir\": \"self-mailers\",\n \"skill_name\": \"self-mailers-routes\",\n \"skill_path\": \"skills/self-mailers/SKILL.md\",\n \"subagent_name\": \"self-mailers-api\"\n },\n {\n \"common_prefix\": \"/snap_packs\",\n \"description\": \"Handle 4 OpenAPI operation(s) under /snap_packs for the snap packs route group.\",\n \"id\": \"snap_packs\",\n \"label\": \"snap packs\",\n \"operation_ids\": [\n \"snap_pack_retrieve\",\n \"snap_pack_delete\",\n \"snap_packs_list\",\n \"snap_pack_create\"\n ],\n \"skill_dir\": \"snap-packs\",\n \"skill_name\": \"snap-packs-routes\",\n \"skill_path\": \"skills/snap-packs/SKILL.md\",\n \"subagent_name\": \"snap-packs-api\"\n },\n {\n \"common_prefix\": \"/templates\",\n \"description\": \"Handle 10 OpenAPI operation(s) under /templates for the templates route group.\",\n \"id\": \"templates\",\n \"label\": \"templates\",\n \"operation_ids\": [\n \"template_version_retrieve\",\n \"template_version_update\",\n \"template_version_delete\",\n \"template_versions_list\",\n \"create_template_version\",\n \"template_retrieve\",\n \"template_update\",\n \"template_delete\",\n \"templates_list\",\n \"create_template\"\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\": \"/uploads\",\n \"description\": \"Handle 9 OpenAPI operation(s) under /uploads for the uploads route group.\",\n \"id\": \"uploads\",\n \"label\": \"uploads\",\n \"operation_ids\": [\n \"uploads_list\",\n \"upload_create\",\n \"upload_retrieve\",\n \"upload_update\",\n \"upload_delete\",\n \"upload_file\",\n \"upload_export_create\",\n \"report_retrieve\",\n \"export_retrieve\"\n ],\n \"skill_dir\": \"uploads\",\n \"skill_name\": \"uploads-routes\",\n \"skill_path\": \"skills/uploads/SKILL.md\",\n \"subagent_name\": \"uploads-api\"\n },\n {\n \"common_prefix\": \"/us_autocompletions\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /us_autocompletions for the us autocompletions route group.\",\n \"id\": \"us_autocompletions\",\n \"label\": \"us autocompletions\",\n \"operation_ids\": [\n \"autocompletion\"\n ],\n \"skill_dir\": \"us-autocompletions\",\n \"skill_name\": \"us-autocompletions-routes\",\n \"skill_path\": \"skills/us-autocompletions/SKILL.md\",\n \"subagent_name\": \"us-autocompletions-api\"\n },\n {\n \"common_prefix\": \"/us_reverse_geocode_lookups\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /us_reverse_geocode_lookups for the us reverse geocode lookups route group.\",\n \"id\": \"us_reverse_geocode_lookups\",\n \"label\": \"us reverse geocode lookups\",\n \"operation_ids\": [\n \"reverse_geocode_lookup\"\n ],\n \"skill_dir\": \"us-reverse-geocode-lookups\",\n \"skill_name\": \"us-reverse-geocode-lookups-routes\",\n \"skill_path\": \"skills/us-reverse-geocode-lookups/SKILL.md\",\n \"subagent_name\": \"us-reverse-geocode-lookups-api\"\n },\n {\n \"common_prefix\": \"/us_verifications\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /us_verifications for the us verifications route group.\",\n \"id\": \"us_verifications\",\n \"label\": \"us verifications\",\n \"operation_ids\": [\n \"us_verification\"\n ],\n \"skill_dir\": \"us-verifications\",\n \"skill_name\": \"us-verifications-routes\",\n \"skill_path\": \"skills/us-verifications/SKILL.md\",\n \"subagent_name\": \"us-verifications-api\"\n },\n {\n \"common_prefix\": \"/us_zip_lookups\",\n \"description\": \"Handle 1 OpenAPI operation(s) under /us_zip_lookups for the us zip lookups route group.\",\n \"id\": \"us_zip_lookups\",\n \"label\": \"us zip lookups\",\n \"operation_ids\": [\n \"zip_lookup\"\n ],\n \"skill_dir\": \"us-zip-lookups\",\n \"skill_name\": \"us-zip-lookups-routes\",\n \"skill_path\": \"skills/us-zip-lookups/SKILL.md\",\n \"subagent_name\": \"us-zip-lookups-api\"\n }\n]")
|
|
ROOT_SECURITY = json.loads("[\n {\n \"basicAuth\": []\n }\n]")
|
|
SECURITY_SCHEMES = json.loads("{\n \"basicAuth\": {\n \"scheme\": \"basic\",\n \"type\": \"http\"\n }\n}")
|
|
SECURITY_FIELDS = json.loads("{\n \"basicAuth\": {\n \"field\": \"BASICAUTH\",\n \"kind\": \"http\",\n \"scheme\": \"basic\"\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 LobOpenapiAgent(A2AAgent):
|
|
name = "lob-openapi-agent"
|
|
description = "Direct-mail and address-verification API for letters, postcards, checks, and print workflows."
|
|
version = "1.22.0"
|
|
consumer_setup = ConsumerSetup.from_fields(
|
|
ConsumerSetupField.config("OPENAPI_BASE_URL", label="API base URL", description="Override the default API server (https://api.lob.com/v1).", required=False, input_type="url"),
|
|
ConsumerSetupField.secret("BASICAUTH", label="basicAuth basic credential", description="Basic auth credential in username:password form.", 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.lob.com',),
|
|
deny_internet_by_default=True,
|
|
)
|
|
tools_used = ("openapi", "deepagents")
|
|
capabilities = {
|
|
"openapi_auto_agent": {
|
|
"operation_count": len(OPERATIONS),
|
|
"default_base_url": DEFAULT_BASE_URL,
|
|
"source_openapi_url": 'https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml',
|
|
"source_openapi_urls": ['https://raw.githubusercontent.com/lob/lob-openapi/main/dist/lob-api-bundled.yml'],
|
|
"server_urls": ['https://api.lob.com/v1'],
|
|
"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 = LobOpenapiAgent()
|