{
  "version": "18.4.0",
  "schemas": {
    "AppSchema": {
      "id": "/AppSchema",
      "description": "Represents a full app.",
      "type": "object",
      "required": ["version", "platformVersion"],
      "properties": {
        "version": {
          "description": "A version identifier for your code.",
          "$ref": "/VersionSchema"
        },
        "platformVersion": {
          "description": "A version identifier for the Zapier execution environment.",
          "$ref": "/VersionSchema"
        },
        "beforeApp": {
          "description": "EXPERIMENTAL: Before the perform method is called on your app, you can modify the execution context.",
          "$ref": "/MiddlewaresSchema"
        },
        "afterApp": {
          "description": "EXPERIMENTAL: After the perform method is called on your app, you can modify the response.",
          "$ref": "/MiddlewaresSchema"
        },
        "authentication": {
          "description": "Choose what scheme your API uses for authentication.",
          "$ref": "/AuthenticationSchema"
        },
        "requestTemplate": {
          "description": "Define a request mixin, great for setting custom headers, content-types, etc.",
          "$ref": "/RequestSchema"
        },
        "beforeRequest": {
          "description": "Before an HTTP request is sent via our `z.request()` client, you can modify it.",
          "$ref": "/MiddlewaresSchema"
        },
        "afterResponse": {
          "description": "After an HTTP response is recieved via our `z.request()` client, you can modify it.",
          "$ref": "/MiddlewaresSchema"
        },
        "hydrators": {
          "description": "An optional bank of named functions that you can use in `z.hydrate('someName')` to lazily load data.",
          "$ref": "/HydratorsSchema"
        },
        "resources": {
          "description": "All the resources for your app. Zapier will take these and generate the relevent triggers/searches/creates automatically.",
          "$ref": "/ResourcesSchema"
        },
        "triggers": {
          "description": "All the triggers for your app. You can add your own here, or Zapier will automatically register any from the list/hook methods on your resources.",
          "$ref": "/TriggersSchema"
        },
        "bulkReads": {
          "description": "All of the read bulks (GETs) your app exposes to retrieve resources in batches.",
          "$ref": "/BulkReadsSchema"
        },
        "searches": {
          "description": "All the searches for your app. You can add your own here, or Zapier will automatically register any from the search method on your resources.",
          "$ref": "/SearchesSchema"
        },
        "creates": {
          "description": "All the creates for your app. You can add your own here, or Zapier will automatically register any from the create method on your resources.",
          "$ref": "/CreatesSchema"
        },
        "searchOrCreates": {
          "description": "All the search-or-create combos for your app. You can create your own here, or Zapier will automatically register any from resources that define a search, a create, and a get (or define a searchOrCreate directly). Register non-resource search-or-creates here as well.",
          "$ref": "/SearchOrCreatesSchema"
        },
        "searchAndCreates": {
          "description": "An alias for \"searchOrCreates\".",
          "$ref": "/SearchAndCreatesSchema"
        },
        "flags": {
          "description": "Top-level app options",
          "$ref": "/AppFlagsSchema"
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded. When set here, it is the default throttle configuration used on each action of the integration. And when set in an action's operation object, it gets overwritten for that action only.",
          "$ref": "/ThrottleObjectSchema"
        },
        "legacy": {
          "description": "**INTERNAL USE ONLY**. Zapier uses this to hold properties from a legacy Web Builder app.",
          "type": "object",
          "docAnnotation": {
            "hide": true
          }
        },
        "firehoseWebhooks": {
          "description": "**INTERNAL USE ONLY**. Zapier uses this for internal webhook app configurations.",
          "type": "object",
          "docAnnotation": {
            "hide": true
          }
        }
      },
      "additionalProperties": false
    },
    "FunctionRequireSchema": {
      "id": "/FunctionRequireSchema",
      "description": "A path to a file that might have content like `module.exports = (z, bundle) => [{id: 123}];`.",
      "type": "object",
      "required": ["require"],
      "properties": {
        "require": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "FunctionSourceSchema": {
      "id": "/FunctionSourceSchema",
      "description": "Source code like `{source: \"return 1 + 2\"}` which the system will wrap in a function for you.",
      "type": "object",
      "required": ["source"],
      "properties": {
        "source": {
          "type": "string",
          "pattern": "return",
          "description": "JavaScript code for the function body. This must end with a `return` statement."
        },
        "args": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Function signature. Defaults to `['z', 'bundle']` if not specified."
        }
      },
      "additionalProperties": false
    },
    "FlatObjectSchema": {
      "id": "/FlatObjectSchema",
      "description": "An object whose values can only be primitives",
      "type": "object",
      "patternProperties": {
        "[^\\s]+": {
          "description": "Any key may exist in this flat object as long as its values are simple.",
          "anyOf": [
            {
              "type": "null"
            },
            {
              "type": "string"
            },
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "FunctionSchema": {
      "id": "/FunctionSchema",
      "description": "Internal pointer to a function from the original source or the source code itself. Encodes arity and if `arguments` is used in the body. Note - just write normal functions and the system will encode the pointers for you. Or, provide {source: \"return 1 + 2\"} and the system will wrap in a function for you.",
      "oneOf": [
        {
          "type": "string",
          "pattern": "^\\$func\\$\\d+\\$[tf]\\$$"
        },
        {
          "$ref": "/FunctionRequireSchema"
        },
        {
          "$ref": "/FunctionSourceSchema"
        }
      ]
    },
    "FieldChoiceWithLabelSchema": {
      "id": "/FieldChoiceWithLabelSchema",
      "description": "An object describing a labeled choice in a static dropdown. Useful if the value a user picks isn't exactly what the zap uses. For instance, when they click on a nickname, but the zap uses the user's full name ([image](https://cdn.zapier.com/storage/photos/8ed01ac5df3a511ce93ed2dc43c7fbbc.png)).",
      "type": "object",
      "required": ["value", "sample", "label"],
      "properties": {
        "value": {
          "description": "The actual value that is sent into the Zap. This is displayed as light grey text in the editor. Should match sample exactly.",
          "type": "string",
          "minLength": 1
        },
        "sample": {
          "description": "A legacy field that is no longer used by the editor, but it is still required for now and should match the value.",
          "type": "string",
          "minLength": 1
        },
        "label": {
          "description": "A human readable label for this value.",
          "type": "string",
          "minLength": 1
        }
      }
    },
    "FieldChoicesSchema": {
      "id": "/FieldChoicesSchema",
      "description": "A static dropdown of options. Which you use depends on your order and label requirements:\n\nNeed a Label? | Does Order Matter? | Type to Use\n---|---|---\nYes | No | Object of value -> label\nNo | Yes | Array of Strings\nYes | Yes | Array of [FieldChoiceWithLabel](#fieldchoicewithlabelschema)",
      "oneOf": [
        {
          "type": "object",
          "minProperties": 1,
          "not": {
            "required": ["perform"]
          }
        },
        {
          "type": "array",
          "minItems": 1,
          "items": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "$ref": "/FieldChoiceWithLabelSchema"
              }
            ]
          }
        }
      ]
    },
    "PlainFieldSchema": {
      "id": "/PlainFieldSchema",
      "description": "In addition to the requirements below, the following keys are mutually exclusive:\n\n* `children` & `list`\n* `children` & `dict`\n* `children` & `type`\n* `children` & `placeholder`\n* `children` & `helpText`\n* `children` & `default`\n* `dict` & `list`\n* `dynamic` & `dict`\n* `dynamic` & `choices`",
      "type": "object",
      "required": ["key"],
      "docAnnotation": {
        "hide": true
      },
      "properties": {
        "key": {
          "description": "A unique machine readable key for this value (IE: \"fname\").",
          "type": "string",
          "minLength": 1
        },
        "label": {
          "description": "A human readable label for this value (IE: \"First Name\").",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "description": "The type of this value. Use `string` for basic text input, `text` for a large, `<textarea>` style box, and `code` for a `<textarea>` with a fixed-width font. Field type of `file` will accept either a file object or a string. If a URL is provided in the string, Zapier will automatically make a GET for that file. Otherwise, a .txt file will be generated.",
          "type": "string",
          "enum": [
            "string",
            "text",
            "integer",
            "number",
            "boolean",
            "datetime",
            "file",
            "password",
            "copy",
            "code",
            "json"
          ]
        },
        "required": {
          "description": "If this value is required or not.",
          "type": "boolean"
        },
        "default": {
          "description": "A default value that is saved the first time a Zap is created.",
          "type": "string",
          "minLength": 1
        },
        "list": {
          "description": "Acts differently when used in inputFields vs. when used in outputFields. In inputFields: Can a user provide multiples of this field? In outputFields: Does this field return an array of items of type `type`?",
          "type": "boolean"
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "/PlainFieldSchema"
          },
          "description": "An array of child fields that define the structure of a sub-object for this field. Usually used for line items.",
          "minItems": 1
        },
        "dict": {
          "description": "Is this field a key/value input?",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "AuthFieldSchema": {
      "id": "/AuthFieldSchema",
      "description": "Field schema specialized for authentication fields. In addition to the requirements below, the following keys are mutually exclusive:\n\n* `children` & `list`\n* `children` & `dict`\n* `children` & `type`\n* `children` & `placeholder`\n* `children` & `helpText`\n* `children` & `default`\n* `dict` & `list`\n* `dynamic` & `dict`\n* `dynamic` & `choices`",
      "required": ["key"],
      "type": "object",
      "properties": {
        "key": {
          "description": "A unique machine readable key for this value (IE: \"fname\").",
          "type": "string",
          "minLength": 1
        },
        "label": {
          "description": "A human readable label for this value (IE: \"First Name\").",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "description": "The type of this value used to be.",
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "datetime",
            "copy",
            "password",
            "integer",
            "text"
          ]
        },
        "required": {
          "description": "If this value is required or not. This defaults to `true`.",
          "type": "boolean"
        },
        "default": {
          "description": "A default value that is saved the first time a Zap is created.",
          "type": "string",
          "minLength": 1
        },
        "list": {
          "description": "Acts differently when used in inputFields vs. when used in outputFields. In inputFields: Can a user provide multiples of this field? In outputFields: Does this field return an array of items of type `type`?",
          "type": "boolean"
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "/AuthFieldSchema"
          },
          "description": "An array of child fields that define the structure of a sub-object for this field. Usually used for line items.",
          "minItems": 1
        },
        "dict": {
          "description": "Is this field a key/value input?",
          "type": "boolean"
        },
        "helpText": {
          "description": "A human readable description of this value (IE: \"The first part of a full name.\"). You can use Markdown.",
          "type": "string",
          "minLength": 1,
          "maxLength": 1000
        },
        "placeholder": {
          "description": "An example value that is not saved.",
          "type": "string",
          "minLength": 1
        },
        "choices": {
          "description": "An object of machine keys and human values to populate a static dropdown.",
          "$ref": "/FieldChoicesSchema"
        },
        "computed": {
          "description": "Is this field automatically populated (and hidden from the user)? Note: Only OAuth and Session Auth support fields with this key.",
          "type": "boolean"
        },
        "inputFormat": {
          "description": "Useful when you expect the input to be part of a longer string. Put \"{{input}}\" in place of the user's input (IE: \"https://{{input}}.yourdomain.com\").",
          "type": "string",
          "pattern": "^.*{{input}}.*$"
        },
        "isNoSecret": {
          "description": "Indicates if this authentication field is safe to e.g. be stored without encryption or displayed (not a secret).",
          "type": "boolean"
        }
      }
    },
    "RequestSchema": {
      "id": "/RequestSchema",
      "description": "A representation of a HTTP request - you can use the `{{syntax}}` to inject authentication, field or global variables.",
      "type": "object",
      "properties": {
        "method": {
          "description": "The HTTP method for the request.",
          "type": "string",
          "default": "GET",
          "enum": ["GET", "PUT", "POST", "PATCH", "DELETE", "HEAD"]
        },
        "url": {
          "description": "A URL for the request (we will parse the querystring and merge with params). Keys and values will not be re-encoded.",
          "type": "string"
        },
        "body": {
          "description": "Can be nothing, a raw string or JSON (object or array).",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "string"
            },
            {
              "type": "object"
            },
            {
              "type": "array"
            }
          ]
        },
        "params": {
          "description": "A mapping of the querystring - will get merged with any query params in the URL. Keys and values will be encoded.",
          "$ref": "/FlatObjectSchema"
        },
        "headers": {
          "description": "The HTTP headers for the request.",
          "$ref": "/FlatObjectSchema"
        },
        "auth": {
          "description": "An object holding the auth parameters for OAuth1 request signing, like `{oauth_token: 'abcd', oauth_token_secret: '1234'}`. Or an array reserved (i.e. not implemented yet) to hold the username and password for Basic Auth. Like `['AzureDiamond', 'hunter2']`.",
          "oneOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "minProperties": 2,
                "maxProperties": 2
              }
            },
            {
              "$ref": "/FlatObjectSchema"
            }
          ]
        },
        "removeMissingValuesFrom": {
          "description": "Should missing values be sent? (empty strings, `null`, and `undefined` only — `[]`, `{}`, and `false` will still be sent). Allowed fields are `params` and `body`. The default is `false`, ex: ```removeMissingValuesFrom: { params: false, body: false }```",
          "type": "object",
          "properties": {
            "params": {
              "description": "Refers to data sent via a requests query params (`req.params`)",
              "type": "boolean",
              "default": false
            },
            "body": {
              "description": "Refers to tokens sent via a requsts body (`req.body`)",
              "type": "boolean",
              "default": false
            }
          },
          "additionalProperties": false
        },
        "serializeValueForCurlies": {
          "description": "A function to customize how to serialize a value for curlies `{{var}}` in the request object. By default, when this is unspecified, the request client only replaces curlies where variables are strings, and would throw an error for non-strings. The function should accepts a single argument as the value to be serialized and return the string representation of the argument.",
          "$ref": "/FunctionSchema"
        },
        "skipThrowForStatus": {
          "description": "If `true`, don't throw an exception for response 400 <= status < 600 automatically before resolving with the response. Defaults to `false`.",
          "type": "boolean",
          "default": false
        },
        "skipEncodingChars": {
          "description": "Contains the characters that you want left unencoded in the query params (`req.params`). If unspecified, `z.request()` will percent-encode non-ascii characters and these reserved characters: ``:$/?#[]@$&+,;=^@`\\``.",
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "RedirectRequestSchema": {
      "id": "/RedirectRequestSchema",
      "description": "A representation of a HTTP redirect - you can use the `{{syntax}}` to inject authentication, field or global variables.",
      "type": "object",
      "properties": {
        "method": {
          "description": "The HTTP method for the request.",
          "type": "string",
          "default": "GET",
          "enum": ["GET"]
        },
        "url": {
          "description": "A URL for the request (we will parse the querystring and merge with params). Keys and values will not be re-encoded.",
          "type": "string"
        },
        "params": {
          "description": "A mapping of the querystring - will get merged with any query params in the URL. Keys and values will be encoded.",
          "$ref": "/FlatObjectSchema"
        }
      },
      "additionalProperties": false
    },
    "AuthFieldsSchema": {
      "id": "/AuthFieldsSchema",
      "description": "An array or collection of authentication fields.",
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "/AuthFieldSchema"
          }
        ]
      }
    },
    "AuthenticationBasicConfigSchema": {
      "id": "/AuthenticationBasicConfigSchema",
      "description": "Config for Basic Authentication. No extra properties are required to setup Basic Auth, so you can leave this empty if your app uses Basic Auth.",
      "type": "object",
      "properties": {},
      "additionalProperties": false
    },
    "AuthenticationCustomConfigSchema": {
      "id": "/AuthenticationCustomConfigSchema",
      "description": "Config for custom authentication (like API keys). No extra properties are required to setup this auth type, so you can leave this empty if your app uses a custom auth method.",
      "type": "object",
      "properties": {
        "sendCode": {
          "description": "EXPERIMENTAL: Define the call Zapier should make to send the OTP code.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "AuthenticationDigestConfigSchema": {
      "id": "/AuthenticationDigestConfigSchema",
      "description": "Config for Digest Authentication. No extra properties are required to setup Digest Auth, so you can leave this empty if your app uses Digets Auth.",
      "type": "object",
      "properties": {},
      "additionalProperties": false
    },
    "AuthenticationOAuth1ConfigSchema": {
      "id": "/AuthenticationOAuth1ConfigSchema",
      "description": "Config for OAuth1 authentication.",
      "type": "object",
      "required": ["getRequestToken", "authorizeUrl", "getAccessToken"],
      "properties": {
        "getRequestToken": {
          "description": "Define where Zapier will acquire a request token which is used for the rest of the three legged authentication process.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "authorizeUrl": {
          "description": "Define where Zapier will redirect the user to authorize our app. Typically, you should append an `oauth_token` querystring parameter to the request.",
          "oneOf": [
            {
              "$ref": "/RedirectRequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "getAccessToken": {
          "description": "Define how Zapier fetches an access token from the API",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "AuthenticationOAuth2ConfigSchema": {
      "id": "/AuthenticationOAuth2ConfigSchema",
      "description": "Config for OAuth2 authentication.",
      "type": "object",
      "required": ["authorizeUrl", "getAccessToken"],
      "properties": {
        "authorizeUrl": {
          "description": "Define where Zapier will redirect the user to authorize our app. Note: we append the redirect URL and state parameters to return value of this function.",
          "oneOf": [
            {
              "$ref": "/RedirectRequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "getAccessToken": {
          "description": "Define how Zapier fetches an access token from the API",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "refreshAccessToken": {
          "description": "Define how Zapier will refresh the access token from the API",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "codeParam": {
          "description": "Define a non-standard code param Zapier should scrape instead.",
          "type": "string"
        },
        "scope": {
          "description": "What scope should Zapier request?",
          "type": "string"
        },
        "autoRefresh": {
          "description": "Should Zapier invoke `refreshAccessToken` when we receive an error for a 401 response?",
          "type": "boolean"
        },
        "enablePkce": {
          "description": "Should Zapier use PKCE for OAuth2?",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "AuthenticationSessionConfigSchema": {
      "id": "/AuthenticationSessionConfigSchema",
      "description": "Config for session authentication.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "perform": {
          "description": "Define how Zapier fetches the additional authData needed to make API calls.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "RefResourceSchema": {
      "id": "/RefResourceSchema",
      "description": "Reference a resource by key and the data it returns. In the format of: `{resource_key}.{foreign_key}(.{human_label_key})`.",
      "type": "string",
      "pattern": "^[a-zA-Z0-9_]+\\.[a-zA-Z0-9_\\s\\[\\]]+(\\.[a-zA-Z0-9_\\s\\[\\]]+(,[a-zA-Z0-9_\\s\\[\\]]+)*)?$"
    },
    "FieldDynamicChoicesSchema": {
      "id": "/FieldDynamicChoicesSchema",
      "description": "Describes dynamic dropdowns powered by a perform function or request.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "perform": {
          "description": "A function or request that returns choices for this dynamic dropdown.",
          "oneOf": [
            {
              "$ref": "/FunctionSchema"
            },
            {
              "$ref": "/RequestSchema"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "FieldMetaSchema": {
      "id": "/FieldMetaSchema",
      "type": "object",
      "description": "Allows for additional metadata to be stored on the field.",
      "patternProperties": {
        "[^\\s]+": {
          "description": "Only string, integer or boolean values are allowed.",
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "integer"
            },
            {
              "type": "boolean"
            }
          ]
        }
      }
    },
    "KeySchema": {
      "id": "/KeySchema",
      "description": "A unique identifier for this item.",
      "type": "string",
      "minLength": 2,
      "pattern": "^[a-zA-Z]+[a-zA-Z0-9_]*$"
    },
    "JsonSchemaSchema": {
      "id": "/JsonSchemaSchema",
      "description": "A JSON Schema object that describes the expected structure of a JSON value. Validated against JSON Schema Draft 4, 6, or 7 meta-schema (based on the `$schema` field, defaulting to Draft 7) via the validateJsonFieldSchema functional constraint.",
      "type": "object",
      "additionalProperties": true
    },
    "PlainInputFieldSchema": {
      "description": "Field schema specialized for input fields. In addition to the requirements below, the following keys are mutually exclusive:\n\n* `children` & `list`\n* `children` & `dict`\n* `children` & `type`\n* `children` & `placeholder`\n* `children` & `helpText`\n* `children` & `default`\n* `dict` & `list`\n* `dynamic` & `dict`\n* `dynamic` & `choices`",
      "id": "/PlainInputFieldSchema",
      "type": "object",
      "required": ["key"],
      "properties": {
        "key": {
          "description": "A unique machine readable key for this value (IE: \"fname\").",
          "type": "string",
          "minLength": 1
        },
        "label": {
          "description": "A human readable label for this value (IE: \"First Name\").",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "description": "The type of this value. Use `string` for basic text input, `text` for a large, `<textarea>` style box, and `code` for a `<textarea>` with a fixed-width font. Field type of `file` will accept either a file object or a string. If a URL is provided in the string, Zapier will automatically make a GET for that file. Otherwise, a .txt file will be generated.",
          "type": "string",
          "enum": [
            "string",
            "text",
            "integer",
            "number",
            "boolean",
            "datetime",
            "file",
            "password",
            "copy",
            "code",
            "json"
          ]
        },
        "required": {
          "description": "If this value is required or not.",
          "type": "boolean"
        },
        "default": {
          "description": "A default value that is saved the first time a Zap is created.",
          "type": "string",
          "minLength": 1
        },
        "list": {
          "description": "Acts differently when used in inputFields vs. when used in outputFields. In inputFields: Can a user provide multiples of this field? In outputFields: Does this field return an array of items of type `type`?",
          "type": "boolean"
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "/PlainInputFieldSchema"
          },
          "description": "An array of child fields that define the structure of a sub-object for this field. Usually used for line items.",
          "minItems": 1
        },
        "dict": {
          "description": "Is this field a key/value input?",
          "type": "boolean"
        },
        "helpText": {
          "description": "A human readable description of this value (IE: \"The first part of a full name.\"). You can use Markdown.",
          "type": "string",
          "minLength": 1,
          "maxLength": 1000
        },
        "search": {
          "description": "A reference to a search that will guide the user to add a search step to populate this field when creating a Zap.",
          "$ref": "/RefResourceSchema"
        },
        "dynamic": {
          "description": "A reference to a trigger that will power a dynamic dropdown.",
          "$ref": "/RefResourceSchema"
        },
        "dependsOn": {
          "description": "Specifies which other input fields this field depends on. These must be filled before this one becomes enabled, and when their values change, this field's value should be cleared.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "resource": {
          "description": "Explicitly links this input field to a resource. Use the resource key (e.g., \"spreadsheet\") or dot notation for resource fields (e.g., \"spreadsheet.url\"). If not set for dynamic dropdowns, the resource is derived implicitly from the `dynamic` property.",
          "type": "string",
          "minLength": 1,
          "pattern": "^[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)?$"
        },
        "choices": {
          "description": "Describes how to populate this dropdown. Can be a static list or a dynamic object with pagination and search support.",
          "oneOf": [
            {
              "$ref": "/FieldChoicesSchema"
            },
            {
              "$ref": "/FieldDynamicChoicesSchema"
            }
          ]
        },
        "placeholder": {
          "description": "An example value that is not saved.",
          "type": "string",
          "minLength": 1
        },
        "altersDynamicFields": {
          "description": "Does the value of this field affect the definitions of other fields in the set?",
          "type": "boolean"
        },
        "computed": {
          "description": "Is this field automatically populated (and hidden from the user)? Note: Only OAuth, Session Auth, and certain internal use cases support fields with this key.",
          "type": "boolean"
        },
        "inputFormat": {
          "description": "Useful when you expect the input to be part of a longer string. Put \"{{input}}\" in place of the user's input (IE: \"https://{{input}}.yourdomain.com\").",
          "type": "string",
          "pattern": "^.*{{input}}.*$"
        },
        "meta": {
          "description": "Allows for additional metadata to be stored on the field. Supports simple key-values only (no sub-objects or arrays).",
          "$ref": "/FieldMetaSchema"
        },
        "group": {
          "description": "References a group key from the operation's inputFieldGroups to organize this field with others.",
          "$ref": "/KeySchema"
        },
        "schema": {
          "description": "A JSON Schema object that describes the expected structure of the JSON value. Only valid when `type` is `json`.",
          "$ref": "/JsonSchemaSchema"
        }
      },
      "additionalProperties": false
    },
    "InputFieldGroupSchema": {
      "id": "/InputFieldGroupSchema",
      "description": "Object for visual grouping of input fields.",
      "type": "object",
      "required": ["key"],
      "properties": {
        "key": {
          "description": "The unique identifier for this group.",
          "$ref": "/KeySchema"
        },
        "label": {
          "description": "The human-readable name for the group.",
          "type": "string",
          "minLength": 1
        },
        "emphasize": {
          "description": "Whether this group should be visually emphasized in the UI.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "PlainOutputFieldSchema": {
      "description": "Field schema specialized for output fields. In addition to the requirements below, the following keys are mutually exclusive:\n\n* `children` & `list`\n* `children` & `dict`\n* `children` & `type`\n* `children` & `placeholder`\n* `children` & `helpText`\n* `children` & `default`\n* `dict` & `list`\n* `dynamic` & `dict`\n* `dynamic` & `choices`",
      "id": "/PlainOutputFieldSchema",
      "type": "object",
      "required": ["key"],
      "properties": {
        "key": {
          "description": "A unique machine readable key for this value (IE: \"fname\").",
          "type": "string",
          "minLength": 1
        },
        "label": {
          "description": "A human readable label for this value (IE: \"First Name\").",
          "type": "string",
          "minLength": 1
        },
        "type": {
          "description": "The type of this value. Field type of `file` will accept either a file object or a string. If a URL is provided in the string, Zapier will automatically make a GET for that file. Otherwise, a .txt file will be generated.",
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "datetime",
            "file",
            "password",
            "integer"
          ]
        },
        "required": {
          "description": "If this value is required or not.",
          "type": "boolean"
        },
        "default": {
          "description": "A default value that is saved the first time a Zap is created.",
          "type": "string",
          "minLength": 1
        },
        "list": {
          "description": "Acts differently when used in inputFields vs. when used in outputFields. In inputFields: Can a user provide multiples of this field? In outputFields: Does this field return an array of items of type `type`?",
          "type": "boolean"
        },
        "children": {
          "type": "array",
          "items": {
            "$ref": "/PlainOutputFieldSchema"
          },
          "description": "An array of child fields that define the structure of a sub-object for this field. Usually used for line items.",
          "minItems": 1
        },
        "dict": {
          "description": "Is this field a key/value input?",
          "type": "boolean"
        },
        "primary": {
          "description": "Use this field as part of the primary key for deduplication. You can set multiple fields as \"primary\", provided they are unique together. If no fields are set, Zapier will default to using the `id` field. `primary` only makes sense for `outputFields`. It only works in static `outputFields`; will not work in custom/dynamic `outputFields`. For more information, see [How deduplication works in Zapier](https://platform.zapier.com/build/deduplication).",
          "type": "boolean"
        },
        "steadyState": {
          "description": "Prevents triggering on new output until all values for fields with this property remain unchanged for 2 polls. It can be used to, e.g., not trigger on a new contact until the contact has completed typing their name. NOTE that this only applies to the `outputFields` of polling triggers.",
          "type": "boolean"
        },
        "sample": {
          "description": "An example value for this field. Can be any type (string, number, boolean, object, array, null) to match the expected field output. Values provided here will be combined with values in the operation level `sample` field, with this field taking precedence. This is most useful when using a function to generate dynamic `outputFields`.",
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "object"
            },
            {
              "type": "array"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "ThrottleOverrideObjectSchema": {
      "id": "/ThrottleOverrideObjectSchema",
      "description": "EXPERIMENTAL: Overrides the original throttle configuration based on a Zapier account attribute.",
      "type": "object",
      "required": ["window", "limit", "filter"],
      "properties": {
        "window": {
          "description": "The timeframe, in seconds, within which the system tracks the number of invocations for an action. The number of invocations begins at zero at the start of each window.",
          "type": "integer"
        },
        "limit": {
          "description": "The maximum number of invocations for an action, allowed within the timeframe window.",
          "type": "integer"
        },
        "filter": {
          "description": "Account-based attribute to override the throttle by. You can set to one of the following: \"free\", \"trial\", \"paid\". Therefore, the throttle scope would be automatically set to \"account\" and ONLY the accounts based on the specified filter will have their requests throttled based on the throttle overrides while the rest are throttled based on the original configuration.",
          "type": "string",
          "enum": ["free", "trial", "paid"]
        },
        "retry": {
          "description": "The effect of throttling on the tasks of the action. `true` means throttled tasks are automatically retried after some delay, while `false` means tasks are held without retry. It defaults to `true`. NOTE that it has no effect on polling triggers and should not be set.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "InputFieldsSchema": {
      "id": "/InputFieldsSchema",
      "description": "An array or collection of input fields.",
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "/PlainInputFieldSchema"
          },
          {
            "$ref": "/FunctionSchema"
          }
        ]
      }
    },
    "InputFieldGroupsSchema": {
      "id": "/InputFieldGroupsSchema",
      "description": "An array or collection of input field groups.",
      "type": "array",
      "items": {
        "$ref": "/InputFieldGroupSchema"
      },
      "additionalProperties": false
    },
    "OutputFieldsSchema": {
      "id": "/OutputFieldsSchema",
      "description": "An array or collection of output fields.",
      "type": "array",
      "items": {
        "oneOf": [
          {
            "$ref": "/PlainOutputFieldSchema"
          },
          {
            "$ref": "/FunctionSchema"
          }
        ]
      }
    },
    "LockObjectSchema": {
      "id": "/LockObjectSchema",
      "description": "Zapier uses this configuration to ensure this action is performed one at a time per scope (avoid concurrency).",
      "type": "object",
      "required": ["key"],
      "properties": {
        "key": {
          "description": "The key to use for locking. This should be unique to the operation. While actions of different integrations with the same key and scope will never lock each other out, actions of the same integration with the same key and scope will do. User data provided for the input fields can be used in the key with the use of the curly braces referencing. For example, to access the user data provided for the input field \"test_field\", use `{{bundle.inputData.test_field}}`. Note that a required input field should be referenced to get user data always.",
          "type": "string",
          "minLength": 1
        },
        "scope": {
          "description": "By default, locks are scoped to the app. That is, all users of the app will share the same locks. If you want to restrict serial access to a specific user, auth, or account, you can set the scope to one or more of the following: 'user' - Locks based on user ids.  'auth' - Locks based on unique auth ids. 'account' - Locks for all users under a single account. You may also combine scopes. Note that \"app\" is included, always, in the scope provided. For example, a scope of ['account', 'auth'] would result to ['app', 'account', 'auth'].",
          "type": "array",
          "items": {
            "enum": ["user", "auth", "account"],
            "type": "string"
          }
        },
        "timeout": {
          "description": "The number of seconds to hold the lock before releasing it to become accessible to other task invokes that need it. If not provided, the default set by the app will be used. It cannot be more than 180.",
          "type": "integer"
        }
      },
      "additionalProperties": false
    },
    "ResultsSchema": {
      "id": "/ResultsSchema",
      "description": "An array of objects suitable for returning in perform calls.",
      "type": "array",
      "items": {
        "type": "object",
        "minProperties": 1
      }
    },
    "ThrottleObjectSchema": {
      "id": "/ThrottleObjectSchema",
      "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded. **NOTE:** The final key used for the throttling is formed as a combination of all the configurations; key, window, limit, and scope. To share a limit across multiple actions in an integration, each should have the same configuration set without \"action\" in the scope.",
      "type": "object",
      "required": ["window", "limit"],
      "properties": {
        "window": {
          "description": "The timeframe, in seconds, within which the system tracks the number of invocations for an action. The number of invocations begins at zero at the start of each window.",
          "type": "integer"
        },
        "limit": {
          "description": "The maximum number of invocations for an action, allowed within the timeframe window.",
          "type": "integer"
        },
        "key": {
          "description": "The key to throttle with in combination with the scope. User data provided for the input fields can be used in the key with the use of the curly braces referencing. For example, to access the user data provided for the input field \"test_field\", use `{{bundle.inputData.test_field}}`. Note that a required input field should be referenced to get user data always.",
          "type": "string",
          "minLength": 1
        },
        "scope": {
          "description": "The granularity to throttle by. You can set the scope to one or more of the following: 'user' - Throttles based on user ids.  'auth' - Throttles based on auth ids. 'account' - Throttles based on account ids for all users under a single account. 'action' - Throttles the action it is set on separately from other actions. By default, throttling is scoped to the action and account.",
          "type": "array",
          "items": {
            "enum": ["user", "auth", "account", "action"],
            "type": "string"
          }
        },
        "retry": {
          "description": "The effect of throttling on the tasks of the action. `true` means throttled tasks are automatically retried after some delay, while `false` means tasks are held without retry. It defaults to `true`. NOTE that it has no effect on polling triggers and should not be set.",
          "type": "boolean"
        },
        "filter": {
          "description": "EXPERIMENTAL: Account-based attribute to override the throttle by. You can set to one of the following: \"free\", \"trial\", \"paid\". Therefore, the throttle scope would be automatically set to \"account\" and ONLY the accounts based on the specified filter will have their requests throttled based on the throttle overrides while the rest are throttled based on the original configuration.",
          "type": "string",
          "enum": ["free", "trial", "paid"]
        },
        "overrides": {
          "description": "EXPERIMENTAL: Overrides the original throttle configuration based on a Zapier account attribute.",
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "/ThrottleOverrideObjectSchema"
          }
        }
      },
      "additionalProperties": false
    },
    "BasicDisplaySchema": {
      "id": "/BasicDisplaySchema",
      "description": "Represents user information for a trigger, search, or create.",
      "type": "object",
      "properties": {
        "label": {
          "description": "A short label like \"New Record\" or \"Create Record in Project\". Optional if `hidden` is true.",
          "type": "string",
          "minLength": 2,
          "maxLength": 64,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "description": {
          "description": "A description of what this trigger, search, or create does. Optional if `hidden` is true.",
          "type": "string",
          "minLength": 1,
          "maxLength": 1000,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "directions": {
          "description": "A short blurb that can explain how to get this working. EG: how and where to copy-paste a static hook URL into your application. Only evaluated for static webhooks.",
          "type": "string",
          "minLength": 12,
          "maxLength": 1000
        },
        "hidden": {
          "description": "Should this operation be unselectable by users?",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "BasicOperationSchema": {
      "id": "/BasicOperationSchema",
      "description": "Represents the fundamental mechanics of triggers, searches, or creates.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "How will Zapier get the data? This can be a function like `(z) => [{id: 123}]` or a request like `{url: 'http...'}`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "lock": {
          "description": "Zapier uses this configuration to ensure this action is performed one at a time per scope (avoid concurrency).",
          "$ref": "/LockObjectSchema"
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded.",
          "$ref": "/ThrottleObjectSchema"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "BasicHookOperationSchema": {
      "id": "/BasicHookOperationSchema",
      "description": "Represents the inbound mechanics of hooks with optional subscribe/unsubscribe. Defers to list for fields.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "type": {
          "description": "Must be explicitly set to `\"hook\"` unless this hook is defined as part of a resource, in which case it's optional.",
          "type": "string",
          "enum": ["hook"],
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "A function that processes the inbound webhook request.",
          "$ref": "/FunctionSchema"
        },
        "performList": {
          "description": "Fetch a list of items on demand during testing instead of waiting for a hook. You can also consider resources and their built-in hook/list methods. Note: this is required for public apps to ensure the best UX for the end-user. For private apps, this is strongly recommended for testing REST Hooks. Otherwise, you can ignore warnings about this property with the `--without-style` flag during `zapier push`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ],
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "canPaginate": {
          "description": "Does this endpoint support pagination via temporary cursor storage?",
          "type": "boolean"
        },
        "performSubscribe": {
          "description": "Takes a URL and any necessary data from the user and subscribes. Note: this is required for public apps to ensure the best UX for the end-user. For private apps, this is strongly recommended for testing REST Hooks. Otherwise, you can ignore warnings about this property with the `--without-style` flag during `zapier push`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ],
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "performUnsubscribe": {
          "description": "Takes a URL and data from a previous subscribe call and unsubscribes. Note: this is required for public apps to ensure the best UX for the end-user. For private apps, this is strongly recommended for testing REST Hooks. Otherwise, you can ignore warnings about this property with the `--without-style` flag during `zapier push`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ],
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "BasicPollingOperationSchema": {
      "id": "/BasicPollingOperationSchema",
      "description": "Represents the fundamental mechanics of a trigger.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "type": {
          "description": "Clarify how this operation works (polling == pull or hook == push).",
          "type": "string",
          "default": "polling",
          "enum": ["polling"]
        },
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "How will Zapier get the data? This can be a function like `(z) => [{id: 123}]` or a request like `{url: 'http...'}`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "canPaginate": {
          "description": "Does this endpoint support pagination via temporary cursor storage?",
          "type": "boolean"
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded.",
          "$ref": "/ThrottleObjectSchema"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "BasicActionOperationSchema": {
      "id": "/BasicActionOperationSchema",
      "description": "Represents the fundamental mechanics of a search/create.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "How will Zapier get the data? This can be a function like `(z) => [{id: 123}]` or a request like `{url: 'http...'}`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "performResume": {
          "description": "A function that parses data from a perform (which uses z.generateCallbackUrl()) and callback request to resume this action.",
          "$ref": "/FunctionSchema"
        },
        "performGet": {
          "description": "How will Zapier get a single record? If you find yourself reaching for this - consider resources and their built-in get methods.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "lock": {
          "description": "Zapier uses this configuration to ensure this action is performed one at a time per scope (avoid concurrency).",
          "$ref": "/LockObjectSchema"
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded.",
          "$ref": "/ThrottleObjectSchema"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "ResourceMethodGetSchema": {
      "id": "/ResourceMethodGetSchema",
      "description": "How will we get a single object given a unique identifier/id?",
      "type": "object",
      "required": ["display", "operation"],
      "properties": {
        "display": {
          "description": "Define how this get method will be exposed in the UI.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Define how this get method will work.",
          "$ref": "/BasicOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourceMethodHookSchema": {
      "id": "/ResourceMethodHookSchema",
      "description": "How will we get notified of new objects? Will be turned into a trigger automatically.",
      "type": "object",
      "required": ["display", "operation"],
      "properties": {
        "display": {
          "description": "Define how this hook/trigger method will be exposed in the UI.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Define how this hook/trigger method will work.",
          "$ref": "/BasicHookOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourceMethodListSchema": {
      "id": "/ResourceMethodListSchema",
      "description": "How will we get a list of new objects? Will be turned into a trigger automatically.",
      "type": "object",
      "required": ["display", "operation"],
      "properties": {
        "display": {
          "description": "Define how this list/trigger method will be exposed in the UI.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Define how this list/trigger method will work.",
          "$ref": "/BasicPollingOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourceMethodSearchSchema": {
      "id": "/ResourceMethodSearchSchema",
      "description": "How will we find a specific object given filters or search terms? Will be turned into a search automatically.",
      "type": "object",
      "required": ["display", "operation"],
      "properties": {
        "display": {
          "description": "Define how this search method will be exposed in the UI.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Define how this search method will work.",
          "$ref": "/BasicActionOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourceMethodCreateSchema": {
      "id": "/ResourceMethodCreateSchema",
      "description": "How will we find create a specific object given inputs? Will be turned into a create automatically.",
      "type": "object",
      "required": ["display", "operation"],
      "properties": {
        "display": {
          "description": "Define how this create method will be exposed in the UI.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Define how this create method will work.",
          "$ref": "/BasicActionOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourceSchema": {
      "id": "/ResourceSchema",
      "description": "Represents a resource, which will in turn power triggers, searches, or creates.",
      "type": "object",
      "required": ["key", "noun"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify this resource.",
          "$ref": "/KeySchema"
        },
        "noun": {
          "description": "A noun for this resource that completes the sentence \"create a new XXX\".",
          "type": "string",
          "minLength": 2,
          "maxLength": 255
        },
        "get": {
          "description": "How will we get a single object given a unique identifier/id?",
          "$ref": "/ResourceMethodGetSchema"
        },
        "hook": {
          "description": "How will we get notified of new objects? Will be turned into a trigger automatically.",
          "$ref": "/ResourceMethodHookSchema"
        },
        "list": {
          "description": "How will we get a list of new objects? Will be turned into a trigger automatically.",
          "$ref": "/ResourceMethodListSchema"
        },
        "search": {
          "description": "How will we find a specific object given filters or search terms? Will be turned into a search automatically.",
          "$ref": "/ResourceMethodSearchSchema"
        },
        "create": {
          "description": "How will we find create a specific object given inputs? Will be turned into a create automatically.",
          "$ref": "/ResourceMethodCreateSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return?",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like?",
          "type": "object",
          "minProperties": 1
        }
      },
      "additionalProperties": false
    },
    "BulkReadSchema": {
      "id": "/BulkReadSchema",
      "description": "How will Zapier fetch resources from your application?",
      "type": "object",
      "required": ["key", "noun", "display", "operation"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify a record.",
          "$ref": "/KeySchema"
        },
        "noun": {
          "description": "A noun for this read that completes the sentence \"reads all of the XXX\".",
          "type": "string",
          "minLength": 2,
          "maxLength": 255
        },
        "display": {
          "description": "Configures the UI for this read bulk.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Powers the functionality for this read bulk.",
          "$ref": "/BasicActionOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "BasicHookToPollOperationSchema": {
      "id": "/BasicHookToPollOperationSchema",
      "description": "Represents the inbound mechanics of hook to poll style triggers. Defers to list for fields.",
      "type": "object",
      "required": ["performList", "performSubscribe", "performUnsubscribe"],
      "properties": {
        "type": {
          "description": "Must be explicitly set to `\"hook_to_poll\"`.",
          "type": "string",
          "enum": ["hook_to_poll"],
          "required": {
            "type": "replace",
            "value": "**yes** (with exceptions, see description)"
          }
        },
        "performList": {
          "description": "Similar a polling trigger, but checks for new data when a webhook is received, instead of every few minutes",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "canPaginate": {
          "description": "Does this endpoint support pagination via temporary cursor storage?",
          "type": "boolean"
        },
        "performSubscribe": {
          "description": "Takes a URL and any necessary data from the user and subscribes. ",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "performUnsubscribe": {
          "description": "Takes a URL and data from a previous subscribe call and unsubscribes. ",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        },
        "maxPollingDelay": {
          "description": "The maximum amount of time to wait between polling requests in seconds. Minimum value is 20s and will default to 20 if not set, or set to a lower value.",
          "type": "integer"
        }
      },
      "additionalProperties": false,
      "docAnnotation": {
        "hide": true
      }
    },
    "TriggerSchema": {
      "id": "/TriggerSchema",
      "description": "How will Zapier get notified of new objects?",
      "type": "object",
      "required": ["key", "noun", "display", "operation"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify this trigger.",
          "$ref": "/KeySchema"
        },
        "noun": {
          "description": "A noun for this trigger that completes the sentence \"triggers on a new XXX\".",
          "type": "string",
          "minLength": 2,
          "maxLength": 255
        },
        "display": {
          "description": "Configures the UI for this trigger.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Powers the functionality for this trigger.",
          "anyOf": [
            {
              "$ref": "/BasicPollingOperationSchema"
            },
            {
              "$ref": "/BasicHookOperationSchema"
            },
            {
              "$ref": "/BasicHookToPollOperationSchema"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "BasicSearchOperationSchema": {
      "id": "/BasicSearchOperationSchema",
      "description": "Represents the fundamental mechanics of a search.",
      "type": "object",
      "required": ["perform"],
      "properties": {
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "How will Zapier get the data? This can be a function like `(z) => [{id: 123}]` or a request like `{url: 'http...'}`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "performResume": {
          "description": "A function that parses data from a perform (which uses z.generateCallbackUrl()) and callback request to resume this action.",
          "$ref": "/FunctionSchema"
        },
        "performGet": {
          "description": "How will Zapier get a single record? If you find yourself reaching for this - consider resources and their built-in get methods.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "canPaginate": {
          "description": "Does this search support pagination?",
          "type": "boolean"
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "lock": {
          "description": "Zapier uses this configuration to ensure this action is performed one at a time per scope (avoid concurrency).",
          "$ref": "/LockObjectSchema"
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded.",
          "$ref": "/ThrottleObjectSchema"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "SearchSchema": {
      "id": "/SearchSchema",
      "description": "How will Zapier search for existing objects?",
      "type": "object",
      "required": ["key", "noun", "display", "operation"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify this search.",
          "$ref": "/KeySchema"
        },
        "noun": {
          "description": "A noun for this search that completes the sentence \"finds a specific XXX\".",
          "type": "string",
          "minLength": 2,
          "maxLength": 255
        },
        "display": {
          "description": "Configures the UI for this search.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Powers the functionality for this search.",
          "$ref": "/BasicSearchOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "BufferConfigSchema": {
      "id": "/BufferConfigSchema",
      "description": "Currently an **internal-only** feature. Zapier uses this configuration for creating objects in bulk.",
      "type": "object",
      "required": ["groupedBy", "limit"],
      "properties": {
        "groupedBy": {
          "description": "The list of keys of input fields to group bulk-create with. The actual user data provided for the fields will be used during execution. Note that a required input field should be referenced to get user data always.",
          "type": "array",
          "minItems": 1
        },
        "limit": {
          "description": "The maximum number of items to call `performBuffer` with. **Note** that it is capped by the platform to prevent exceeding the [AWS Lambda's request/response payload size quota of 6 MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution). Also, the execution is time-bound; we recommend reducing it upon consistent timeout.",
          "type": "integer"
        }
      },
      "additionalProperties": false
    },
    "BasicCreateOperationSchema": {
      "id": "/BasicCreateOperationSchema",
      "description": "Represents the fundamental mechanics of a create.",
      "type": "object",
      "properties": {
        "resource": {
          "description": "Optionally reference and extends a resource. Allows Zapier to automatically tie together samples, lists and hooks, greatly improving the UX. EG: if you had another trigger reusing a resource but filtering the results.",
          "$ref": "/KeySchema"
        },
        "perform": {
          "description": "How will Zapier get the data? This can be a function like `(z) => [{id: 123}]` or a request like `{url: 'http...'}`. Exactly one of `perform` or `performBuffer` must be defined. If you choose to define `buffer` and `performBuffer`, you must omit `perform`.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ],
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "no (with exceptions, see description)"
            }
          }
        },
        "performResume": {
          "description": "A function that parses data from a perform (which uses z.generateCallbackUrl()) and callback request to resume this action.",
          "$ref": "/FunctionSchema"
        },
        "performGet": {
          "description": "How will Zapier get a single record? If you find yourself reaching for this - consider resources and their built-in get methods.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "inputFields": {
          "description": "What should the form a user sees and configures look like?",
          "$ref": "/InputFieldsSchema"
        },
        "inputFieldGroups": {
          "description": "Defines groups for organizing input fields in the UI. Each group can have a key, label, and emphasis styling.",
          "$ref": "/InputFieldGroupsSchema"
        },
        "outputFields": {
          "description": "What fields of data will this return? Will use resource outputFields if missing, will also use sample if available.",
          "$ref": "/OutputFieldsSchema"
        },
        "sample": {
          "description": "What does a sample of data look like? Will use resource sample if missing. Requirement waived if `display.hidden` is true or if this belongs to a resource that has a top-level sample",
          "type": "object",
          "minProperties": 1,
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "**yes** (with exceptions, see description)"
            }
          }
        },
        "lock": {
          "description": "Zapier uses this configuration to ensure this action is performed one at a time per scope (avoid concurrency).",
          "$ref": "/LockObjectSchema"
        },
        "throttle": {
          "description": "Zapier uses this configuration to apply throttling when the limit for the window is exceeded.",
          "$ref": "/ThrottleObjectSchema"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. There is also a global flag with the same name in `App.flags`. This one takes precedence over the global one.",
          "type": "boolean"
        },
        "buffer": {
          "description": "Currently an **internal-only** feature. Zapier uses this configuration for creating objects in bulk with `performBuffer`.",
          "$ref": "/BufferConfigSchema",
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "no (with exceptions, see description)"
            }
          }
        },
        "performBuffer": {
          "description": "Currently an **internal-only** feature. A function to create objects in bulk with. `buffer` and `performBuffer` must either both be defined or neither. Additionally, only one of `perform` or `performBuffer` can be defined. If you choose to define `perform`, you must omit `buffer` and `performBuffer`.",
          "$ref": "/FunctionSchema",
          "docAnnotation": {
            "required": {
              "type": "replace",
              "value": "no (with exceptions, see description)"
            }
          }
        }
      },
      "additionalProperties": false
    },
    "CreateSchema": {
      "id": "/CreateSchema",
      "description": "How will Zapier create a new object?",
      "type": "object",
      "required": ["key", "noun", "display", "operation"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify this create.",
          "$ref": "/KeySchema"
        },
        "noun": {
          "description": "A noun for this create that completes the sentence \"creates a new XXX\".",
          "type": "string",
          "minLength": 2,
          "maxLength": 255
        },
        "display": {
          "description": "Configures the UI for this create.",
          "$ref": "/BasicDisplaySchema"
        },
        "operation": {
          "description": "Powers the functionality for this create.",
          "$ref": "/BasicCreateOperationSchema"
        }
      },
      "additionalProperties": false
    },
    "SearchOrCreateSchema": {
      "id": "/SearchOrCreateSchema",
      "description": "Pair an existing search and a create to enable \"Find or Create\" functionality in your app",
      "type": "object",
      "required": ["key", "display", "search", "create"],
      "properties": {
        "key": {
          "description": "A key to uniquely identify this search-or-create. Must match the search key.",
          "$ref": "/KeySchema"
        },
        "display": {
          "description": "Configures the UI for this search-or-create.",
          "$ref": "/BasicDisplaySchema"
        },
        "search": {
          "description": "The key of the search that powers this search-or-create",
          "$ref": "/KeySchema"
        },
        "create": {
          "description": "The key of the create that powers this search-or-create",
          "$ref": "/KeySchema"
        },
        "update": {
          "description": "EXPERIMENTAL: The key of the update action (in `creates`) that will be used if a search succeeds.",
          "$ref": "/KeySchema"
        },
        "updateInputFromSearchOutput": {
          "description": "EXPERIMENTAL: A mapping where the key represents the input field for the update action, and the value represents the field from the search action's output that should be mapped to the update action's input field.",
          "$ref": "/FlatObjectSchema"
        },
        "searchUniqueInputToOutputConstraint": {
          "description": "EXPERIMENTAL: A mapping where the key represents an input field for the search action, and the value represents how that field's value will be used to filter down the search output for an exact match.",
          "type": "object"
        }
      },
      "additionalProperties": false
    },
    "SearchOrCreatesSchema": {
      "id": "/SearchOrCreatesSchema",
      "description": "Enumerates the search-or-creates your app has available for users.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the SearchOrCreateSchema.",
          "$ref": "/SearchOrCreateSchema"
        }
      },
      "additionalProperties": false
    },
    "AuthenticationSchema": {
      "id": "/AuthenticationSchema",
      "description": "Represents authentication schemes.",
      "type": "object",
      "required": ["type", "test"],
      "properties": {
        "type": {
          "description": "Choose which scheme you want to use.",
          "type": "string",
          "enum": ["basic", "custom", "digest", "oauth1", "oauth2", "session"]
        },
        "test": {
          "description": "A function or request that confirms the authentication is working.",
          "oneOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            }
          ]
        },
        "fields": {
          "description": "Fields you can request from the user before they connect your app to Zapier.",
          "$ref": "/AuthFieldsSchema"
        },
        "connectionLabel": {
          "description": "A string with variables, function, or request that returns the connection label for the authenticated user.",
          "anyOf": [
            {
              "$ref": "/RequestSchema"
            },
            {
              "$ref": "/FunctionSchema"
            },
            {
              "type": "string"
            }
          ]
        },
        "basicConfig": {
          "$ref": "/AuthenticationBasicConfigSchema"
        },
        "customConfig": {
          "$ref": "/AuthenticationCustomConfigSchema"
        },
        "digestConfig": {
          "$ref": "/AuthenticationDigestConfigSchema"
        },
        "oauth1Config": {
          "$ref": "/AuthenticationOAuth1ConfigSchema"
        },
        "oauth2Config": {
          "$ref": "/AuthenticationOAuth2ConfigSchema"
        },
        "sessionConfig": {
          "$ref": "/AuthenticationSessionConfigSchema"
        }
      },
      "additionalProperties": false
    },
    "ResourcesSchema": {
      "id": "/ResourcesSchema",
      "description": "All the resources that underlie common CRUD methods powering automatically handled triggers, creates, and searches for your app. Zapier will break these apart for you.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the ResourceSchema.",
          "$ref": "/ResourceSchema"
        }
      },
      "additionalProperties": false
    },
    "BulkReadsSchema": {
      "id": "/BulkReadsSchema",
      "description": "Enumerates the bulk reads your app exposes.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the BulkReadSchema.",
          "$ref": "/BulkReadSchema"
        }
      },
      "additionalProperties": false
    },
    "TriggersSchema": {
      "id": "/TriggersSchema",
      "description": "Enumerates the triggers your app has available for users.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the TriggerSchema.",
          "$ref": "/TriggerSchema"
        }
      },
      "additionalProperties": false
    },
    "SearchesSchema": {
      "id": "/SearchesSchema",
      "description": "Enumerates the searches your app has available for users.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the SearchSchema.",
          "$ref": "/SearchSchema"
        }
      },
      "additionalProperties": false
    },
    "CreatesSchema": {
      "id": "/CreatesSchema",
      "description": "Enumerates the creates your app has available for users.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the CreateSchema.",
          "$ref": "/CreateSchema"
        }
      },
      "additionalProperties": false
    },
    "SearchAndCreatesSchema": {
      "id": "/SearchAndCreatesSchema",
      "description": "Alias for /SearchOrCreatesSchema",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9_]*$": {
          "description": "Any unique key can be used and its values will be validated against the SearchOrCreateSchema.",
          "$ref": "/SearchOrCreateSchema"
        }
      },
      "additionalProperties": false
    },
    "VersionSchema": {
      "id": "/VersionSchema",
      "description": "Represents a simplified semver string, from `0.0.0` to `999.999.999` with optional simplified label. They need to be case-insensitive unique.",
      "type": "string",
      "pattern": "^(?:0|[1-9]\\d{0,2})\\.(?:0|[1-9]\\d{0,2})\\.(?:0|[1-9]\\d{0,2})(?:-(?=.{1,12}$)[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*)?$",
      "minLength": 5,
      "maxLength": 24
    },
    "MiddlewaresSchema": {
      "id": "/MiddlewaresSchema",
      "description": "List of before or after middlewares. Can be an array of functions or a single function",
      "oneOf": [
        {
          "type": "array",
          "items": {
            "$ref": "/FunctionSchema"
          }
        },
        {
          "$ref": "/FunctionSchema"
        }
      ],
      "additionalProperties": false
    },
    "HydratorsSchema": {
      "id": "/HydratorsSchema",
      "description": "A bank of named functions that you can use in `z.hydrate('someName')` to lazily load data.",
      "type": "object",
      "patternProperties": {
        "^[a-zA-Z]+[a-zA-Z0-9]*$": {
          "description": "Any unique key can be used in `z.hydrate('uniqueKeyHere')`.",
          "$ref": "/FunctionSchema"
        }
      },
      "additionalProperties": false
    },
    "AppFlagsSchema": {
      "id": "/AppFlagsSchema",
      "description": "Codifies high-level options for your integration.",
      "type": "object",
      "properties": {
        "skipHttpPatch": {
          "description": "By default, Zapier patches the core `http` module so that all requests (including those from 3rd-party SDKs) can be logged. Set this to true if you're seeing issues using an SDK (such as AWS).",
          "type": "boolean"
        },
        "skipThrowForStatus": {
          "description": "Starting in `core` version `10.0.0`, `response.throwForStatus()` was called by default. We introduced a per-request way to opt-out of this behavior. This flag takes that a step further and controls that behavior integration-wide **for requests made using `z.request()`**. Unless they specify otherwise (per-request, or via middleware), [Shorthand requests](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#shorthand-http-requests) _always_ call `throwForStatus()`. `z.request()` calls can also ignore this flag if they set `skipThrowForStatus` directly. It is important to note that for oauth2 or session auths with `authRefresh:true`, `401` status codes will throw a `RefreshAuthError` regardless of `skipThrowForStatus`, and will need to be handled manually if intervention is required.",
          "type": "boolean"
        },
        "throwForThrottlingEarly": {
          "description": "Starting in `core` version `18.0.0`, 429 (throttling) responses throw a `ThrottledError` before `afterResponse` middleware runs by default. Set this flag to `true` to preserve the old behavior where `afterResponse` middleware can see and handle 429 responses. This flag can be overridden per-request by setting `throwForThrottlingEarly` directly on the request options.",
          "type": "boolean"
        },
        "cleanInputData": {
          "description": "If true, Zapier removes empty strings, `null`, `undefined`, and empty Arrays or objects from `bundle.inputData` recursively before passing it to your `perform*` function. If you want to handle empty values yourself in your code, explicitly set this to false. This is a global flag that affects all the triggers and actions in your integration. The `cleanInputData` flag in `operation` takes precedence over this one.",
          "type": "boolean"
        }
      },
      "additionalProperties": false
    }
  }
}
