{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/pipedream/main/json-schema/pipedream-project-schema.json",
  "title": "Pipedream Project",
  "description": "Project that can be accessed via the Connect API",
  "type": "object",
  "required": [
    "id",
    "name"
  ],
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^proj_[0-9A-Za-z]+$",
      "description": "Hash ID for the project"
    },
    "name": {
      "type": "string",
      "description": "Display name of the project"
    },
    "app_name": {
      "type": "string",
      "nullable": true,
      "description": "App name shown to Connect users"
    },
    "support_email": {
      "type": "string",
      "format": "email",
      "nullable": true,
      "description": "Support email configured for the project"
    },
    "connect_require_key_auth_test": {
      "type": "boolean",
      "description": "Send a test request to the upstream API when adding Connect accounts for key-based apps"
    }
  },
  "$defs": {
    "AccountId": {
      "type": "string",
      "description": "The unique ID of the account.",
      "pattern": "^apn_[a-zA-Z0-9]+$"
    },
    "Account": {
      "type": "object",
      "description": "End user account data, returned from the API.",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "$ref": "#/components/schemas/AccountId"
        },
        "name": {
          "type": "string",
          "description": "The custom name of the account if set.",
          "nullable": true
        },
        "external_id": {
          "type": "string",
          "description": "The external ID associated with the account."
        },
        "healthy": {
          "type": "boolean",
          "description": "Indicates if the account is healthy. Pipedream will periodically retry token refresh and test requests for unhealthy accounts"
        },
        "dead": {
          "type": "boolean",
          "nullable": true,
          "description": "Indicates if the account is no longer active"
        },
        "app": {
          "$ref": "#/components/schemas/App"
        },
        "created_at": {
          "type": "string",
          "description": "The date and time the account was created, an ISO 8601 formatted string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "description": "The date and time the account was last updated, an ISO 8601 formatted string",
          "format": "date-time"
        },
        "authorized_scopes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The OAuth scopes effectively granted to this account. Empty for non-OAuth apps."
        },
        "credentials": {
          "type": "object",
          "description": "The credentials associated with the account, if the `include_credentials` parameter was set to true in the request (only applicable for BYOA apps). In addition to the well-known OAuth fields listed below, this object may contain app-specific custom fields (e.g. `base_url`).",
          "nullable": true,
          "additionalProperties": true,
          "properties": {
            "oauth_client_id": {
              "type": "string",
              "description": "The OAuth client ID for the app, if applicable"
            },
            "oauth_access_token": {
              "type": "string",
              "description": "The OAuth access token"
            },
            "oauth_refresh_token": {
              "type": "string",
              "description": "The OAuth refresh token"
            },
            "oauth_uid": {
              "type": "string",
              "description": "The unique OAuth user identifier"
            },
            "oauth_signer_uri": {
              "type": "string",
              "description": "The OAuth signer URI, if the app uses a custom OAuth signer"
            }
          }
        },
        "expires_at": {
          "type": "string",
          "description": "The date and time the account's credentials expiration, an ISO 8601 formatted string",
          "format": "date-time"
        },
        "error": {
          "type": "string",
          "description": "The error message if the account is unhealthy or dead, null otherwise",
          "nullable": true
        },
        "last_refreshed_at": {
          "type": "string",
          "description": "The date and time the account was last refreshed, an ISO 8601 formatted string",
          "format": "date-time",
          "nullable": true
        },
        "next_refresh_at": {
          "type": "string",
          "description": "The date and time the account will next be refreshed, an ISO 8601 formatted string",
          "format": "date-time",
          "nullable": true
        }
      }
    },
    "App": {
      "type": "object",
      "description": "Response object for a Pipedream app's metadata",
      "required": [
        "name_slug",
        "name",
        "img_src",
        "custom_fields_json",
        "categories",
        "featured_weight"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "ID of the app. Only applies for OAuth apps.",
          "nullable": true
        },
        "name_slug": {
          "type": "string",
          "description": "The name slug of the target app (see https://pipedream.com/docs/connect/quickstart#find-your-apps-name-slug)"
        },
        "name": {
          "type": "string",
          "description": "The human-readable name of the app"
        },
        "auth_type": {
          "$ref": "#/components/schemas/AppAuthType"
        },
        "description": {
          "type": "string",
          "description": "A short description of the app",
          "nullable": true
        },
        "img_src": {
          "type": "string",
          "description": "The URL to the app's logo"
        },
        "custom_fields_json": {
          "type": "string",
          "description": "A JSON string representing the custom fields for the app",
          "nullable": true
        },
        "categories": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Categories associated with the app"
        },
        "featured_weight": {
          "type": "number",
          "description": "A rough directional ordering of app popularity, subject to changes by Pipedream"
        }
      }
    },
    "AppAuthType": {
      "type": "string",
      "enum": [
        "keys",
        "oauth",
        "none"
      ],
      "description": "The authentication type used by the app",
      "nullable": true
    },
    "AppCategory": {
      "type": "object",
      "description": "Response object for a Pipedream app category",
      "properties": {
        "id": {
          "type": "string",
          "description": "ID of the app category"
        },
        "name": {
          "type": "string",
          "description": "The human-readable name of the app category"
        },
        "description": {
          "type": "string",
          "description": "A short description of the app category",
          "nullable": true
        }
      }
    },
    "ConnectUsage": {
      "type": "object",
      "description": "Connect usage record",
      "required": [
        "credits_used",
        "usage_start_ts",
        "usage_end_ts"
      ],
      "properties": {
        "credits_used": {
          "type": "integer",
          "description": "Total Connect credits used"
        },
        "action_run_credits_used": {
          "type": "integer",
          "description": "Credits used when running Connect actions",
          "nullable": true
        },
        "proxy_credits_used": {
          "type": "integer",
          "description": "Credits used by Connect proxy requests",
          "nullable": true
        },
        "source_emit_credits_used": {
          "type": "integer",
          "description": "Credits used by Connect source event emissions",
          "nullable": true
        },
        "usage_start_ts": {
          "type": "integer",
          "description": "Usage window start timestamp (seconds)"
        },
        "usage_end_ts": {
          "type": "integer",
          "description": "Usage window end timestamp (seconds)"
        }
      }
    },
    "ConnectUsageResponse": {
      "type": "object",
      "description": "Connect usage records for a time window",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ConnectUsage"
          }
        }
      }
    },
    "BackendClientOpts": {
      "type": "object",
      "description": "Options for creating a server-side client",
      "properties": {
        "client_id": {
          "type": "string",
          "description": "The client ID for authentication"
        },
        "client_secret": {
          "type": "string",
          "description": "The client secret for authentication"
        },
        "api_url": {
          "type": "string",
          "description": "The API URL to use"
        },
        "scope": {
          "type": "string",
          "description": "Optional space-separated scopes for the access token. Defaults to `*`."
        }
      }
    },
    "ClientOpts": {
      "type": "object",
      "description": "Options for creating a server-side client",
      "properties": {
        "client_id": {
          "type": "string",
          "description": "The client ID for authentication"
        },
        "client_secret": {
          "type": "string",
          "description": "The client secret for authentication"
        },
        "api_url": {
          "type": "string",
          "description": "The API URL to use (defaults to https://api.pipedream.com/)"
        }
      }
    },
    "Component": {
      "type": "object",
      "required": [
        "key",
        "name",
        "version",
        "configurable_props"
      ],
      "properties": {
        "key": {
          "type": "string",
          "description": "The key that uniquely identifies the component."
        },
        "name": {
          "type": "string",
          "description": "The human-readable name of the component, e.g. 'GitLab: List Commits'"
        },
        "version": {
          "type": "string",
          "description": "The latest version of the component, in SemVer format.",
          "pattern": "^\\d+.\\d+.\\d+$"
        },
        "configurable_props": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ConfigurableProp"
          }
        },
        "description": {
          "type": "string",
          "description": "A description of the component",
          "nullable": true
        },
        "component_type": {
          "type": "string",
          "description": "The type of component (trigger or action)",
          "nullable": true
        },
        "stash": {
          "$ref": "#/components/schemas/ComponentStash"
        },
        "annotations": {
          "$ref": "#/components/schemas/ToolAnnotations"
        }
      }
    },
    "ToolAnnotations": {
      "type": "object",
      "description": "Optional properties describing component behavior",
      "nullable": true,
      "properties": {
        "destructiveHint": {
          "type": "boolean",
          "description": "If true, the component may perform destructive updates to its environment. If false, the component performs only additive updates.",
          "nullable": true
        },
        "idempotentHint": {
          "type": "boolean",
          "description": "If true, calling the component repeatedly with the same arguments will have no additional effect on the its environment.",
          "nullable": true
        },
        "openWorldHint": {
          "type": "boolean",
          "description": "If true, this component may interact with an \u201copen world\u201d of external entities. If false, the component's domain of interaction is closed. For example, the world of a web search component is open, whereas that of a memory component is not.",
          "nullable": true
        },
        "readOnlyHint": {
          "type": "boolean",
          "description": "If true, the component does not modify its environment.",
          "nullable": true
        },
        "title": {
          "type": "string",
          "description": "A human-readable title for the component.",
          "nullable": true
        }
      }
    },
    "ComponentStash": {
      "type": "string",
      "enum": [
        "optional",
        "required"
      ],
      "description": "Indicates if a File Stash ID is optional or required to run the component",
      "nullable": true
    },
    "ComponentType": {
      "type": "string",
      "enum": [
        "trigger",
        "action"
      ],
      "description": "The type of component (trigger or action)"
    },
    "TimerInterval": {
      "type": "object",
      "description": "Timer configuration using interval in seconds",
      "required": [
        "intervalSeconds"
      ],
      "properties": {
        "intervalSeconds": {
          "type": "integer",
          "description": "Interval in seconds for timer execution"
        }
      }
    },
    "TimerCron": {
      "type": "object",
      "description": "Timer configuration using cron expression",
      "required": [
        "cron"
      ],
      "properties": {
        "cron": {
          "type": "string",
          "description": "Cron expression for timer execution"
        }
      }
    },
    "ConfigurablePropBase": {
      "type": "object",
      "description": "A configuration or input field for a component.",
      "required": [
        "name",
        "type"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "When building `configuredProps`, make sure to use this field as the key when setting the prop value"
        },
        "type": {
          "type": "string",
          "enum": [
            "$.airtable.baseId",
            "$.airtable.fieldId",
            "$.airtable.tableId",
            "$.airtable.viewId",
            "$.discord.channel",
            "$.discord.channel[]",
            "$.interface.apphook",
            "$.interface.http",
            "$.interface.timer",
            "$.service.db",
            "alert",
            "any",
            "app",
            "boolean",
            "data_store",
            "dir",
            "http_request",
            "integer",
            "integer[]",
            "object",
            "sql",
            "string",
            "string[]"
          ],
          "x-fern-enum": {
            "$.discord.channel[]": {
              "name": "DiscordChannelArray"
            },
            "integer[]": {
              "name": "IntegerArray"
            },
            "string[]": {
              "name": "StringArray"
            }
          }
        },
        "label": {
          "type": "string",
          "description": "Value to use as an input label. In cases where `type` is \"app\", should load the app via `getApp`, etc. and show `app.name` instead.",
          "nullable": true
        },
        "description": {
          "type": "string",
          "description": "A description of the prop, shown to the user when configuring the component.",
          "nullable": true
        },
        "optional": {
          "type": "boolean",
          "description": "If true, this prop does not need to be specified.",
          "nullable": true
        },
        "disabled": {
          "type": "boolean",
          "description": "If true, this prop will be ignored.",
          "nullable": true
        },
        "readOnly": {
          "type": "boolean",
          "description": "If true, this prop is read-only \u2014 its value is either fixed by the component author (`static`) or the prop is purely informational (e.g. `alert`, `dir`). Connect clients should render it without treating it as a configurable input.",
          "nullable": true
        },
        "hidden": {
          "type": "boolean",
          "description": "If true, should not expose this prop to the user",
          "nullable": true
        },
        "remoteOptions": {
          "type": "boolean",
          "description": "If true, call `configureComponent` for this prop to load remote options. It is safe, and preferred, given a returned list of { label: string; value: any } objects to set the prop value to { __lv: { label: string; value: any } }. This way, on load, you can access label for the value without necessarily reloading these options",
          "nullable": true
        },
        "useQuery": {
          "type": "boolean",
          "description": "If true, calls to `configureComponent` for this prop support receiving a `query` parameter to filter remote options",
          "nullable": true
        },
        "reloadProps": {
          "type": "boolean",
          "description": "If true, after setting a value for this prop, a call to `reloadComponentProps` is required as the component has dynamic configurable props dependent on this one",
          "nullable": true
        },
        "withLabel": {
          "type": "boolean",
          "description": "If true, you must save the configured prop value as a \"label-value\" object which should look like: { __lv: { label: string; value: any } } because the execution needs to access the label",
          "nullable": true
        }
      }
    },
    "ConfigurablePropAlert": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure an alert component",
          "required": [
            "type",
            "content"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "alert"
              ]
            },
            "alertType": {
              "$ref": "#/components/schemas/ConfigurablePropAlertType"
            },
            "content": {
              "type": "string",
              "description": "The content of the alert, which can include HTML or plain text."
            }
          }
        }
      ]
    },
    "ConfigurablePropAlertType": {
      "type": "string",
      "enum": [
        "info",
        "neutral",
        "warning",
        "error"
      ],
      "description": "The severity level of the alert."
    },
    "ConfigurablePropAny": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept any value.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "any"
              ]
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueAny"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropApp": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure an account for a specific app",
          "required": [
            "type",
            "app"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "app"
              ]
            },
            "app": {
              "type": "string",
              "description": "The name slug of the app, e.g. 'github', 'slack', etc. This is used to identify the app for which the account is being configured."
            }
          }
        }
      ]
    },
    "ConfigurablePropBoolean": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept a boolean value.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "boolean"
              ]
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueBoolean"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropTimer": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure a timer interface.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.interface.timer"
              ]
            },
            "static": {
              "$ref": "#/components/schemas/ConfigurablePropTimerStatic"
            },
            "default": {
              "$ref": "#/components/schemas/ConfigurablePropTimerDefault"
            },
            "options": {
              "type": "array",
              "nullable": true,
              "description": "Available timer configuration options",
              "items": {
                "$ref": "#/components/schemas/ConfigurablePropTimerOption"
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropTimerDefault": {
      "nullable": true,
      "description": "Default timer configuration",
      "oneOf": [
        {
          "$ref": "#/components/schemas/TimerInterval"
        },
        {
          "$ref": "#/components/schemas/TimerCron"
        }
      ]
    },
    "ConfigurablePropTimerOption": {
      "nullable": true,
      "description": "Timer configuration options",
      "oneOf": [
        {
          "$ref": "#/components/schemas/TimerInterval"
        },
        {
          "$ref": "#/components/schemas/TimerCron"
        }
      ]
    },
    "ConfigurablePropTimerStatic": {
      "nullable": true,
      "description": "Static timer configuration",
      "oneOf": [
        {
          "$ref": "#/components/schemas/TimerInterval"
        },
        {
          "$ref": "#/components/schemas/TimerCron"
        }
      ]
    },
    "HttpRequestField": {
      "type": "object",
      "description": "A name-value field for HTTP request configuration",
      "required": [
        "name",
        "value"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The field name"
        },
        "value": {
          "type": "string",
          "description": "The field value"
        }
      }
    },
    "HttpRequestAuth": {
      "type": "object",
      "description": "Authentication configuration for HTTP request",
      "nullable": true,
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "basic",
            "bearer",
            "none"
          ],
          "description": "The authentication type"
        },
        "username": {
          "type": "string",
          "nullable": true
        },
        "password": {
          "type": "string",
          "nullable": true
        },
        "token": {
          "type": "string",
          "nullable": true
        }
      }
    },
    "HttpRequestBody": {
      "type": "object",
      "description": "Body configuration for HTTP request",
      "nullable": true,
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "fields",
            "raw"
          ],
          "nullable": true
        },
        "contentType": {
          "type": "string",
          "nullable": true
        },
        "fields": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HttpRequestField"
          },
          "nullable": true
        },
        "mode": {
          "type": "string",
          "enum": [
            "fields",
            "raw"
          ],
          "nullable": true
        },
        "raw": {
          "type": "string",
          "nullable": true
        }
      }
    },
    "HttpRequestConfig": {
      "type": "object",
      "description": "Configuration for an HTTP request prop",
      "nullable": true,
      "properties": {
        "auth": {
          "$ref": "#/components/schemas/HttpRequestAuth"
        },
        "body": {
          "$ref": "#/components/schemas/HttpRequestBody"
        },
        "headers": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HttpRequestField"
          },
          "nullable": true
        },
        "params": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/HttpRequestField"
          },
          "nullable": true
        },
        "tab": {
          "type": "string",
          "nullable": true
        },
        "method": {
          "type": "string",
          "nullable": true
        },
        "url": {
          "type": "string",
          "nullable": true
        }
      }
    },
    "ConfigurablePropApphook": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure an app webhook interface.",
          "required": [
            "type",
            "appProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.interface.apphook"
              ]
            },
            "appProp": {
              "type": "string",
              "description": "The name of the app prop that this apphook depends on"
            },
            "eventNames": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "List of event names to listen for",
              "nullable": true
            },
            "remote": {
              "type": "boolean",
              "description": "Whether this apphook is remote",
              "nullable": true
            },
            "static": {
              "type": "array",
              "items": {},
              "description": "Static configuration for the apphook",
              "nullable": true
            }
          }
        }
      ]
    },
    "ConfigurablePropIntegerArray": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept an array of integers.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "integer[]"
              ]
            },
            "min": {
              "type": "integer",
              "description": "The minimum value for integers in this array",
              "nullable": true
            },
            "max": {
              "type": "integer",
              "description": "The maximum value for integers in this array",
              "nullable": true
            },
            "default": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ConfiguredPropValueInteger"
              },
              "description": "Default array of integers",
              "nullable": true
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              },
              "description": "Available options for the integer array",
              "nullable": true
            }
          }
        }
      ]
    },
    "ConfigurablePropHttp": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure an HTTP interface.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.interface.http"
              ]
            },
            "customResponse": {
              "type": "boolean",
              "description": "Whether this HTTP interface allows custom responses",
              "nullable": true
            }
          }
        }
      ]
    },
    "ConfigurablePropDb": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure a database service.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.service.db"
              ]
            }
          }
        }
      ]
    },
    "ConfigurablePropDataStore": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure a data store for key-value storage.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "data_store"
              ]
            }
          }
        }
      ]
    },
    "ConfigurablePropDir": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to indicate how a component may access File Stash",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "dir"
              ]
            },
            "accessMode": {
              "$ref": "#/components/schemas/ConfigurablePropDirAccessMode"
            },
            "sync": {
              "type": "boolean",
              "description": "If true, the component's /tmp directory is synchronized with File Stash"
            }
          }
        }
      ]
    },
    "ConfigurablePropDirAccessMode": {
      "type": "string",
      "enum": [
        "read",
        "write",
        "read-write"
      ],
      "x-fern-enum": {
        "read-write": {
          "name": "ReadWrite"
        }
      },
      "description": "The mode in which the component may access File Stash"
    },
    "ConfigurablePropHttpRequest": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure an HTTP request with URL, method, headers, params, body, and authentication.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "http_request"
              ]
            },
            "default": {
              "$ref": "#/components/schemas/HttpRequestConfig"
            }
          }
        }
      ]
    },
    "ConfigurablePropSql": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to configure SQL queries.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "sql"
              ]
            },
            "auth": {
              "$ref": "#/components/schemas/ConfigurablePropSqlAuth"
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueSql"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropSqlAuth": {
      "type": "object",
      "properties": {
        "app": {
          "type": "string",
          "description": "The app that provides SQL authentication"
        }
      },
      "nullable": true
    },
    "ConfigurablePropAirtableBaseId": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select an Airtable base.",
          "required": [
            "type",
            "appProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.airtable.baseId"
              ]
            },
            "appProp": {
              "type": "string",
              "description": "The name of the app prop that provides Airtable authentication"
            }
          }
        }
      ]
    },
    "ConfigurablePropAirtableTableId": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select an Airtable table.",
          "required": [
            "type",
            "baseIdProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.airtable.tableId"
              ]
            },
            "baseIdProp": {
              "type": "string",
              "description": "The name of the prop that provides the Airtable base ID"
            }
          }
        }
      ]
    },
    "ConfigurablePropAirtableViewId": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select an Airtable view.",
          "required": [
            "type",
            "tableIdProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.airtable.viewId"
              ]
            },
            "tableIdProp": {
              "type": "string",
              "description": "The name of the prop that provides the Airtable table ID"
            }
          }
        }
      ]
    },
    "ConfigurablePropAirtableFieldId": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select an Airtable field.",
          "required": [
            "type",
            "tableIdProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.airtable.fieldId"
              ]
            },
            "tableIdProp": {
              "type": "string",
              "description": "The name of the prop that provides the Airtable table ID"
            }
          }
        }
      ]
    },
    "ConfigurablePropDiscordChannel": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select a Discord channel.",
          "required": [
            "type",
            "appProp"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.discord.channel"
              ]
            },
            "appProp": {
              "type": "string",
              "description": "The name of the app prop that provides Discord authentication"
            }
          }
        }
      ]
    },
    "ConfigurablePropDiscordChannelArray": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop is used to select multiple Discord channels.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.discord.channel[]"
              ]
            },
            "appProp": {
              "type": "string",
              "description": "The name of the app prop that provides Discord authentication"
            }
          }
        }
      ]
    },
    "ConfigurablePropDiscord": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "For Discord components, this prop can accept a Discord channel ID.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "$.discord.channel"
              ]
            }
          }
        }
      ]
    },
    "ConfigurablePropInteger": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept an integer value.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "integer"
              ]
            },
            "min": {
              "type": "integer",
              "description": "The minimum value for this integer prop.",
              "nullable": true
            },
            "max": {
              "type": "integer",
              "description": "The maximum value for this integer prop.",
              "nullable": true
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueInteger"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              },
              "description": "Available integer options",
              "nullable": true
            }
          }
        }
      ]
    },
    "ConfigurablePropObject": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept a set of key-value pairs.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "object"
              ]
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueObject"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropStringFormat": {
      "type": "string",
      "enum": [
        "file-ref"
      ],
      "x-fern-enum": {
        "file-ref": {
          "name": "FileRef"
        }
      },
      "description": "The format of the string value. `file-ref` indicates a URL of a file or path to a file in the component's /tmp directory.",
      "nullable": true
    },
    "ConfigurablePropString": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept a string value.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "string"
              ]
            },
            "secret": {
              "type": "boolean",
              "description": "If true, this prop is a secret and should not be displayed in plain text.",
              "nullable": true
            },
            "format": {
              "$ref": "#/components/schemas/ConfigurablePropStringFormat"
            },
            "default": {
              "$ref": "#/components/schemas/ConfiguredPropValueString"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurablePropStringArray": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropBase"
        },
        {
          "type": "object",
          "description": "This prop can accept an array of strings.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "string[]"
              ]
            },
            "secret": {
              "type": "boolean",
              "description": "If true, this prop is a secret and should not be displayed in plain text.",
              "nullable": true
            },
            "format": {
              "$ref": "#/components/schemas/ConfigurablePropStringFormat"
            },
            "default": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ConfiguredPropValueString"
              },
              "description": "The default value for this prop",
              "nullable": true
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/PropOption"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionNested"
                  },
                  {
                    "$ref": "#/components/schemas/PropOptionValue"
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "ConfigurableProp": {
      "description": "A configuration or input field for a component. This is a discriminated union based on the type field.",
      "oneOf": [
        {
          "$ref": "#/components/schemas/ConfigurablePropAlert"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropAny"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropApp"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropBoolean"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDataStore"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDir"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropTimer"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropApphook"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropIntegerArray"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropHttp"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropHttpRequest"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDb"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropSql"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropAirtableBaseId"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropAirtableTableId"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropAirtableViewId"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropAirtableFieldId"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDiscordChannel"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDiscordChannelArray"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropDiscord"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropInteger"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropObject"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropString"
        },
        {
          "$ref": "#/components/schemas/ConfigurablePropStringArray"
        }
      ],
      "discriminator": {
        "propertyName": "type",
        "mapping": {
          "alert": "#/components/schemas/ConfigurablePropAlert",
          "any": "#/components/schemas/ConfigurablePropAny",
          "app": "#/components/schemas/ConfigurablePropApp",
          "boolean": "#/components/schemas/ConfigurablePropBoolean",
          "data_store": "#/components/schemas/ConfigurablePropDataStore",
          "dir": "#/components/schemas/ConfigurablePropDir",
          "$.interface.timer": "#/components/schemas/ConfigurablePropTimer",
          "$.interface.apphook": "#/components/schemas/ConfigurablePropApphook",
          "integer[]": "#/components/schemas/ConfigurablePropIntegerArray",
          "$.interface.http": "#/components/schemas/ConfigurablePropHttp",
          "http_request": "#/components/schemas/ConfigurablePropHttpRequest",
          "$.service.db": "#/components/schemas/ConfigurablePropDb",
          "sql": "#/components/schemas/ConfigurablePropSql",
          "$.airtable.baseId": "#/components/schemas/ConfigurablePropAirtableBaseId",
          "$.airtable.tableId": "#/components/schemas/ConfigurablePropAirtableTableId",
          "$.airtable.viewId": "#/components/schemas/ConfigurablePropAirtableViewId",
          "$.airtable.fieldId": "#/components/schemas/ConfigurablePropAirtableFieldId",
          "$.discord.channel": "#/components/schemas/ConfigurablePropDiscordChannel",
          "$.discord.channel[]": "#/components/schemas/ConfigurablePropDiscordChannelArray",
          "integer": "#/components/schemas/ConfigurablePropInteger",
          "object": "#/components/schemas/ConfigurablePropObject",
          "string": "#/components/schemas/ConfigurablePropString",
          "string[]": "#/components/schemas/ConfigurablePropStringArray"
        }
      }
    },
    "ConfiguredPropValueAny": {
      "nullable": false
    },
    "ConfiguredPropValueApp": {
      "type": "object",
      "required": [
        "authProvisionId"
      ],
      "properties": {
        "authProvisionId": {
          "$ref": "#/components/schemas/AccountId"
        }
      }
    },
    "ConfiguredPropValueBoolean": {
      "type": "boolean"
    },
    "ConfiguredPropValueInteger": {
      "type": "number"
    },
    "ConfiguredPropValueObject": {
      "type": "object"
    },
    "ConfiguredPropValueSql": {
      "type": "object",
      "required": [
        "value",
        "query",
        "params",
        "usePreparedStatements"
      ],
      "properties": {
        "value": {
          "type": "string",
          "description": "The raw SQL query, as provided by the user"
        },
        "query": {
          "type": "string",
          "description": "The SQL query to execute"
        },
        "params": {
          "type": "array",
          "description": "The list of parameters for the prepared statement",
          "items": {
            "type": "string"
          }
        },
        "usePreparedStatements": {
          "type": "boolean",
          "description": "Whether to use prepared statements for the query or not"
        }
      }
    },
    "ConfiguredPropValueString": {
      "type": "string"
    },
    "ConfiguredPropValueStringArray": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "ConfiguredProps": {
      "type": "object",
      "description": "The configured properties of the component",
      "additionalProperties": {
        "$ref": "#/components/schemas/ConfiguredPropValue"
      }
    },
    "ConfigurePropOptions": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/PropOption"
          },
          {
            "$ref": "#/components/schemas/PropOptionNested"
          }
        ]
      },
      "description": "Available options (with labels) for the configured prop",
      "nullable": true
    },
    "ConfigurePropOpts": {
      "type": "object",
      "description": "Request options for configuring a component's prop",
      "required": [
        "id",
        "external_user_id",
        "prop_name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The component ID"
        },
        "version": {
          "type": "string",
          "description": "Optional component version (in SemVer format, for example '1.0.0'), defaults to latest",
          "example": "1.2.3",
          "nullable": true
        },
        "external_user_id": {
          "type": "string",
          "description": "The external user ID"
        },
        "prop_name": {
          "type": "string",
          "description": "The name of the prop to configure"
        },
        "blocking": {
          "type": "boolean",
          "description": "Whether this operation should block until completion"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "dynamic_props_id": {
          "type": "string",
          "description": "The ID for dynamic props"
        },
        "page": {
          "type": "number",
          "description": "Page number for paginated results"
        },
        "prev_context": {
          "type": "object",
          "description": "Previous context for pagination"
        },
        "query": {
          "type": "string",
          "description": "Search query for filtering options"
        }
      }
    },
    "ConfigurePropResponse": {
      "type": "object",
      "description": "Response received after configuring a component's prop",
      "properties": {
        "options": {
          "$ref": "#/components/schemas/ConfigurePropOptions"
        },
        "stringOptions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Available options for the configured prop",
          "nullable": true
        },
        "observations": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Observation"
          },
          "nullable": true
        },
        "context": {
          "type": "object",
          "description": "New context after configuring the prop",
          "nullable": true
        },
        "errors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Any errors that occurred during configuration"
        }
      }
    },
    "ConfiguredPropValue": {
      "nullable": false,
      "oneOf": [
        {
          "$ref": "#/components/schemas/ConfiguredPropValueAny"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueApp"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueBoolean"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueInteger"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueObject"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueSql"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueString"
        },
        {
          "$ref": "#/components/schemas/ConfiguredPropValueStringArray"
        }
      ]
    },
    "ConnectToken": {
      "type": "string",
      "pattern": "^ctok_[0-9a-f]{32}$",
      "description": "An authentication token with a limited lifespan"
    },
    "CreateAccountOpts": {
      "type": "object",
      "description": "Request object for creating an account",
      "required": [
        "app_slug",
        "cfmap_json",
        "connect_token"
      ],
      "properties": {
        "app_slug": {
          "type": "string",
          "description": "The app slug for the account"
        },
        "cfmap_json": {
          "type": "string",
          "description": "JSON string containing the custom fields mapping"
        },
        "connect_token": {
          "type": "string",
          "description": "The connect token for authentication"
        },
        "name": {
          "type": "string",
          "description": "Optional name for the account"
        },
        "account_id": {
          "type": "string",
          "description": "An existing account ID to reconnect. When provided, the account's credentials are updated instead of creating a new account. Must belong to the same external user and project environment as the connect token, and match the app identified by app_slug."
        }
      }
    },
    "CreateOAuthTokenOpts": {
      "type": "object",
      "description": "Request object for creating an OAuth token",
      "required": [
        "grant_type",
        "client_id",
        "client_secret"
      ],
      "properties": {
        "grant_type": {
          "type": "string",
          "enum": [
            "client_credentials"
          ]
        },
        "client_id": {
          "type": "string"
        },
        "client_secret": {
          "type": "string"
        },
        "scope": {
          "type": "string",
          "description": "Optional space-separated scopes for the access token. Defaults to `*`."
        }
      }
    },
    "CreateOAuthTokenResponse": {
      "type": "object",
      "description": "Response object for creating an OAuth token",
      "required": [
        "access_token",
        "token_type",
        "expires_in"
      ],
      "properties": {
        "access_token": {
          "type": "string"
        },
        "token_type": {
          "type": "string"
        },
        "expires_in": {
          "type": "integer"
        }
      }
    },
    "CreateTokenOpts": {
      "type": "object",
      "description": "Request object for creating a connect token",
      "required": [
        "external_user_id",
        "project_id"
      ],
      "properties": {
        "allowed_origins": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "List of allowed origins for CORS"
        },
        "error_redirect_uri": {
          "type": "string",
          "description": "URI to redirect to on error"
        },
        "expires_in": {
          "type": "integer",
          "description": "Token TTL in seconds (max 14400 = 4 hours). Defaults to 4 hours if not specified."
        },
        "external_user_id": {
          "type": "string",
          "description": "Your end user ID, for whom you're creating the token"
        },
        "scope": {
          "type": "string",
          "description": "Space-separated scopes to restrict token permissions. Defaults to 'connect:*' if not specified. See https://pipedream.com/docs/connect/api-reference/authentication#connect-token-scopes for more information."
        },
        "success_redirect_uri": {
          "type": "string",
          "description": "URI to redirect to on success"
        },
        "webhook_uri": {
          "type": "string",
          "description": "Webhook URI for notifications"
        },
        "allow_progressive_scopes": {
          "type": "boolean",
          "default": false,
          "description": "When true, end users may authorize a subset of the app's OAuth scopes; only the app's functional scopes (needed for the post-OAuth test request) are enforced. Defaults to false."
        }
      }
    },
    "CreateTokenResponse": {
      "type": "object",
      "description": "Response received after creating a connect token",
      "required": [
        "connect_link_url",
        "expires_at",
        "token"
      ],
      "properties": {
        "connect_link_url": {
          "type": "string",
          "description": "The Connect Link URL"
        },
        "expires_at": {
          "type": "string",
          "format": "date-time",
          "description": "The expiration time of the token in ISO 8601 format"
        },
        "token": {
          "$ref": "#/components/schemas/ConnectToken"
        }
      }
    },
    "DeleteTriggerOpts": {
      "type": "object",
      "description": "Request options for deleting a deployed trigger",
      "properties": {
        "ignore_hook_errors": {
          "type": "boolean",
          "description": "Whether to ignore errors during deactivation hook"
        }
      }
    },
    "DeployedComponent": {
      "type": "object",
      "description": "A deployed component instance",
      "required": [
        "id",
        "created_at",
        "updated_at",
        "active",
        "component_id",
        "configurable_props",
        "configured_props",
        "name",
        "name_slug",
        "owner_id",
        "type"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the deployed component",
          "pattern": "^dc_[a-zA-Z0-9]+$"
        },
        "owner_id": {
          "type": "string",
          "description": "The ID of the owner"
        },
        "component_id": {
          "type": "string",
          "description": "The ID of the component that was deployed"
        },
        "component_key": {
          "type": "string",
          "description": "The component key (name) that was deployed",
          "nullable": true
        },
        "configurable_props": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ConfigurableProp"
          },
          "description": "The configurable properties of the component"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "active": {
          "type": "boolean",
          "description": "Whether the deployed component is active"
        },
        "created_at": {
          "type": "integer",
          "description": "The timestamp when the component was deployed (epoch milliseconds)"
        },
        "updated_at": {
          "type": "integer",
          "description": "The timestamp when the component was last updated (epoch milliseconds)"
        },
        "name": {
          "type": "string",
          "description": "The name of the deployed component"
        },
        "name_slug": {
          "type": "string",
          "description": "The name slug of the deployed component"
        },
        "callback_observations": {
          "description": "Callback observations for the deployed component",
          "nullable": true
        },
        "emit_on_deploy": {
          "type": "boolean",
          "description": "Whether the trigger emits events during the deploy hook execution. When false, the $emit function is disabled during deploy hook execution. Defaults to true.",
          "nullable": false
        },
        "type": {
          "type": "string",
          "description": "The discriminator field",
          "enum": [
            "DeployedComponent"
          ]
        },
        "webhook_signing_key": {
          "type": "string",
          "description": "The webhook signing key. Only returned for OAuth-authenticated requests when `webhook_url` is supplied.",
          "nullable": true
        }
      }
    },
    "DeployTriggerOpts": {
      "type": "object",
      "description": "Request options for deploying a trigger",
      "required": [
        "id",
        "external_user_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The trigger component ID"
        },
        "version": {
          "type": "string",
          "description": "Optional trigger component version (in SemVer format, for example '1.0.0'), defaults to latest",
          "example": "1.2.3",
          "nullable": true
        },
        "external_user_id": {
          "type": "string",
          "description": "The external user ID"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "dynamic_props_id": {
          "type": "string",
          "description": "The ID for dynamic props"
        },
        "workflow_id": {
          "type": "string",
          "pattern": "^p_[a-zA-Z0-9]+",
          "description": "Optional ID of a workflow to receive trigger events"
        },
        "webhook_url": {
          "type": "string",
          "description": "Optional webhook URL to receive trigger events"
        },
        "emit_on_deploy": {
          "type": "boolean",
          "description": "Whether the trigger should emit events during the deploy hook execution. Defaults to true if not specified.",
          "nullable": true
        }
      }
    },
    "DeployTriggerResponse": {
      "type": "object",
      "description": "Response received after deploying a trigger",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/Emitter"
        }
      }
    },
    "DynamicProps": {
      "type": "object",
      "description": "Dynamic properties of a saved component",
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the dynamic prop"
        },
        "configurableProps": {
          "type": "array",
          "description": "The updated configurable properties",
          "items": {
            "$ref": "#/components/schemas/ConfigurableProp"
          }
        }
      }
    },
    "EmittedEvent": {
      "type": "object",
      "description": "An event emitted by a trigger",
      "required": [
        "e",
        "k",
        "ts",
        "id"
      ],
      "properties": {
        "e": {
          "type": "object",
          "description": "The event's payload"
        },
        "k": {
          "type": "string",
          "description": "The event's type (set to 'emit' currently)"
        },
        "ts": {
          "type": "integer",
          "description": "The event's timestamp in epoch milliseconds"
        },
        "id": {
          "type": "string",
          "description": "The event's unique ID"
        }
      }
    },
    "Emitter": {
      "description": "A component/interface that emits events",
      "anyOf": [
        {
          "$ref": "#/components/schemas/DeployedComponent"
        },
        {
          "$ref": "#/components/schemas/HttpInterface"
        },
        {
          "$ref": "#/components/schemas/TimerInterface"
        }
      ],
      "discriminator": {
        "propertyName": "type",
        "mapping": {
          "DeployedComponent": "#/components/schemas/DeployedComponent",
          "HttpInterface": "#/components/schemas/HttpInterface",
          "TimerInterface": "#/components/schemas/TimerInterface"
        }
      }
    },
    "EmitterType": {
      "type": "string",
      "description": "The type of the event emitting interface",
      "enum": [
        "email",
        "http",
        "source",
        "timer"
      ]
    },
    "ErrorResponse": {
      "type": "object",
      "description": "Error response returned by the API in case of an error",
      "required": [
        "error"
      ],
      "properties": {
        "error": {
          "type": "string",
          "description": "The error message"
        },
        "code": {
          "type": "string",
          "description": "The error code"
        },
        "details": {
          "type": "object",
          "description": "Additional error details"
        }
      }
    },
    "ExternalUser": {
      "type": "object",
      "required": [
        "id",
        "external_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The external user's Pipedream ID",
          "example": "exu_abc123"
        },
        "external_id": {
          "type": "string",
          "description": "Your identifier for the external user"
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "GetUsersResponse": {
      "type": "object",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ExternalUser"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "GetAccountsResponse": {
      "type": "object",
      "description": "Response received when retrieving a list of accounts",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Account"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "GetAppResponse": {
      "type": "object",
      "description": "Response received when retrieving a single app",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/App"
        }
      }
    },
    "GetAppCategoryResponse": {
      "$ref": "#/components/schemas/AppCategory"
    },
    "GetAppsResponse": {
      "type": "object",
      "description": "Response received when retrieving a list of apps",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/App"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "GetComponentResponse": {
      "type": "object",
      "description": "Response received when retrieving a specific component",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/Component"
        }
      }
    },
    "GetComponentsResponse": {
      "type": "object",
      "description": "Response received when retrieving a list of components",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Component"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "GetTriggerEventsResponse": {
      "type": "object",
      "description": "Response received when retrieving trigger events",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/EmittedEvent"
          }
        }
      }
    },
    "GetTriggerResponse": {
      "type": "object",
      "description": "Response received when retrieving a deployed trigger",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/Emitter"
        }
      }
    },
    "GetTriggerWebhooksResponse": {
      "type": "object",
      "description": "Response received when retrieving trigger webhooks",
      "required": [
        "webhook_urls"
      ],
      "properties": {
        "webhook_urls": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uri"
          }
        },
        "webhooks": {
          "type": "array",
          "description": "Webhook objects for the configured URLs. `signing_key` is only returned for OAuth-authenticated requests.",
          "items": {
            "$ref": "#/components/schemas/TriggerWebhook"
          }
        }
      }
    },
    "GetTriggerWorkflowsResponse": {
      "type": "object",
      "description": "Response received when retrieving trigger workflows",
      "required": [
        "workflow_ids"
      ],
      "properties": {
        "workflow_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^p_[a-zA-Z0-9]+"
          }
        }
      }
    },
    "GetTriggersResponse": {
      "type": "object",
      "description": "Response received when listing deployed triggers",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Emitter"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "HttpInterface": {
      "type": "object",
      "description": "An HTTP interface instance",
      "required": [
        "id",
        "created_at",
        "updated_at",
        "custom_response",
        "endpoint_url",
        "key",
        "type"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the HTTP interface",
          "pattern": "^hi_[a-zA-Z0-9]+$"
        },
        "key": {
          "type": "string"
        },
        "endpoint_url": {
          "type": "string"
        },
        "custom_response": {
          "type": "boolean"
        },
        "created_at": {
          "type": "integer",
          "description": "The timestamp when the HTTP interface was created (epoch milliseconds)"
        },
        "updated_at": {
          "type": "integer",
          "description": "The timestamp when the HTTP interface was last updated (epoch milliseconds)"
        },
        "type": {
          "type": "string",
          "description": "The discriminator field",
          "enum": [
            "HttpInterface"
          ]
        }
      }
    },
    "ListAccountsResponse": {
      "type": "object",
      "description": "Response received when listing accounts",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Account"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "Project": {
      "type": "object",
      "description": "Project that can be accessed via the Connect API",
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^proj_[0-9A-Za-z]+$",
          "description": "Hash ID for the project"
        },
        "name": {
          "type": "string",
          "description": "Display name of the project"
        },
        "app_name": {
          "type": "string",
          "nullable": true,
          "description": "App name shown to Connect users"
        },
        "support_email": {
          "type": "string",
          "format": "email",
          "nullable": true,
          "description": "Support email configured for the project"
        },
        "connect_require_key_auth_test": {
          "type": "boolean",
          "description": "Send a test request to the upstream API when adding Connect accounts for key-based apps"
        }
      }
    },
    "CreateProjectOpts": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the project"
        },
        "app_name": {
          "type": "string",
          "description": "Display name for the Connect application"
        },
        "support_email": {
          "type": "string",
          "format": "email",
          "description": "Support email displayed to end users"
        },
        "connect_require_key_auth_test": {
          "type": "boolean",
          "description": "Send a test request to the upstream API when adding Connect accounts for key-based apps"
        }
      }
    },
    "UpdateProjectOpts": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Name of the project"
        },
        "app_name": {
          "type": "string",
          "description": "Display name for the Connect application"
        },
        "support_email": {
          "type": "string",
          "format": "email",
          "description": "Support email displayed to end users"
        },
        "connect_require_key_auth_test": {
          "type": "boolean",
          "description": "Send a test request to the upstream API when adding Connect accounts for key-based apps"
        }
      }
    },
    "UpdateProjectLogoOpts": {
      "type": "object",
      "description": "Payload to update a project's logo.",
      "required": [
        "logo"
      ],
      "properties": {
        "logo": {
          "type": "string",
          "format": "byte",
          "description": "Data URI containing the new Base64 encoded image",
          "example": "data:image/png;base64,AAAAAA..."
        }
      }
    },
    "ListProjectsResponse": {
      "type": "object",
      "description": "Response received when listing Connect projects",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Project"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "ListAppsResponse": {
      "type": "object",
      "description": "Response received when listing apps",
      "required": [
        "data",
        "page_info"
      ],
      "properties": {
        "data": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/App"
          }
        },
        "page_info": {
          "$ref": "#/components/schemas/PageInfo"
        }
      }
    },
    "ListAppCategoriesResponse": {
      "type": "array",
      "description": "Response received when listing app categories",
      "items": {
        "$ref": "#/components/schemas/AppCategory"
      }
    },
    "Observation": {
      "type": "object",
      "description": "Any logs produced during the configuration of the prop",
      "required": [
        "k",
        "ts"
      ],
      "properties": {
        "err": {
          "$ref": "#/components/schemas/ObservationError"
        },
        "k": {
          "type": "string",
          "description": "The source of the log (e.g. `console.log`)"
        },
        "msg": {
          "type": "string",
          "description": "The log message"
        },
        "ts": {
          "type": "number",
          "description": "The time at which the log was produced, as milliseconds since the epoch"
        }
      }
    },
    "ObservationError": {
      "type": "object",
      "description": "Details about an observed error message",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the error/exception"
        },
        "message": {
          "type": "string",
          "description": "The error message"
        },
        "stack": {
          "type": "string",
          "description": "The stack trace of the error"
        }
      }
    },
    "PageInfo": {
      "type": "object",
      "properties": {
        "count": {
          "type": "integer",
          "description": "Number of items returned",
          "example": 10
        },
        "total_count": {
          "type": "integer",
          "description": "Total number of items",
          "example": 120
        },
        "start_cursor": {
          "type": "string",
          "description": "Used to fetch the previous page of items",
          "nullable": true
        },
        "end_cursor": {
          "type": "string",
          "description": "Used to fetch the next page of items",
          "nullable": true
        }
      }
    },
    "ProjectEnvironment": {
      "type": "string",
      "description": "The environment in which the server client is running",
      "enum": [
        "development",
        "production"
      ]
    },
    "ProjectInfoResponse": {
      "type": "object",
      "description": "Response received when retrieving project info",
      "required": [
        "apps"
      ],
      "properties": {
        "apps": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ProjectInfoResponseApp"
          },
          "required": [
            "name_slug"
          ]
        }
      }
    },
    "ProjectInfoResponseApp": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "ID of the app. Only applies for OAuth apps.",
          "nullable": true
        },
        "name_slug": {
          "type": "string",
          "description": "The name slug of the target app"
        }
      }
    },
    "PropOption": {
      "type": "object",
      "description": "A configuration option for a component's prop",
      "required": [
        "label",
        "value"
      ],
      "properties": {
        "label": {
          "type": "string",
          "description": "The human-readable label for the option"
        },
        "value": {
          "$ref": "#/components/schemas/PropOptionValue"
        }
      }
    },
    "PropOptionNested": {
      "type": "object",
      "description": "A configuration option for a component's prop (nested under `__lv`)",
      "required": [
        "__lv"
      ],
      "properties": {
        "__lv": {
          "$ref": "#/components/schemas/PropOption"
        }
      }
    },
    "PropOptionValue": {
      "description": "The value of a prop option",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "integer"
        },
        {
          "type": "boolean"
        }
      ],
      "nullable": true
    },
    "ProxyResponse": {
      "description": "The parsed response body from a proxied API request"
    },
    "ProxyResponseBinary": {
      "type": "string",
      "format": "binary",
      "description": "Binary response from the proxied API"
    },
    "ReloadPropsOpts": {
      "type": "object",
      "description": "Request options for reloading a component's props when dealing with dynamic props",
      "required": [
        "id",
        "external_user_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The component ID"
        },
        "version": {
          "type": "string",
          "description": "Optional component version (in SemVer format, for example '1.0.0'), defaults to latest",
          "example": "1.2.3",
          "nullable": true
        },
        "external_user_id": {
          "type": "string",
          "description": "The external user ID"
        },
        "blocking": {
          "type": "boolean",
          "description": "Whether this operation should block until completion"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "dynamic_props_id": {
          "type": "string",
          "description": "The ID for dynamic props"
        }
      }
    },
    "ReloadPropsResponse": {
      "type": "object",
      "description": "Response from reloading component props",
      "properties": {
        "observations": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Observation"
          }
        },
        "errors": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Any errors that occurred during configuration"
        },
        "dynamicProps": {
          "$ref": "#/components/schemas/DynamicProps"
        }
      }
    },
    "RunActionOpts": {
      "type": "object",
      "description": "Request options for running an action",
      "required": [
        "id",
        "external_user_id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The action component ID"
        },
        "version": {
          "type": "string",
          "description": "Optional action component version (in SemVer format, for example '1.0.0'), defaults to latest",
          "example": "1.2.3",
          "nullable": true
        },
        "external_user_id": {
          "type": "string",
          "description": "The external user ID"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "dynamic_props_id": {
          "type": "string",
          "description": "The ID for dynamic props"
        },
        "stash_id": {
          "$ref": "#/components/schemas/RunActionOptsStashId"
        }
      }
    },
    "RunActionOptsStashId": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/StashId"
        },
        {
          "type": "string",
          "enum": [
            "NEW"
          ]
        },
        {
          "type": "boolean"
        }
      ],
      "description": "The ID of the File Stash to use for syncing the action's /tmp directory, or either `true` or 'NEW' to create a new stash",
      "nullable": true
    },
    "RunActionResponse": {
      "type": "object",
      "description": "The response received after running an action. See https://pipedream.com/docs/components/api#returning-data-from-steps for more details.",
      "properties": {
        "exports": {
          "type": "object",
          "additionalProperties": true,
          "description": "The key-value pairs resulting from calls to `$.export`"
        },
        "os": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Observation"
          },
          "description": "Any logs produced during the execution of the action"
        },
        "ret": {
          "description": "The value returned by the action",
          "nullable": true
        },
        "stash_id": {
          "$ref": "#/components/schemas/StashId"
        }
      }
    },
    "StartConnectOpts": {
      "type": "object",
      "description": "Options for starting the connection process",
      "properties": {
        "iframe": {
          "type": "string",
          "description": "ID of the iframe element to use"
        }
      }
    },
    "StashId": {
      "type": "string",
      "description": "The ID of the File Stash",
      "nullable": true
    },
    "TimerInterface": {
      "type": "object",
      "description": "A timer interface instance",
      "required": [
        "id",
        "created_at",
        "updated_at",
        "schedule_changed_at",
        "timezone",
        "type"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the timer interface",
          "pattern": "^ti_[a-zA-Z0-9]+$"
        },
        "interval_seconds": {
          "type": "number"
        },
        "cron": {
          "type": "string"
        },
        "timezone": {
          "type": "string"
        },
        "schedule_changed_at": {
          "type": "integer"
        },
        "created_at": {
          "type": "integer",
          "description": "The timestamp when the timer interface was created (epoch milliseconds)"
        },
        "updated_at": {
          "type": "integer",
          "description": "The timestamp when the timer interface was last updated (epoch milliseconds)"
        },
        "type": {
          "type": "string",
          "description": "The discriminator field",
          "enum": [
            "TimerInterface"
          ]
        }
      }
    },
    "UpdateTriggerOpts": {
      "type": "object",
      "description": "Request options for updating a trigger",
      "properties": {
        "active": {
          "type": "boolean",
          "description": "Whether the trigger should be active"
        },
        "configured_props": {
          "$ref": "#/components/schemas/ConfiguredProps"
        },
        "name": {
          "type": "string",
          "description": "The name of the trigger"
        },
        "emit_on_deploy": {
          "type": "boolean",
          "description": "Whether the trigger should emit events during deployment"
        }
      }
    },
    "UpdateTriggerWebhooksOpts": {
      "type": "object",
      "description": "Request options for updating webhooks that listen to trigger events",
      "required": [
        "webhook_urls"
      ],
      "properties": {
        "webhook_urls": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of webhook URLs to set"
        }
      }
    },
    "UpdateTriggerWorkflowsOpts": {
      "type": "object",
      "description": "Request options for updating workflows that listen to trigger events",
      "required": [
        "workflow_ids"
      ],
      "properties": {
        "workflow_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Array of workflow IDs to set"
        }
      }
    },
    "TriggerWebhook": {
      "type": "object",
      "description": "A trigger webhook object. `signing_key` is only returned for OAuth-authenticated requests.",
      "required": [
        "id",
        "url",
        "signing_key_set"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the webhook"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The webhook URL"
        },
        "signing_key": {
          "type": "string",
          "description": "The webhook signing key, returned only for OAuth-authenticated requests"
        },
        "signing_key_set": {
          "type": "boolean",
          "description": "Whether a signing key has been set for this webhook"
        }
      }
    },
    "Webhook": {
      "type": "object",
      "description": "A webhook object",
      "required": [
        "id",
        "url",
        "signing_key_set",
        "created_at",
        "updated_at"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the webhook"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The webhook URL"
        },
        "signing_key_set": {
          "type": "boolean",
          "description": "Whether a signing key has been set for this webhook"
        },
        "created_at": {
          "type": "integer",
          "description": "The time the webhook was created, in epoch seconds"
        },
        "updated_at": {
          "type": "integer",
          "description": "The time the webhook was last updated, in epoch seconds"
        }
      }
    },
    "WebhookWithOptionalSigningKey": {
      "type": "object",
      "description": "A webhook object that may include the signing key. The signing key is returned when a webhook is created, but omitted when an existing webhook is updated.",
      "required": [
        "id",
        "url",
        "signing_key_set",
        "created_at",
        "updated_at"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the webhook"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The webhook URL"
        },
        "signing_key": {
          "type": "string",
          "description": "The webhook signing key, when returned by the endpoint"
        },
        "signing_key_set": {
          "type": "boolean",
          "description": "Whether a signing key has been set for this webhook"
        },
        "created_at": {
          "type": "integer",
          "description": "The time the webhook was created, in epoch seconds"
        },
        "updated_at": {
          "type": "integer",
          "description": "The time the webhook was last updated, in epoch seconds"
        }
      }
    },
    "WebhookWithSigningKey": {
      "type": "object",
      "description": "A webhook object including the signing key",
      "required": [
        "id",
        "url",
        "signing_key",
        "signing_key_set",
        "created_at",
        "updated_at"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The unique ID of the webhook"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The webhook URL"
        },
        "signing_key": {
          "type": "string",
          "description": "The webhook signing key"
        },
        "signing_key_set": {
          "type": "boolean",
          "description": "Whether a signing key has been set for this webhook"
        },
        "created_at": {
          "type": "integer",
          "description": "The time the webhook was created, in epoch seconds"
        },
        "updated_at": {
          "type": "integer",
          "description": "The time the webhook was last updated, in epoch seconds"
        }
      }
    },
    "GetWebhookResponse": {
      "type": "object",
      "description": "Response received when retrieving a webhook",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "nullable": true,
          "allOf": [
            {
              "$ref": "#/components/schemas/Webhook"
            }
          ]
        }
      }
    },
    "GetWebhookWithSigningKeyResponse": {
      "type": "object",
      "description": "Response received when retrieving a webhook with its signing key",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/WebhookWithSigningKey"
        }
      }
    },
    "SetWebhookResponse": {
      "type": "object",
      "description": "Response received when creating or updating a webhook",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$ref": "#/components/schemas/WebhookWithOptionalSigningKey"
        }
      }
    },
    "SetWebhookOpts": {
      "type": "object",
      "description": "Request options for setting a webhook URL",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "description": "The webhook URL to set"
        }
      }
    },
    "ValidateTokenResponse": {
      "type": "object",
      "description": "Response received when validating a connect token",
      "required": [
        "error",
        "success"
      ],
      "properties": {
        "app": {
          "nullable": true,
          "allOf": [
            {
              "$ref": "#/components/schemas/App"
            }
          ]
        },
        "error": {
          "type": "string",
          "description": "Error message if validation failed",
          "nullable": true
        },
        "error_redirect_uri": {
          "type": "string",
          "description": "URI to redirect to on error",
          "nullable": true
        },
        "oauth_app_id": {
          "type": "string",
          "description": "OAuth app ID if applicable",
          "nullable": true
        },
        "project_app_name": {
          "type": "string",
          "description": "Name of the project app",
          "nullable": true
        },
        "project_environment": {
          "type": "string",
          "description": "Environment of the project",
          "nullable": true
        },
        "project_id": {
          "type": "string",
          "description": "ID of the project",
          "nullable": true
        },
        "project_support_email": {
          "type": "string",
          "description": "Support email for the project",
          "nullable": true
        },
        "success": {
          "type": "boolean",
          "description": "Whether the token validation was successful"
        },
        "success_redirect_uri": {
          "type": "string",
          "description": "URI to redirect to on success",
          "nullable": true
        }
      }
    }
  }
}